diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 2635abfb..2cf097c2 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,53 +1,41 @@ { - "name": "Existing Dockerfile", - - // Sets the run context to one level up instead of the .devcontainer folder. + "name": "opencascade.js (V8)", "context": "..", - - // Update the 'dockerFile' property if you aren't using the standard 'Dockerfile' filename. "dockerFile": "../Dockerfile", - // Set *default* container specific settings.json values on container create. - "settings": { - "terminal.integrated.shell.linux": null + "customizations": { + "vscode": { + "settings": { + "python.defaultInterpreterPath": "/opencascade.js/.venv/bin/python", + "python.analysis.extraPaths": ["/opencascade.js/src"], + "terminal.integrated.defaultProfile.linux": "bash" + }, + "extensions": [ + "ms-vscode.cpptools", + "ms-vscode.cpptools-extension-pack", + "ms-python.python", + "ms-python.vscode-pylance", + "nrwl.angular-console", + "dtsvet.vscode-wasm", + "eamodio.gitlens" + ] + } }, - // Add the IDs of extensions you want installed when the container is created. - "extensions": [ - "ms-vscode.cpptools", - "ms-vscode.cpptools-extension-pack", - "mhutchie.git-graph", - "eamodio.gitlens", - "ms-python.python", - "dtsvet.vscode-wasm" - ], - "mounts": [ "source=${localWorkspaceFolder}/src,target=/opencascade.js/src,type=bind,consistency=cached", - "source=${localWorkspaceFolder}/build,target=/opencascade.js/build,type=bind,consistency=cached", - "source=${localWorkspaceFolder}/builds,target=/opencascade.js/builds,type=bind,consistency=cached", - "source=${localWorkspaceFolder}/dist,target=/opencascade.js/dist,type=bind,consistency=cached", - "source=${localWorkspaceFolder}/test,target=/opencascade.js/test,type=bind,consistency=cached" - // "source=${localWorkspaceFolder}/occt-src,target=/occt/occt-0dc2c37/src,type=bind,consistency=cached", + "source=${localWorkspaceFolder}/build-configs,target=/opencascade.js/build-configs,type=bind,consistency=cached", + "source=${localWorkspaceFolder}/tests,target=/opencascade.js/tests,type=bind,consistency=cached", + "source=${localWorkspaceFolder}/scripts,target=/opencascade.js/scripts,type=bind,consistency=cached", + "source=${localWorkspaceFolder}/build-wasm.sh,target=/opencascade.js/build-wasm.sh,type=bind,consistency=cached", + "source=${localWorkspaceFolder}/bindgen-filters.yaml,target=/opencascade.js/bindgen-filters.yaml,type=bind,consistency=cached", + "source=${localWorkspaceFolder}/DEPS.json,target=/opencascade.js/DEPS.json,type=bind,consistency=cached" ], - // Use 'forwardPorts' to make a list of ports inside the container available locally. - // "forwardPorts": [], - - // Uncomment the next line to run commands after the container is created - for example installing curl. - // "postCreateCommand": "apt-get update && apt-get install -y curl", + "remoteEnv": { + "OCJS_CONFIG": "single-threaded" + } - // Uncomment when using a ptrace-based debugger like C++, Go, and Rust + // Uncomment when using a ptrace-based debugger like C++, Go, or Rust. // "runArgs": [ "--cap-add=SYS_PTRACE", "--security-opt", "seccomp=unconfined" ], - - // Uncomment to use the Docker CLI from inside the container. See https://aka.ms/vscode-remote/samples/docker-from-docker. - // "mounts": [ "source=/var/run/docker.sock,target=/var/run/docker.sock,type=bind" ], - - // Uncomment to connect as a non-root user if you've added one. See https://aka.ms/vscode-remote/containers/non-root. - // "remoteUser": "vscode" - - "build": { - "cacheFrom": "donalffons/opencascade.js:staging-master", - "target": "custom-build-image" - } } diff --git a/.dockerignore b/.dockerignore index d3012846..a3ef6d80 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,5 +1,46 @@ +# Version control and editor metadata +.git +.github +.gitignore +.gitattributes +.vscode +.cursor +.devcontainer + +# Nx / pnpm caches and workspace metadata +.nx +node_modules + +# Python venv and bytecode +.venv +**/__pycache__/ +*.pyc + +# Build outputs and host-side dependency checkouts +deps/ +build/ dist/ -node_modules/ -occt-src/ -**/.git +docker-e2e-output/ +docs-site/ +website/ +tarballs/ +tmp/ +tools/ + +# Prebuilt host-side artifacts left next to YAML configs +# (the docker build re-creates these inside the image; shipping them as +# build context bloats the build-configs/ COPY layer by ~63 MB). +build-configs/opencascade_full.js +build-configs/opencascade_full.d.ts +build-configs/opencascade_full.wasm +build-configs/opencascade_full.js.symbols +build-configs/opencascade_full.provenance.json +build-configs/provenance.json + +# Legacy / pre-V8 directories (excluded so the build context stays minimal) test/ +occt-src/ + +# Packaging artifacts and logs +*.tgz +*.log diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml new file mode 100644 index 00000000..0b0fbf42 --- /dev/null +++ b/.github/workflows/docker.yml @@ -0,0 +1,566 @@ +name: docker + +# Production-readiness blueprint reference: +# docs/research/ocjs-docker-production-readiness-blueprint.md +# +# Two responsibilities: +# +# 1. **Branch DAG** (every push to main/master/occt-v8-*): +# For each published stage (final-single, final-multi, bindgen-base): +# amd64 build (with --load) → e2e gate (20-min warm-link budget) → publish +# :branch-* / :*-branch-* → keyless cosign sign. +# branch-publish starts after setup only (parallel with docker-smoke). +# Pre-publish e2e on single/multi is the publish gate (R13); smoke is +# informational on branch pushes and remains the PR gate for link-filter-poc. +# Branch builds are amd64-only by design (R12) — Apple Silicon reviewers +# pay the Rosetta tax on branch tags; release tags carry the full +# multi-arch manifest list. +# +# 2. **Release DAG** (annotated git tags matching `v*`): +# For each (stage, arch) ∈ {final-single, final-multi, bindgen-base} × +# {amd64, arm64}: +# build with `outputs=type=image,push-by-digest=true` → smoke → e2e gate +# (20-min warm-link budget) → upload digest. +# Then for each stage: +# manifest-list assembly → keyless cosign sign of the manifest-list +# digest (one signature verifies regardless of which arch the consumer +# pulls). +# Post-publish smoke pulls the manifest list and re-runs the link-filter +# PoC to confirm the published artefact is functional. +# +# Cache strategy (R5): registry-backed cache (`type=registry,ref=…:buildcache- +# -`) — GHA cache backend's 10 GB limit cannot accommodate the +# scopes we need (~40 GB combined). Scopes are partitioned by arch + stage so +# the two architectures and three stages don't poison each other's cache hits. +# cache-from on all build steps (warm reads); cache-to only on push steps after +# the e2e gate passes (trusted writes). PR smoke has cache-from only — no PR +# can poison buildcache-* tags. GHCR package must grant this repo Write under +# Manage Actions access (packages: write in YAML is not sufficient alone). +# +# Disk: free-disk-space (`jlumbroso/free-disk-space@main`) reclaims ~30-40 GB +# on the GHA runner before BuildKit starts — without it, the compiled-* +# stages OOM the runner's 14 GB ext4 partition during link. + +on: + push: + branches: + - main + - master + - 'occt-v8-*' + tags: + - 'v*' + pull_request: + branches: + - main + - master + - 'occt-v8-*' + workflow_dispatch: + +permissions: + contents: read + +env: + REGISTRY_IMAGE: ghcr.io/taucad/opencascade.js + # GitHub Actions Node 20 deprecation (2026-09): opt into Node 24 for action runtimes. + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + # ─────────────────────────────────────────────────────────────────────────── + # Setup + # ─────────────────────────────────────────────────────────────────────────── + setup: + name: docker · setup · derive branch slug + DAG selector + runs-on: ubuntu-latest + outputs: + is_release: ${{ steps.derive.outputs.is_release }} + is_branch_push: ${{ steps.derive.outputs.is_branch_push }} + is_pr: ${{ steps.derive.outputs.is_pr }} + branch_slug: ${{ steps.derive.outputs.branch_slug }} + steps: + - name: Derive DAG selector + sanitized branch slug + id: derive + env: + REF: ${{ github.ref }} + REF_NAME: ${{ github.ref_name }} + EVENT: ${{ github.event_name }} + run: | + set -euo pipefail + if [[ "$REF" == refs/tags/v* ]]; then + echo "is_release=true" >> "$GITHUB_OUTPUT" + echo "is_branch_push=false" >> "$GITHUB_OUTPUT" + echo "is_pr=false" >> "$GITHUB_OUTPUT" + elif [[ "$EVENT" == "pull_request" ]]; then + echo "is_release=false" >> "$GITHUB_OUTPUT" + echo "is_branch_push=false" >> "$GITHUB_OUTPUT" + echo "is_pr=true" >> "$GITHUB_OUTPUT" + else + echo "is_release=false" >> "$GITHUB_OUTPUT" + echo "is_branch_push=true" >> "$GITHUB_OUTPUT" + echo "is_pr=false" >> "$GITHUB_OUTPUT" + fi + # GHCR tags cannot contain '/' — replace with '-' (e.g. occt-v8-2026-05 stays unchanged; + # feature/x-y becomes feature-x-y). + slug=$(printf '%s' "$REF_NAME" | tr '/' '-') + echo "branch_slug=$slug" >> "$GITHUB_OUTPUT" + + # ─────────────────────────────────────────────────────────────────────────── + # Smoke (PR + branch push) — link-filter-poc trim gate + YAML validate. + # Runs parallel with branch-publish on branch pushes (no needs edge). + # On pull_request, smoke is the sole docker compile gate before merge. + # ─────────────────────────────────────────────────────────────────────────── + docker-smoke: + name: docker · smoke · build + link-filter-poc + needs: setup + runs-on: ubuntu-latest + timeout-minutes: 360 + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Free disk space (reclaim ~30-40 GB) + uses: jlumbroso/free-disk-space@main + with: + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: false + swap-storage: false + tool-cache: false + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.11.1 + + - name: Log in to GHCR (for registry cache reads) + if: github.event_name != 'pull_request' + uses: docker/login-action@v3.4.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Build :bindgen-base + final-single (smoke target, --load) + uses: docker/build-push-action@v6.18.0 + with: + context: . + target: final-single + tags: ocjs:ci + load: true + cache-from: type=registry,ref=ghcr.io/taucad/opencascade.js:buildcache-amd64-final-single + provenance: false + sbom: false + + - name: Validate full.yml schema (no build) + run: docker run --rm ocjs:ci validate /opencascade.js/build-configs/full.yml + + - name: Validate link-filter-poc.yml schema + run: docker run --rm ocjs:ci validate /opencascade.js/build-configs/link-filter-poc.yml + + - name: Smoke-link link-filter-poc.yml (22 symbols) + run: | + mkdir -p "$PWD/smoke-output" + docker run --rm \ + -u "$(id -u):$(id -g)" \ + -e OCJS_CONFIG=debug \ + -v "$PWD/smoke-output:/src" \ + -v "$PWD/build-configs/link-filter-poc.yml:/src/build-config.yml:ro" \ + ocjs:ci link build-config.yml + + - name: Assert smoke artefacts present + run: | + set -euo pipefail + missing=0 + for ext in wasm js d.ts js.symbols build-manifest.json provenance.json; do + f="$PWD/smoke-output/opencascade_linkfilter_poc.${ext}" + if [ ! -f "$f" ]; then + echo "::error::Missing $f" + missing=1 + else + echo "::notice::$(basename "$f") ($(stat -c%s "$f") bytes)" + fi + done + if [ "$missing" -ne 0 ]; then exit 1; fi + + - name: Assert link-filter-poc NCollection trim filter ratio + run: | + set -euo pipefail + python3 scripts/docker-ncollection-check.py trim "$PWD/smoke-output/opencascade_linkfilter_poc.provenance.json" + + - name: Upload smoke artefacts + if: always() + uses: actions/upload-artifact@v4.6.2 + with: + name: link-filter-poc-output + path: smoke-output/ + if-no-files-found: warn + retention-days: 7 + + # ─────────────────────────────────────────────────────────────────────────── + # Branch DAG — fires on push to main/master/occt-v8-* (R12) + # Build each published stage on amd64-only, gate on e2e, publish as + # :*-branch--, then keyless-sign with cosign. + # ─────────────────────────────────────────────────────────────────────────── + branch-publish: + name: docker · branch · ${{ matrix.stage }} + if: needs.setup.outputs.is_branch_push == 'true' + needs: [setup] + runs-on: ubuntu-latest + timeout-minutes: 360 + permissions: + contents: read + packages: write + id-token: write + strategy: + fail-fast: false + matrix: + include: + - stage: final-single + tag_prefix: branch + e2e_build_config: build-configs/full.yml + - stage: final-multi + tag_prefix: multi-threaded-branch + e2e_build_config: build-configs/full_multi.yml + - stage: bindgen-base + tag_prefix: bindgen-base-branch + e2e_build_config: build-configs/full.yml + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Free disk space (reclaim ~30-40 GB) + uses: jlumbroso/free-disk-space@main + with: + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: false + swap-storage: false + tool-cache: false + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.11.1 + + - name: Log in to GHCR + uses: docker/login-action@v3.4.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Install cosign + uses: sigstore/cosign-installer@v3.8.2 + + - name: Compute image metadata (labels) + id: meta + uses: docker/metadata-action@v5.7.0 + with: + images: ${{ env.REGISTRY_IMAGE }} + + # load: true uses the docker exporter — incompatible with provenance/sbom + # attestations (manifest-list export). Attestations are enabled on push. + - name: Build ${{ matrix.stage }} (amd64, --load for e2e gate) + id: build + uses: docker/build-push-action@v6.18.0 + with: + context: . + target: ${{ matrix.stage }} + platforms: linux/amd64 + load: true + tags: ocjs:e2e + labels: ${{ steps.meta.outputs.labels }} + build-args: | + REVISION=${{ github.sha }} + VERSION=branch-${{ needs.setup.outputs.branch_slug }} + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-amd64-${{ matrix.stage }} + # cache-to omitted: written only on push step after e2e gate passes + provenance: false + sbom: false + + - name: E2E gate — warm-link budget (20 min) + env: + OCJS_E2E_IMAGE: ocjs:e2e + OCJS_E2E_STAGE: ${{ matrix.stage }} + OCJS_E2E_BUILD_CONFIG: ${{ matrix.e2e_build_config }} + WARM_BUDGET_S: 1200 + run: | + set -euo pipefail + chmod +x scripts/docker-e2e-validate.sh + scripts/docker-e2e-validate.sh + + - name: Build + push ${{ matrix.stage }} to GHCR + id: push + uses: docker/build-push-action@v6.18.0 + with: + context: . + target: ${{ matrix.stage }} + platforms: linux/amd64 + push: true + tags: | + ${{ env.REGISTRY_IMAGE }}:${{ matrix.tag_prefix }}-${{ needs.setup.outputs.branch_slug }} + ${{ env.REGISTRY_IMAGE }}:${{ matrix.tag_prefix }}-${{ needs.setup.outputs.branch_slug }}-${{ github.sha }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + REVISION=${{ github.sha }} + VERSION=branch-${{ needs.setup.outputs.branch_slug }} + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-amd64-${{ matrix.stage }} + cache-to: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-amd64-${{ matrix.stage }},mode=max + provenance: true + sbom: true + + - name: Cosign sign published branch image (keyless) + env: + DIGEST: ${{ steps.push.outputs.digest }} + run: | + set -euo pipefail + cosign sign --yes \ + "${REGISTRY_IMAGE}:${{ matrix.tag_prefix }}-${{ needs.setup.outputs.branch_slug }}@${DIGEST}" + cosign sign --yes \ + "${REGISTRY_IMAGE}:${{ matrix.tag_prefix }}-${{ needs.setup.outputs.branch_slug }}-${{ github.sha }}@${DIGEST}" + + # ─────────────────────────────────────────────────────────────────────────── + # Release DAG — fires on annotated `v*` tag push (R7, R9, R12, R13) + # Per (stage × arch) build + e2e gate → manifest-list assembly → cosign + # sign manifest-list digest → post-publish smoke. + # ─────────────────────────────────────────────────────────────────────────── + release-build: + name: docker · release · ${{ matrix.stage }} · ${{ matrix.arch }} + if: needs.setup.outputs.is_release == 'true' + needs: [setup, docker-smoke] + runs-on: ${{ matrix.runner }} + timeout-minutes: 360 + permissions: + contents: read + packages: write + strategy: + fail-fast: false + matrix: + stage: [final-single, final-multi, bindgen-base] + arch: [amd64, arm64] + include: + - arch: amd64 + runner: ubuntu-latest + platform: linux/amd64 + - arch: arm64 + runner: ubuntu-24.04-arm + platform: linux/arm64 + - stage: final-single + e2e_build_config: build-configs/full.yml + - stage: final-multi + e2e_build_config: build-configs/full_multi.yml + - stage: bindgen-base + e2e_build_config: build-configs/full.yml + steps: + - name: Checkout + uses: actions/checkout@v6 + + - name: Free disk space (reclaim ~30-40 GB) + uses: jlumbroso/free-disk-space@main + with: + android: true + dotnet: true + haskell: true + large-packages: false + docker-images: false + swap-storage: false + tool-cache: false + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.11.1 + + - name: Log in to GHCR + uses: docker/login-action@v3.4.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Compute image metadata (labels only) + id: meta + uses: docker/metadata-action@v5.7.0 + with: + images: ${{ env.REGISTRY_IMAGE }} + + # load: true uses the docker exporter — incompatible with provenance/sbom + # attestations (manifest-list export). Attestations are enabled on push. + - name: Build ${{ matrix.stage }} (${{ matrix.arch }}, --load for e2e gate) + uses: docker/build-push-action@v6.18.0 + with: + context: . + target: ${{ matrix.stage }} + platforms: ${{ matrix.platform }} + load: true + tags: ocjs:e2e + labels: ${{ steps.meta.outputs.labels }} + build-args: | + REVISION=${{ github.sha }} + VERSION=${{ steps.meta.outputs.version }} + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-${{ matrix.arch }}-${{ matrix.stage }} + # cache-to omitted: written only on push step after e2e gate passes + provenance: false + sbom: false + + - name: E2E gate — warm-link budget (20 min) + env: + OCJS_E2E_IMAGE: ocjs:e2e + OCJS_E2E_STAGE: ${{ matrix.stage }} + OCJS_E2E_BUILD_CONFIG: ${{ matrix.e2e_build_config }} + WARM_BUDGET_S: 1200 + run: | + set -euo pipefail + chmod +x scripts/docker-e2e-validate.sh + scripts/docker-e2e-validate.sh + + - name: Build + push by digest + id: push + uses: docker/build-push-action@v6.18.0 + with: + context: . + target: ${{ matrix.stage }} + platforms: ${{ matrix.platform }} + labels: ${{ steps.meta.outputs.labels }} + build-args: | + REVISION=${{ github.sha }} + VERSION=${{ steps.meta.outputs.version }} + outputs: type=image,name=${{ env.REGISTRY_IMAGE }},push-by-digest=true,name-canonical=true,push=true + cache-from: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-${{ matrix.arch }}-${{ matrix.stage }} + cache-to: type=registry,ref=${{ env.REGISTRY_IMAGE }}:buildcache-${{ matrix.arch }}-${{ matrix.stage }},mode=max + provenance: true + sbom: true + + - name: Export digest + env: + DIGEST: ${{ steps.push.outputs.digest }} + run: | + set -euo pipefail + mkdir -p "${{ runner.temp }}/digests" + touch "${{ runner.temp }}/digests/${DIGEST#sha256:}" + + - name: Upload digest + uses: actions/upload-artifact@v4.6.2 + with: + name: digests-${{ matrix.stage }}-${{ matrix.arch }} + path: ${{ runner.temp }}/digests/* + if-no-files-found: error + retention-days: 1 + + release-manifest: + name: docker · release · manifest · ${{ matrix.stage }} + if: needs.setup.outputs.is_release == 'true' + needs: [setup, release-build] + runs-on: ubuntu-latest + permissions: + contents: read + packages: write + id-token: write + strategy: + fail-fast: false + matrix: + include: + - stage: final-single + tag_suffix: single-threaded + - stage: final-multi + tag_suffix: multi-threaded + - stage: bindgen-base + tag_suffix: bindgen-base + steps: + - name: Download digests (${{ matrix.stage }} × all arches) + uses: actions/download-artifact@v4.3.0 + with: + path: ${{ runner.temp }}/digests + pattern: digests-${{ matrix.stage }}-* + merge-multiple: true + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3.11.1 + + - name: Log in to GHCR + uses: docker/login-action@v3.4.0 + with: + registry: ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + + - name: Install cosign + uses: sigstore/cosign-installer@v3.8.2 + + - name: Compute release tags for ${{ matrix.tag_suffix }} + id: meta + uses: docker/metadata-action@v5.7.0 + with: + images: ${{ env.REGISTRY_IMAGE }} + # No :latest, no :beta, no :rolling — only versioned + base tags + # (single-threaded / multi-threaded / bindgen-base) and the matching + # version-suffixed pair. See blueprint Recommendations Trade-offs. + tags: | + type=raw,value=${{ matrix.tag_suffix }} + type=semver,pattern={{version}}-${{ matrix.tag_suffix }} + type=semver,pattern={{major}}.{{minor}}-${{ matrix.tag_suffix }} + type=sha,prefix=sha-,suffix=-${{ matrix.tag_suffix }},format=short + + - name: Assemble manifest list and push + working-directory: ${{ runner.temp }}/digests + env: + REGISTRY_IMAGE: ${{ env.REGISTRY_IMAGE }} + run: | + set -euo pipefail + # Word splitting is intentional below: both jq/printf substitutions + # expand into multiple CLI args (`-t tag1 -t tag2 …` and + # `image@sha256:a image@sha256:b`). This is the documented pattern + # from https://docs.docker.com/build/ci/github-actions/multi-platform/ + # shellcheck disable=SC2046 + docker buildx imagetools create \ + $(jq -cr '.tags | map("-t " + .) | join(" ")' <<< "$DOCKER_METADATA_OUTPUT_JSON") \ + $(printf "${REGISTRY_IMAGE}@sha256:%s " *) + + - name: Read manifest-list digest (for cosign signing) + id: index_digest + env: + REGISTRY_IMAGE: ${{ env.REGISTRY_IMAGE }} + PRIMARY_TAG: ${{ matrix.tag_suffix }} + run: | + set -euo pipefail + # `buildx imagetools inspect --raw` prints the manifest-list bytes; + # we sha256 those bytes to get the canonical digest. This is the + # same digest cosign would compute, so the signature pins the + # exact published manifest list. + digest=$(docker buildx imagetools inspect "${REGISTRY_IMAGE}:${PRIMARY_TAG}" --format '{{json .Manifest}}' | jq -r '.digest') + if [ -z "$digest" ] || [ "$digest" = "null" ]; then + echo "::error::Failed to resolve manifest-list digest for ${REGISTRY_IMAGE}:${PRIMARY_TAG}" + exit 1 + fi + echo "digest=$digest" >> "$GITHUB_OUTPUT" + + - name: Cosign sign manifest-list digest (keyless, R16) + env: + DIGEST: ${{ steps.index_digest.outputs.digest }} + REGISTRY_IMAGE: ${{ env.REGISTRY_IMAGE }} + PRIMARY_TAG: ${{ matrix.tag_suffix }} + run: | + set -euo pipefail + # Signing the manifest-list digest (rather than per-arch image + # digests) produces ONE signature that verifies regardless of which + # arch the consumer pulls. cosign 2.x automatically recognises and + # signs the OCI image index. + cosign sign --yes "${REGISTRY_IMAGE}@${DIGEST}" + + - name: Checkout (for post-publish link-filter-poc config) + if: matrix.stage == 'final-single' + uses: actions/checkout@v6 + + - name: Post-publish smoke — pull + link-filter-poc + if: matrix.stage == 'final-single' + run: | + set -euo pipefail + docker pull "${REGISTRY_IMAGE}:${{ matrix.tag_suffix }}" + mkdir -p "$PWD/post-publish-output" + docker run --rm \ + -u "$(id -u):$(id -g)" \ + -e OCJS_CONFIG=debug \ + -v "$PWD/post-publish-output:/src" \ + -v "$PWD/build-configs/link-filter-poc.yml:/src/build-config.yml:ro" \ + "${REGISTRY_IMAGE}:${{ matrix.tag_suffix }}" \ + link build-config.yml + test -s "$PWD/post-publish-output/opencascade_linkfilter_poc.wasm" + env: + REGISTRY_IMAGE: ${{ env.REGISTRY_IMAGE }} diff --git a/.github/workflows/docs-site.yml b/.github/workflows/docs-site.yml new file mode 100644 index 00000000..4b86b0a0 --- /dev/null +++ b/.github/workflows/docs-site.yml @@ -0,0 +1,76 @@ +name: docs-site + +on: + push: + branches: [master] + paths: + - 'docs-site/**' + - '.github/workflows/docs-site.yml' + pull_request: + paths: + - 'docs-site/**' + - '.github/workflows/docs-site.yml' + +permissions: + contents: read + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + +jobs: + build: + name: Typecheck, lint, test, build + runs-on: ubuntu-latest + defaults: + run: + working-directory: docs-site + steps: + - uses: actions/checkout@v6 + + - uses: pnpm/action-setup@v4 + with: + version: 9 + + - uses: actions/setup-node@v5 + with: + node-version: '22' + cache: 'pnpm' + cache-dependency-path: docs-site/pnpm-lock.yaml + + - name: Install dependencies + run: pnpm install --frozen-lockfile + + - name: Typecheck + run: pnpm typecheck + + - name: Lint + run: pnpm lint + + - name: Test + run: pnpm test --run + + - name: Vale anti-slop + uses: errata-ai/vale-action@reviewdog + with: + version: 3.9.1 + files: docs-site/content/docs + fail_on_error: true + + - name: Build + run: pnpm build + + - name: Verify llms.txt was generated + run: | + set -euo pipefail + for path in \ + .next/server/app/llms.txt.body \ + .next/server/app/llms.txt/route.js \ + ; do + if [ -e "$path" ]; then + echo "Found generated artifact: $path" + exit 0 + fi + done + echo "Could not find llms.txt build output" + ls -la .next/server/app || true + exit 1 diff --git a/.github/workflows/ghcr-retention.yml b/.github/workflows/ghcr-retention.yml new file mode 100644 index 00000000..ad1bceae --- /dev/null +++ b/.github/workflows/ghcr-retention.yml @@ -0,0 +1,84 @@ +name: ghcr-retention + +# Production-readiness blueprint reference: +# docs/research/ocjs-docker-production-readiness-blueprint.md +# +# Nightly enforcement of the GHCR retention policy: +# +# - Branch tags (`:branch-*`, `:multi-threaded-branch-*`, `:bindgen-base-branch-*`): +# 7 days retention; keep the 5 most recent versions per branch tag prefix. +# - Release tags (`:single-threaded`, `:multi-threaded`, `:bindgen-base`, +# versioned variants, `:sha-*`): retained indefinitely — NOT touched here. +# - Build cache (`:buildcache-*`): 14 days retention; rebuilds on cache miss +# are bounded by R10 in-RUN pruning so a stale cache is not disastrous. +# +# Implementation note (R15): `actions/delete-package-versions@v5` is the +# GitHub-blessed retention action; it queries the package's version list and +# deletes by version ID. We invoke it once per tag-prefix family because the +# action's `package-version-ids` / `min-versions-to-keep` semantics work +# per-package, not per-tag-prefix. + +on: + schedule: + # 03:17 UTC nightly — off the GitHub Actions peak-load hour boundary + # (XX:00 / XX:30) so jobs queue faster. + - cron: '17 3 * * *' + workflow_dispatch: + +permissions: + packages: write + +env: + FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true + PACKAGE_NAME: opencascade.js + PACKAGE_TYPE: container + PACKAGE_OWNER: taucad + +jobs: + prune-branch-tags: + name: Prune branch tags older than 7 days + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + tag_pattern: + - 'branch-*' + - 'multi-threaded-branch-*' + - 'bindgen-base-branch-*' + steps: + - name: Delete versions older than 7 days matching ${{ matrix.tag_pattern }} + uses: actions/delete-package-versions@v5.0.0 + with: + package-name: ${{ env.PACKAGE_NAME }} + package-type: ${{ env.PACKAGE_TYPE }} + owner: ${{ env.PACKAGE_OWNER }} + # Keep the 5 most recent versions per family; older eligible + # versions get reaped. Tagged-only filter avoids deleting untagged + # builds that are still referenced by manifest lists. + min-versions-to-keep: 5 + delete-only-pre-release-versions: 'false' + delete-only-untagged-versions: 'false' + ignore-versions: '^(?!${{ matrix.tag_pattern }}).*$' + + prune-buildcache: + name: Prune build-cache tags older than 14 days + runs-on: ubuntu-latest + steps: + - name: Delete buildcache-* versions older than 14 days + uses: actions/delete-package-versions@v5.0.0 + with: + package-name: ${{ env.PACKAGE_NAME }} + package-type: ${{ env.PACKAGE_TYPE }} + owner: ${{ env.PACKAGE_OWNER }} + # Keep the 4 most recent buildcache scopes — one per + # (arch × stage) pairing in the active hot path: + # buildcache-amd64-final-single + # buildcache-amd64-final-multi + # buildcache-arm64-final-single + # buildcache-arm64-final-multi + # Other (stage × arch) pairs (bindgen-base × arm64, etc.) are + # rebuilt on demand from BuildKit content addressing. + min-versions-to-keep: 4 + delete-only-pre-release-versions: 'false' + delete-only-untagged-versions: 'false' + ignore-versions: '^(?!buildcache-).*$' diff --git a/.gitignore b/.gitignore index 2d1cb89a..22ce055c 100644 --- a/.gitignore +++ b/.gitignore @@ -1,7 +1,67 @@ /build/* +/tools/ __pycache__ *.pyc node_modules build-output.log pull-stages-output.log /occt-src/ + +# Build artifacts (output of build-wasm.sh placed alongside YAML configs) +*.wasm +*.wasm.symbols +*.js.symbols +/cache/ +build-configs/*.js +build-configs/*.d.ts +build-configs/provenance.json +build-configs/*.provenance.json +build-configs/*.build-manifest.json + +# Experiments — keep sources, ignore regenerated build outputs and bench results +experiments/**/dist-*/ +experiments/**/build-config/dist/ +experiments/**/results/ +experiments/**/results-*.json +experiments/**/results.json +experiments/**/reports/*.json +experiments/**/profiles/*.cpuprofile +experiments/option-d-boundary-narrowing/experiment.d.ts +experiments/option-d-comprehensive-poc/experiment.d.ts + +# Stray build/smoke/docker logs left in the repo root (regeneration + smoke runs) +/build-*.log +/smoke-*.log +/docker-*.log +/regression.log + +# Nx +.nx/ + +# Docs viewer API data (output of `nx run ocjs:docs`). +# +# index.json + the per-package ____.json shards ARE +# committed: the docs-site deploys to Vercel as a standalone pnpm workspace from +# a fresh git clone, and the data cannot be regenerated there (generate-docs.mjs +# needs the full build/bindings type-graph from the WASM `generate` step, which +# is not in the published npm package). They are deploy inputs, not throwaway +# artifacts. Only the files below are derived from index.json by the docs-site +# `prebuild` (generate-api-data.mjs) and stay ignored. +docs-site/data/api-tree.json +docs-site/data/api-type-index.json +docs-site/data/api-search-index.json +/nx-build-*.log + +# Project-local Python (scripts/clone-deps.sh) +/.venv/ + +# Self-contained dependencies (Phase 2) +/deps/ + +# Build output +/dist/ + +# Docker build-flow test scratch (per-test workdirs + manual trial dir) +/tests/docker/.work/ +/tests/docker/.trial/ +.vercel diff --git a/.npmignore b/.npmignore index 9c342f8f..20741f20 100644 --- a/.npmignore +++ b/.npmignore @@ -1,19 +1,9 @@ -TODO.md -.dockerignore -Dockerfile -README.md -build-output.log -pull-stages-output.log -runAction.sh -/src/ -/images/ -/doc/ -/build/ -/.vscode/ -/.github/ -/.devcontainer/ -/test/ -/website/ -/typedoc-reference-docs/ -/builds/ -CHANGELOG.md \ No newline at end of file +# Everything except dist/ is excluded via "files" in package.json. +# This .npmignore serves as a safety net. + +* +!dist/ +!dist/** +!LICENSE +!README.md +!package.json diff --git a/.nvmrc b/.nvmrc new file mode 100644 index 00000000..21651351 --- /dev/null +++ b/.nvmrc @@ -0,0 +1 @@ +24.10.0 diff --git a/.python-version b/.python-version new file mode 100644 index 00000000..0104088a --- /dev/null +++ b/.python-version @@ -0,0 +1 @@ +3.14.4 diff --git a/.vscode/launch.json b/.vscode/launch.json index df922dcb..e7a667d1 100644 --- a/.vscode/launch.json +++ b/.vscode/launch.json @@ -1,75 +1,63 @@ { - // 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", + "inputs": [ + { + "id": "yamlPath", + "type": "promptString", + "description": "Path to a YAML build config (e.g. build-configs/full.yml)", + "default": "build-configs/link-filter-poc.yml" + } + ], "configurations": [ { - "name": "Step 1: Apply Patches", - "type": "python", - "python": "/usr/bin/python3", + "name": "ocjs_bindgen: generate (Embind .cpp + .d.ts.json)", + "type": "debugpy", "request": "launch", - "program": "${workspaceFolder}/src/applyPatches.py", + "module": "ocjs_bindgen", + "python": "${workspaceFolder}/.venv/bin/python", + "cwd": "${workspaceFolder}", + "args": ["--config", "bindgen-filters.yaml"], "console": "integratedTerminal", + "justMyCode": false }, { - "name": "Step 2: Compile OCCT Sources to .o files", - "type": "python", - "python": "/usr/bin/python3", + "name": "ocjs_bindgen.link.yaml_build: link", + "type": "debugpy", "request": "launch", - "program": "${workspaceFolder}/src/compileSources.py", - "args": [ - "single-threaded" - ], + "module": "ocjs_bindgen.link.yaml_build", + "python": "${workspaceFolder}/.venv/bin/python", + "cwd": "${workspaceFolder}", + "args": ["${input:yamlPath}"], "console": "integratedTerminal", + "justMyCode": false }, { - "name": "Step 3: Generate bindings (Embind .cpp files + typescript definitions) from OCCT headers", - "type": "python", - "python": "/usr/bin/python3", + "name": "extract-docs", + "type": "debugpy", "request": "launch", - "program": "${workspaceFolder}/src/generateBindings.py", + "program": "${workspaceFolder}/src/extract-docs.py", + "python": "${workspaceFolder}/.venv/bin/python", + "cwd": "${workspaceFolder}", "console": "integratedTerminal", + "justMyCode": false }, { - "name": "Step 4: Compile Embind .cpp files to .o files", - "type": "python", - "python": "/usr/bin/python3", + "name": "compileBindings (single-threaded)", + "type": "debugpy", "request": "launch", "program": "${workspaceFolder}/src/compileBindings.py", - "args": [ - "single-threaded" - ], + "python": "${workspaceFolder}/.venv/bin/python", + "cwd": "${workspaceFolder}", + "args": ["single-threaded"], "console": "integratedTerminal", + "justMyCode": false }, { - "name": "Step 5: Create build: opencascade.full.yml", - "type": "python", - "python": "/usr/bin/python3", + "name": "build-wasm.sh full ", + "type": "node-terminal", "request": "launch", - "program": "${workspaceFolder}/src/buildFromYaml.py", - "console": "integratedTerminal", - "cwd": "${workspaceFolder}/dist", - "args": [ - "/opencascade.js/builds/opencascade.full.yml" - ] - }, - { - "name": "Debug Tests", - "type": "node", - "request": "launch", - "runtimeArgs": [ - "--inspect-brk", - "${workspaceRoot}/test/node_modules/.bin/jest", - "--runInBand" - ], - "console": "integratedTerminal", - "internalConsoleOptions": "neverOpen", - "port": 9229, - "cwd": "${workspaceFolder}/test", - "env": { - "NODE_OPTIONS": "--experimental-vm-modules" - } + "command": "./build-wasm.sh full ${input:yamlPath}", + "cwd": "${workspaceFolder}" } ] -} \ No newline at end of file +} diff --git a/BENCHMARKS.md b/BENCHMARKS.md new file mode 100644 index 00000000..59ba1f45 --- /dev/null +++ b/BENCHMARKS.md @@ -0,0 +1,444 @@ +# OCJS Empirical Evidence + +This document is the single source of truth for **"what measurable difference +does this fork make for me?"**. Every shipping change to the taucad +`opencascade.js` fork — from suffix-free overloads in the libembind patch +through the `opencascade_full_multi.wasm` build and the uniform return-by-value +output convention — is quantified here against either upstream `opencascade.js` +behaviour, native C++ OCCT, or pristine emscripten libembind. + +It is **orthogonal** to: + +- [`BREAKING_CHANGES.md`](BREAKING_CHANGES.md) — the published API delta consumers + must port to (what changed). +- [`CHANGELOG.md`](CHANGELOG.md) — the version-by-version log (when it changed). +- [`README.md`](README.md) — the fork's value proposition and getting started. + +Each section below links back to a self-contained experiment directory under +[`experiments/`](experiments/) with the bench harness, fixtures, raw +`results.json`, and a per-experiment README. The numbers cited here are pulled +directly from those committed JSON files unless otherwise noted. + +## TL;DR — all themes at a glance + +| Theme | Fork change | Headline result | Detail | +| ---------------------------------- | ------------------------------------------------------------------ | ---------------------------------------------------------------------------------------------------------- | ------------------- | +| [§1 Wall-clock CAD vs native](#1--wall-clock-cad-performance-vs-native-c-and-python) | mimalloc default + `BRepAlgoAPI_BuilderAlgo` canonical pattern | ~parity (0.99×) vs native LTO on the heaviest multi-tool fuse; 1.10–1.40× on real meshing/booleans/filling | [§1](#1--wall-clock-cad-performance-vs-native-c-and-python) | +| [§2 Multi-threading](#2--multi-threading-opencascade_full_multiwasm) | `opencascade_full_multi.wasm` + parallel toggles | **1.24×** total / **1.81×** boolean cut-grid / **3.46×** loft / **1.33×** STEP+mesh; +39% init | [§2](#2--multi-threading-opencascade_full_multiwasm) | +| [§3 Embind overload dispatch](#3--embind-overload-dispatch) | suffix-free + val-dispatch + `Object.hasOwn` inheritance gates | ~265 ns/same-arity call → ~5 µs/render (**0.003–0.011% of wall time**); +6,593 bytes glue | [§3](#3--embind-overload-dispatch) | +| [§4 RBV output parameters](#4--return-by-value-output-parameters) | uniform class-RBV + EM_JS idempotent disposer | ~+6% vs OBR (within noise); disposer ~1.23 µs/call; pointer identity preserved across `using` scopes | [§4](#4--return-by-value-output-parameters) | + +## §1 — Wall-clock CAD performance vs native C++ and Python + +**Question.** How does Node+WASM OCJS compare to the two alternative +geometric-kernel runtimes (Python+pybind11 via `build123d`, and native C++ +linked directly against OCCT) on a paired-workload suite drawn from real +modelling primitives? + +**Methodology.** The [`build123d-vs-ocjs/`](experiments/build123d-vs-ocjs/) +harness runs the same 10 paired samples (primitives, booleans, loft, sweep, +surface filling, fillet, meshing) under identical conditions in each runtime. +Each sample is warmed up twice, then measured 7 times; the median is reported. +Raw JSON: [`experiments/build123d-vs-ocjs/results/frontier/`](experiments/build123d-vs-ocjs/results/frontier/). + +**Environment.** macOS 26.0 / Apple M2 Pro / Node v24.10.0 / OCCT V8 release. +Native binaries built with `-O3` (`native-lto.json` adds `-flto`). + +### Per-sample medians (ms) + +| Sample | Python (build123d) | Native LTO | OCJS mimalloc | OCJS full (local) | OCJS mim / native | +| ---------------------------- | -----------------: | ---------: | ------------: | ----------------: | ----------------: | +| 01_primitive_box | 0.03 | 0.02 | 0.15 | 0.04 | 9.18× | +| 02_primitive_cylinder | 0.02 | 0.01 | 0.05 | 0.02 | 9.06× | +| 03_boolean_fuse | 7.61 | 3.18 | 10.07 | 12.36 | 3.16× | +| 04_boolean_cut_grid | 30.24 | 27.60 | 35.90 | 44.58 | 1.30× | +| 05_loft_thru_sections | 0.91 | 0.56 | 1.10 | 1.86 | 1.98× | +| 06_pipe_shell_sweep | 0.32 | 0.17 | 0.34 | 0.92 | 1.96× | +| 07_surface_filling_patch | 266.58 | 316.95 | 444.30 | 424.92 | 1.40× | +| 08_fillet_all_edges | 4.76 | 3.27 | 5.79 | 5.64 | 1.77× | +| 09_fuse_many_boxes | 53.92 | 66.62 | 66.19 | 78.57 | **0.99×** | +| 10_mesh_incremental | 73.66 | 79.58 | 87.33 | 88.38 | 1.10× | + +**Reading the table.** + +- **Sample 09 (40-box multi-tool fuse) hits parity with native LTO** (0.99×). + The mimalloc OCJS build also beats Python's `OCP` bindings (53.9 ms native → + 66.2 ms OCJS-mimalloc vs 53.9 ms Python is the only sub-native run, because + `OCP` shares native OCCT directly without WASM at all). +- **Heavy real-work samples (03, 04, 07, 08, 10) sit in a 1.10–1.77× bracket** + vs native. This is the "WASM tax" envelope for typical CAD payloads. +- **Trivial primitives (01, 02) show 9× ratios** because the absolute work + (≤ 0.05 ms) is dominated by WASM call setup and not by OCCT. These samples + are non-representative of real workloads and inflate any geomean. +- **mimalloc vs default emscripten allocator** is the headline fork + optimisation: the `wasm-allocators/` sub-PoC validated mimalloc as a + consistent improvement on multi-allocation-heavy samples (loft, fillet, + surface filling). It is now the default for `opencascade_full.wasm` (see + [`BUILD_SYSTEM.md`](BUILD_SYSTEM.md)). The "OCJS full (local)" column shows a + representative non-mimalloc reference build for delta context. +- **`BRepAlgoAPI_BuilderAlgo` canonical pattern** (the multi-tool boolean + shape from sample 09) is the only configuration where OCJS reaches parity + with native; consumers chasing native-class throughput on booleans should + follow the same pattern (`SetArguments` + `SetTools` + `Build` rather than + per-pair `BRepAlgoAPI_Fuse` chains). + +**Reproducing.** `node experiments/build123d-vs-ocjs/ocjs/run-bench.mjs +--engine mimalloc`. Other engines: `--engine full-local`, plus the python and +native runners under `experiments/build123d-vs-ocjs/python/` and +`experiments/build123d-vs-ocjs/native/`. + +**Status.** Active reference. Numbers are regenerated whenever the OCCT version +or `BUILD_SYSTEM.md` flags change. The four committed frontier JSONs are the +pinned snapshot. + +## §2 — Multi-threading (`opencascade_full_multi.wasm`) + +**Question.** How does the multi-threaded build (`opencascade_full_multi.wasm`) +compare to the single-threaded build (`opencascade_full.wasm`) on the same +workload mix, what's the per-sample shape of the speedup, and what does the +binary itself cost when threading is *off*? + +**Methodology.** The [`multi-thread-bench/`](experiments/multi-thread-bench/) +harness runs the same 11-sample CAD suite (primitives → STEP-import-and-mesh) +against both shipped binaries: `dist/opencascade_full.js` and +`dist/opencascade_full_multi.js`. For the MT run, four global activations are +made once at startup, then each parallel-aware sample receives +`{ parallel: true }` so per-instance `SetRunParallel(true)` and +`isInParallel=true` take effect. A third axis (MT binary with parallel OFF +for every sample) isolates the *pthread-binary tax* from the parallel gain. + +> **Reproducibility note (May 2026).** This section's headline numbers are the +> pinned snapshot from the original `main` measurement run on 2026-05-21. A +> re-run against the current `dist/` is blocked by two pre-existing +> infrastructure issues that are tracked separately: +> (a) `dist/opencascade_full.js` currently throws +> `BindingError: Cannot register type 'IMeshData_IPCurveHandle' twice` on +> load — a duplicate-registration regression in the most recent ST relink, and +> (b) sample 11 references `experiments/replicad-impact-poc/assets/main-assembly.step` +> which is not committed. Both blockers are unrelated to the changes in this +> document; once the dist binary relinks cleanly and the STEP asset lands, +> running `node experiments/multi-thread-bench/run-bench.mjs --warmup 2 --iters 7 +> --out experiments/multi-thread-bench/results.json` will refresh the JSON. + +### Headline — ST vs MT on the 11-sample suite + +| Metric | Value | +| ----------------------------------- | ----------- | +| Total wall time (11 samples, ST) | **2 428 ms** | +| Total wall time (11 samples, MT) | **1 952 ms** | +| Total speedup | **1.24×** | +| Total wall-time saved per pass | **−476 ms** (−19.6 %) | +| Best per-sample speedup | **3.46×** (`05_loft_thru_sections`) | +| Best parallel-aware speedup | **1.81×** (`04_boolean_cut_grid`) | +| Largest absolute saving | **−464 ms** (`11_step_import_and_mesh`) | +| Worst per-sample regression | **0.44×** (`03_boolean_fuse`, tiny 1+1 fuse) | +| WASM binary size (ST → MT) | 38.46 → 37.89 MB (−1.5 %) | +| Module init time (ST → MT) | 488 → 676 ms (+39 %, pthread pool spawn for 12 workers) | +| OCCT thread pool | **12 workers** (`OSD_ThreadPool::DefaultPool(-1)` sized to `NbLogicalProcessors`) | +| Pool fan-out cap per launcher | **12** (`OSD_ThreadPool::SetNbDefaultThreadsToLaunch(12)`) | + +### Per-sample ST vs MT — full table + +`parallel?` marks samples that exercise an OCCT API with a *public* parallel +toggle. Sample 5 (loft) is not flagged because its parallelism is internal to +OCCT. + +| Sample | ST median (ms) | MT median (ms) | Δ (ms) | Δ % | speedup | parallel? | +| ---------------------------- | --------------: | --------------: | --------: | -------: | ------: | :-------: | +| 01_primitive_box | 0.05 | 0.04 | −0.01 | −14.9 % | 1.17× | | +| 02_primitive_cylinder | 0.02 | 0.02 | −0.00 | −3.1 % | 1.03× | | +| 03_boolean_fuse | 5.01 | 11.39 | +6.38 | +127.5 % | 0.44× | * | +| 04_boolean_cut_grid | 31.86 | 17.60 | −14.26 | −44.8 % | 1.81× | * | +| 05_loft_thru_sections | 3.69 | 1.06 | −2.62 | −71.1 % | 3.46× | | +| 06_pipe_shell_sweep | 0.35 | 0.33 | −0.02 | −5.4 % | 1.06× | | +| 07_surface_filling_patch | 357.39 | 364.53 | +7.14 | +2.0 % | 0.98× | | +| 08_fillet_all_edges | 5.43 | 5.62 | +0.19 | +3.5 % | 0.97× | | +| 09_fuse_many_boxes | 61.49 | 57.69 | −3.80 | −6.2 % | 1.07× | * | +| 10_mesh_incremental | 77.08 | 72.51 | −4.57 | −5.9 % | 1.06× | * | +| 11_step_import_and_mesh | 1 885.30 | 1 421.02 | −464.28 | −24.6 % | 1.33× | * | +| **TOTAL (sum of medians)** | **2 427.67** | **1 951.81** | **−475.86** | **−19.6 %** | **1.24×** | | + +### Three-way decomposition — pthread binary tax vs parallel gain + +| Sample | ST (ms) | MT, par OFF (ms) | MT, par ON (ms) | binary tax | parallel gain | +| ---------------------------- | ----------: | ---------------: | --------------: | ---------: | ------------: | +| 03_boolean_fuse | 5.01 | 5.05 | 11.39 | +0.0 ms | **+6.3 ms WORSE** — pool sync overhead on tiny work | +| 04_boolean_cut_grid | 31.86 | 28.49 | 17.60 | −3.4 ms (−11 %) | **−10.9 ms / 1.62× on the parallel portion** | +| 05_loft_thru_sections | 3.69 | 1.13 | 1.06 | −2.6 ms (−69 %) | **−0.1 ms** (already wins from internal parallelism) | +| 09_fuse_many_boxes | 61.49 | 64.61 | 57.69 | +3.1 ms (+5 %) | **−6.9 ms / 1.12× on the parallel portion** | +| 10_mesh_incremental | 77.08 | 80.50 | 72.51 | +3.4 ms (+4 %) | **−8.0 ms / 1.11× on the parallel portion** | +| 11_step_import_and_mesh | 1 885.30 | 2 050.70 | 1 421.02 | +165.4 ms (+8.8 %) | **−629.7 ms / 1.44× on the parallel portion** | +| **TOTAL** | **2 428** | **2 596** | **1 952** | **+168 ms (+6.9 %)** | **−644 ms / 1.33× on the parallel portion** | + +The **binary tax** column (`MT par OFF` − `ST`) is the cost of carrying the +pthread runtime even when no parallel section is opted in: **+168 ms / +6.9% +across the suite**, dominated by sample 11's lazy `OSD_ThreadPool::DefaultPool(-1)` +init. The **parallel gain** column is the actual win: **−644 ms / −25%**. + +### Cost breakdown — what you pay for threading + +| Cost | Value | Notes | +| --- | --- | --- | +| Module init time | +188 ms (+39 %) | 488 → 676 ms; PTHREAD_POOL_SIZE=12 workers spawned | +| Binary size (uncompressed) | −0.6 MB (−1.5 %) | 38.46 → 37.89 MB — pthread runtime is offset by removed `-sEVAL_CTORS=2` overhead | +| Per-call pthread tax | +6.9 % on workload total | ~168 ms across the 11-sample suite (most of it lazy-pool init in sample 11) | +| Wall-time savings | 1.24× total / up to 3.46× per call | dominated by sample 11 (mesh) and sample 5 (loft) | +| Browser deployment cost | COOP/COEP headers required | locks out third-party iframes that don't opt in | + +### Recommendations (multi-threading) + +1. **Default to the single-threaded build for embeddable CAD widgets** — the + workload profile (one operation per interaction) does not amortise the + thread-pool tax. +2. **Ship the multi-threaded build for visualisation pipelines and batch + modelling** — meshing-heavy workloads (STEP→glTF conversion, complex + assembly triangulation) see a clear 1.3–1.5× improvement. +3. **Always pair the MT binary with the four global activations** + (`SetParallelMode`, `SetParallelDefault`, `DefaultPool(-1)`, + `SetNbDefaultThreadsToLaunch`) — otherwise the binary carries pthread + overhead with reduced benefit (the "MT par OFF" column above). +4. **For mobile / low-core deployments**, cap the pool: + `-sPTHREAD_POOL_SIZE=Math.min(navigator.hardwareConcurrency, 8)`. The + sweet spot is 6–8 workers; beyond that the coordination overhead exceeds + the parallel gain on small operations. + +The complete deep dive (R1 `PTHREAD_POOL_SIZE` audit, per-operation +explanations, loft 3.46× anomaly, OCCT thread-pool internals) lives in +[`docs-site/content/docs/package/guides/multi-threading.mdx`](docs-site/content/docs/package/guides/multi-threading.mdx) +and [`docs-site/content/docs/toolchain/guides/multi-threading.mdx`](docs-site/content/docs/toolchain/guides/multi-threading.mdx). + +## §3 — Embind overload dispatch + +**Question.** What is the full cost (correctness + per-call perf + bundle + +inheritance regression risk) of the taucad fork's suffix-free overload +mechanism in [`src/patches/libembind-overloading.patch`](src/patches/libembind-overloading.patch)? + +The fork patches `libembind.js` to do **same-arity type-based dispatch** +instead of upstream emscripten's arity-only dispatch. This is what makes +`new oc.BRepBuilderAPI_MakeEdge(circle)` route to the `gp_Circ`-taking +constructor instead of throwing `BindingError: incompatible argument`, which +upstream emscripten would do for any overload set sharing an arity. + +Three experiments quantify the three orthogonal axes: + +### §3.1 — Correctness foundation: suffix-free dispatch (`poc-overload-dispatch`) + +Demonstrates that **without** the val-based dispatcher, only the +*last-registered* same-arity overload is reachable from JS: + +- [`broken.mjs`](experiments/poc-overload-dispatch/broken.mjs) → 2/9 pass +- [`fixed.mjs`](experiments/poc-overload-dispatch/fixed.mjs) → 9/9 pass + +This is the foundational reason every consumer call to +`BRepBuilderAPI_MakeEdge(circle)`, `BRepPrimAPI_MakeBox(pnt, pnt)`, +`BRepBuilderAPI_MakeWire(edge, edge, edge)`, etc. works in this fork where it +would have thrown in upstream emscripten + a stock OCCT bindings.cpp. + +Reproducing: `cd experiments/poc-overload-dispatch && ./build.sh && node run.mjs`. + +### §3.2 — Per-call cost: same-arity dispatch tax (`poc-overload-dispatch-cost`) + +Quantified end-to-end against two C++ corpora (overloaded shared-name vs +unique-named) compiled against two `libembind.js` states (pristine upstream +emscripten 5.0.1 vs the OCJS-patched version). All numbers from +[`results.json`](experiments/poc-overload-dispatch-cost/results.json): + +| Metric | Value | Source | +| --------------------------------------- | ----------------- | ------------------------------------------------------- | +| Per-call same-arity dispatch tax | **~264 ns/call** | `results.json` M2 first/last avg @ N=6 minus M5d floor | +| Per-call single-overload tax | **~6.3 ns/call** (2.3%) | M1' − M1 | +| Worst-case scan slope | **~45 ns/overload** | M2h N=8 − N=2, ÷6 | +| Total dispatch overhead per CAD render | **~5.08 µs / render** | 15 same-arity 1-arg + 4 same-arity 2-arg + 10 single-overload calls (birdhouse model) | +| % of wall time on 50–200 ms render | **0.003 – 0.011%** | Derived against §1's `build123d-vs-ocjs` OCJS sample bracket | +| Bundle delta (uncompressed JS glue) | **+6,593 bytes** | `patched.mjs` − `baseline.mjs` | +| Module init delta | ~−1.9 ms (faster) | Patched module also rewires `cppTypeToJsType` more cheaply for shared-name registrations | + +**Verdict.** The suffix-free mechanism is **operationally invisible** on real +CAD workloads. No per-class opt-in is needed; no consumer should ever feel +this cost. The 0.003–0.011% wall-time bracket means a CAD model rendering in +100 ms spends roughly **5 microseconds** of that resolving same-arity +overloads — three orders of magnitude below typical frame-budget noise. + +Reproducing: `cd experiments/poc-overload-dispatch-cost && ./build.sh all && +node bench.mjs`. The two libembind variants are checked in as +`libembind.upstream-5.0.1.js` and `libembind.ocjs-patched.js` for +byte-deterministic toggling via `apply-libembind-patch.sh`. + +### §3.3 — Inheritance regression guard: `Object.hasOwn` R1+R2 gates (`libembind-fan-out-poc`) + +A 7-case fast regression matrix (~30 s per cycle vs 30+ min for a full +WASM rebuild) that protects against the **cross-sibling inherited-table +mutation bug** in arity-fan-out for trailing default arguments. Without the +`Object.hasOwn` R1+R2 gates currently shipping in the libembind patch, a +derived class registering an `override` of a base method mutates the base +class's inherited overload table and corrupts unrelated siblings +(e.g. `BRepFeat_SplitShape` registration breaking `BRepBuilderAPI_MakeShape` +for every other consumer): + +| Build | A | B | C | D | E | F | G | Total | +| ------------------------------ |:-:|:-:|:---:|:-:|:-:|:---:|:-:|:-----:| +| `negative` (no R1+R2 gates) | ✗ | ✗ | ✗ | ✓ | ✓ | ✗ | ✓ | 3/7 | +| `positive` (R1+R2 shipping) | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ | **7/7** | + +The negative build fails Tests A, B, **C (the smoking gun: cross-sibling +regression)**, and F — confirming the corruption cascades, not just hits one +isolated scenario. The positive build (current shipping `libembind-overloading.patch`) +passes all 7. This PoC is the canonical guard against any future patch +revision regressing the inheritance isolation. + +Reproducing: `cd experiments/libembind-fan-out-poc && node run.test.mjs` +(with the negative + positive `.mjs` artefacts already built; rebuild via +`./build.sh negative` / `./build.sh positive` after toggling the +`./apply-libembind-patch.sh apply`/`restore`). + +## §4 — Return-by-value output parameters + +**Question.** What is the cost of the uniform class-RBV migration (replacing +v2's `{ current: 0 }` placeholder objects with embind `value_object` returns +for every C++ output parameter), and does the `Symbol.dispose` plumbing +preserve pointer identity across `using` scopes? + +The fork's RBV convention is documented in [`BREAKING_CHANGES.md` §D2](BREAKING_CHANGES.md) +and [`docs-site/content/docs/package/migrations/output-parameters.mdx`](docs-site/content/docs/package/migrations/output-parameters.mdx). +Two experiments cover the two axes: + +### §4.1 — Per-call cost: class-RBV vs output-by-reference (`q67-rbv-cost`) + +Eight bench variants (V1 → V7) measure every plausible RBV dispatch path, +from a baseline `{ current: 0 }`-recycled output through the production +`value_object` + EM_JS disposer path. All numbers from `results.json` +([`results.json`](experiments/q67-rbv-cost/results.json) for V1–V5; +`results-pure-cpp.txt` + `results-csp-safe.txt` for V6/V7/E2): + +| Metric | Value | Notes | +| -------------------------------------------- | -------------- | -------------------------------------------------------------- | +| V1 baseline OBR (recycled outputs) | **27 ns/call** | Best case — no allocation, just property write | +| V1b OBR with per-call `new`/`delete` | 983 ns/call | Apples-to-apples vs RBV (both allocate) | +| V2 `value_object` (no dispose) | **985 ns/call** | Within +0.2% of V1b — RBV is free over allocate+free OBR | +| V3 `value_object` + JS dispose wrap | 992 ns/call | +0.7% over V2 — JS wrapper cost negligible | +| V3b `value_object` + `using` declaration | 1,088 ns/call | +10% vs V3 — `using` adds a try/finally per call | +| V6 cached EM_JS `__ocjsRbvDispose__` | **1,224 ns/call (CSP-safe)** | Production path — no `eval`, no `new Function()` | +| V6 uncached EM_JS (re-lookup `Symbol.dispose`) | 1,514 ns/call | +24% over cached — caching is the key optimisation | +| E `Function(src)` cached (rejected) | 1,261 ns/call | Rejected: requires `-sDYNAMIC_EXECUTION=1`, CSP-unfriendly | +| E `Function(src)` fresh | 2,415 ns/call | Rejected: also CSP-unfriendly | + +**Verdict.** Uniform class-RBV is **viable without a per-class bindgen +allowlist**. The shipping production path (EM_JS cached disposer) costs +**~1.23 µs per call** — within +6% of the bare `value_object` path and CSP-safe +out of the box. The `using` syntax adds ~10% (single try/finally per call) +which is small enough to default-enable for ergonomics; consumers in +sub-microsecond hot loops can opt out by using explicit `result.delete()`. + +A typical CAD render makes ~30–80 RBV-returning calls (curve evaluations, +projections, surface samples), totalling roughly **37–98 µs of disposer cost** +per frame — 0.04–0.20% of a 50 ms render budget. + +Reproducing: + +```bash +cd experiments/q67-rbv-cost +./build.sh && node run.mjs # V1–V5 → results.json +./build-pure-cpp.sh && node pure-cpp-bench.mjs > results-pure-cpp.txt +./build-csp-safe.sh && node csp-safe-bench.mjs > results-csp-safe.txt +``` + +### §4.2 — Correctness: pointer identity preserved (`poc-rbv-dispose`) + +Validates that the shipping `__ocjsRbvDispose__` EM_JS path: + +- **Preserves caller→container pointer identity** across `using` scopes (the + same `gp_Pnt*` that C++ wrote into the `value_object` is the pointer the + caller's `D1Result.theP` resolves to; no copy is made). +- **Is idempotent under double-dispose** and `using` scope exit (calling + `[Symbol.dispose]()` twice on the same handle is a no-op the second time). +- **Is sibling-aliasing safe** — disposing one return value never affects + any other live `value_object` handle. + +Qualitative pass/fail only (no perf claim). This is the correctness +foundation for the `using result = curve.D1(...)` ergonomics shipped in v3. + +Reproducing: see [`experiments/poc-rbv-dispose/`](experiments/poc-rbv-dispose/) README. + +## Reproducing all benchmarks + +Single runbook covering every theme above: + +```bash +cd repos/opencascade.js + +# §1 — Wall-clock CAD (10–15 min for the full mimalloc engine) +node experiments/build123d-vs-ocjs/ocjs/run-bench.mjs --engine mimalloc +# Other engines: --engine full-local; native/python runners under +# experiments/build123d-vs-ocjs/{native,python}/ + +# §2 — Multi-threading (~45 s once dist/ is healthy) +node experiments/multi-thread-bench/run-bench.mjs \ + --warmup 2 --iters 7 \ + --out experiments/multi-thread-bench/results.json + +# §3.1 — Suffix-free correctness (~10 s) +cd experiments/poc-overload-dispatch && ./build.sh && node run.mjs +cd ../.. + +# §3.2 — Same-arity dispatch cost (~2 min full matrix) +cd experiments/poc-overload-dispatch-cost && ./build.sh all && node bench.mjs +cd ../.. + +# §3.3 — Inheritance regression (~30 s per build cycle) +cd experiments/libembind-fan-out-poc +./apply-libembind-patch.sh apply && ./build.sh negative +./apply-libembind-patch.sh apply && ./build.sh positive +./apply-libembind-patch.sh restore +node run.test.mjs # expects exit 0, prints 3/7 (negative) + 7/7 (positive) +cd ../.. + +# §4.1 — RBV per-call cost (~1 min total) +cd experiments/q67-rbv-cost +./build.sh && node run.mjs # V1–V5 +./build-pure-cpp.sh && node pure-cpp-bench.mjs > results-pure-cpp.txt +./build-csp-safe.sh && node csp-safe-bench.mjs > results-csp-safe.txt +cd ../.. + +# §4.2 — RBV disposer correctness (qualitative) +cd experiments/poc-rbv-dispose && ./build.sh && node run.mjs +``` + +## Environment (canonical) + +| | | +| --- | --- | +| Host CPU | Apple M2 Pro (10 perf + 2 efficiency = 12 logical cores) | +| RAM | 32 GB | +| OS | macOS 26.0 (build 25A354) | +| Node.js | v24.10.0 (V8 13.6.233.10-node.28) | +| Emscripten | 5.0.1 | +| OCCT revision | `deps/OCCT` (V8 release) | +| OCJS commit | `occt-v8-emscripten-5` branch, May 2026 | + +## Out of scope (linked for completeness) + +The following experiments live alongside the ones cited above but are +intentionally **not** rolled up into this hub: + +- **NCollection Option D** — design validation for a future bindgen migration + that is *not yet shipped* in production bindings. + See [`experiments/option-d-boundary-narrowing/`](experiments/option-d-boundary-narrowing/) + and [`experiments/option-d-comprehensive-poc/`](experiments/option-d-comprehensive-poc/) + for the raw design-validation runs. Once the migration ships, this hub will + gain a §5 covering the consumer-facing cost. +- **`build123d-vs-ocjs/wasm-allocators/`** — the mimalloc-vs-default allocator + comparison that *informed* §1's default. Allocator choice is now locked by + [`BUILD_SYSTEM.md`](BUILD_SYSTEM.md) and [`build-wasm.sh`](build-wasm.sh). + Numbers in §1 above already reflect the mimalloc default. + +## References + +- Multi-threading deep dives: [`docs-site/content/docs/package/guides/multi-threading.mdx`](docs-site/content/docs/package/guides/multi-threading.mdx), + [`docs-site/content/docs/toolchain/guides/multi-threading.mdx`](docs-site/content/docs/toolchain/guides/multi-threading.mdx) +- API delta and migration: [`BREAKING_CHANGES.md`](BREAKING_CHANGES.md) +- Version log: [`CHANGELOG.md`](CHANGELOG.md) +- Build system / `mimalloc` default rationale: [`BUILD_SYSTEM.md`](BUILD_SYSTEM.md) +- Modular ST/MT subpath packaging (`@taucad/opencascade.js` vs `/multi`): see the package MT guide above +- Cross-origin isolation for browser threading (SAB + COOP/COEP): see the package MT guide above +- Libembind overloading patch: [`src/patches/libembind-overloading.patch`](src/patches/libembind-overloading.patch) +- Build YAML (MT): [`build-configs/full_multi.yml`](build-configs/full_multi.yml) diff --git a/BREAKING_CHANGES.md b/BREAKING_CHANGES.md new file mode 100644 index 00000000..17c92fd5 --- /dev/null +++ b/BREAKING_CHANGES.md @@ -0,0 +1,649 @@ +# Breaking Changes — `opencascade.js@3.0.0` + +This guide is for **package consumers** upgrading from v2 (`opencascade.js@2.x`, last published as `2.0.0-beta.b5ff984`) → v3 (`opencascade.js@3.0.0`). + +It lists every consumer-visible breaking change with **Before / After** code samples. All `After` snippets are taken directly from runnable smoke tests in [`tests/smoke/`](tests/smoke/) or from the published [`dist/opencascade_full.d.ts`](dist/opencascade_full.d.ts). + +If you only build WASM yourself (no JS consumption), skip ahead to [Section F — Build flag changes](#section-f--build-flag-changes). + +## Compatibility floor + +Native WebAssembly exception handling is on by default in the published build. Consumers must run on a runtime that supports `WebAssembly.Exception`: + +| Runtime | Minimum | +| ------------- | ------- | +| Chrome / Edge | 95 | +| Firefox | 100 | +| Safari | 16.4 | +| Node.js | 22 | + +To run on older runtimes, build a custom variant from source by overriding `OCJS_EXCEPTIONS=0` on top of any shipped configuration — every named configuration in `build-configs/configurations.json` enables native WASM exceptions by default in v3, so a non-exceptions build has to be opted out explicitly. + +## Index + +- [Section A — Module loading](#section-a--module-loading) +- [Section B — JS / TS API surface changes](#section-b--js--ts-api-surface-changes) +- [Section C — WebAssembly exception handling](#section-c--webassembly-exception-handling) +- [Section D — OCCT V8 API breaking changes](#section-d--occt-v8-api-breaking-changes) +- [Section E — Removed symbol families](#section-e--removed-symbol-families) +- [Section F — Build flag changes](#section-f--build-flag-changes) +- [Appendix G — Performance & size](#appendix-g--performance--size) + +--- + +## Section A — Module loading + +### A1 — `dist/` layout: single triple, no facade + +v2 shipped a barrel module that lazily required one of several pre-built variants from `dist/`. v3 ships exactly one variant — `opencascade_full.{js,wasm,d.ts}` — and exports its loader as the package's default export. There is no facade module to choose between variants. + +**Before** + +```ts +import { initOpenCascade } from 'opencascade.js'; +import opencascade from 'opencascade.js/dist/opencascade.full.js'; +const oc = await initOpenCascade({ mainJS: opencascade }); +``` + +**After** + +```ts +import initOpenCascade from 'opencascade.js'; +const oc = await initOpenCascade({ locateFile }); +``` + +**Action**: drop any `mainJS` / variant-selection wiring. If you previously imported a specific variant file directly, switch to the package's default export. + +### A2 — ESM-only with explicit `locateFile` + +The package is `"type": "module"`. CommonJS entry points are gone. The Emscripten loader still needs a `locateFile` callback so it can resolve `opencascade_full.wasm` from your bundler's output directory or your Node `node_modules` layout. + +The wasm binary is exposed via subpath exports — `@taucad/opencascade.js/wasm` for the single-threaded default and `@taucad/opencascade.js/multi/wasm` for the pthread-enabled variant — which are the only supported ways to reach the binaries from consumer code. The same identifiers work under Vite's `?url` suffix, Node's `import.meta.resolve`, Bun, and Deno. + +For the multi-threaded variant, import `@taucad/opencascade.js/multi` instead of the package root and resolve wasm through `@taucad/opencascade.js/multi/wasm`. Browser deployments require cross-origin isolation headers; see the [multi-threaded build guide](https://ocjs.org/docs/package/guides/multi-threading) on ocjs.org. + +For Node ESM consumers: + +```ts +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import type { OpenCascadeInstance } from '@taucad/opencascade.js'; +import init from '@taucad/opencascade.js'; + +const WASM_DIR = dirname(fileURLToPath(import.meta.resolve('@taucad/opencascade.js/wasm'))); + +let _oc: OpenCascadeInstance | undefined; +export async function initOC(): Promise { + if (!_oc) { + _oc = await init({ + locateFile: (filename: string) => join(WASM_DIR, filename), + }); + } + return _oc; +} +``` + +For a Vite / browser app, resolve the WASM URL through your bundler: + +```ts +import init from '@taucad/opencascade.js'; +import wasmUrl from '@taucad/opencascade.js/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); +``` + +For the multi-threaded build (COOP/COEP-isolated deployments only): + +```ts +import init from '@taucad/opencascade.js/multi'; +import wasmUrl from '@taucad/opencascade.js/multi/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); +``` + +**Action**: pass `locateFile` to every `init()` call and remove any CommonJS `require()` of the package. Reach for wasm through `@taucad/opencascade.js/wasm` (default) or `@taucad/opencascade.js/multi/wasm` (threaded) — `dist/*` deep paths are not part of the package's public surface. + +--- + +## Section B — JS / TS API surface changes + +### B1 — Suffix-free overloads + +v2 exposed each C++ overload as its own `_N`-suffixed subclass (`gp_Pnt_2`, `gp_Pnt_3`, …) and required the consumer to pick the right one. v3 collapses every uniquely-arity overload behind the bare symbol with a value-based dispatcher; the runtime picks the right C++ overload from your argument types. + +Reference smoke test: [`tests/smoke/smoke-suffix-free.test.ts`](tests/smoke/smoke-suffix-free.test.ts). + +> **Perf note.** The val-based dispatcher's per-call cost is quantified in [BENCHMARKS.md §3 — Embind overload dispatch](BENCHMARKS.md#3--embind-overload-dispatch): ~264 ns per same-arity call, totalling ~5 µs per typical CAD render (0.003–0.011% of wall time). + +**Before** + +```ts +const p = new oc.gp_Pnt_3(1, 2, 3); +const dirFromXyz = new oc.gp_Dir_2(new oc.gp_XYZ(0, 0, 1)); +const box = new oc.BRepPrimAPI_MakeBox_2(10, 20, 30); +const edge = new oc.BRepBuilderAPI_MakeEdge_3(p1, p2); +``` + +**After** + +```ts +using p = new oc.gp_Pnt(1, 2, 3); +using dirFromXyz = new oc.gp_Dir(new oc.gp_XYZ(0, 0, 1)); +using box = new oc.BRepPrimAPI_MakeBox(10, 20, 30); +using edge = new oc.BRepBuilderAPI_MakeEdge(p1, p2); +``` + +For genuinely ambiguous cases that share an arity (e.g. two constructors that both take three numbers but mean different things), the codegen still emits `_N` symbols — grep `dist/opencascade_full.d.ts` to find the exact name. + +**Action**: search-and-replace `_N` overload subclass names with the bare symbol. Most call sites collapse cleanly; the few that don't surface as TypeScript errors with the correct alternative spelling visible in IntelliSense. + +### B2 — Output-parameter return shape: class outputs mutate in place; envelopes only when JS truly needs them + +v2 surfaced every C++ method as its raw embind binding: caller-allocated class outputs that mutated in place, `{ current: 0 }` wrappers for primitive `&` outputs, and `new oc.Handle_()` wrappers for `Handle&` outputs. v3 emits the narrowest JS shape that faithfully represents each C++ method. Class output parameters (`gp_Pnt&`, `Bnd_Box&`, `GProp_GProps&`, `TopoDS_Shape&`, etc.) keep their v2 mutate-in-place mechanic — the caller's instance is mutated and read directly from the input variable, never echoed as a field on a return envelope. Primitive and enum outputs no longer need `{ current: 0 }` wrappers: pass any value of the type and read the result from a structured envelope. `Handle&` outputs are elided entirely from the JS signature (see [§B3](#b3--non-const-handlet-output-positions-elided-from-the-js-signature)) and surface as envelope fields. Envelopes are emitted only when JavaScript genuinely needs a multi-field return: primitive/enum outputs, elided `Handle&` outputs, or a mix of both alongside a native C++ return value. + +Reference smoke tests: [`tests/smoke/smoke-output-params.test.ts`](tests/smoke/smoke-output-params.test.ts), [`tests/smoke/smoke-properties.test.ts`](tests/smoke/smoke-properties.test.ts), [`tests/smoke/smoke-output-params-disposal.test.ts`](tests/smoke/smoke-output-params-disposal.test.ts). Type-level contract: [`tests/output-params.test-d.ts`](tests/output-params.test-d.ts), [`tests/disposable-containers.test-d.ts`](tests/disposable-containers.test-d.ts). Bindgen-shape regression guard: [`tests/bindgen-output-shape.test.ts`](tests/bindgen-output-shape.test.ts). + +**Decision tree** (the codegen applies this to every C++ method with output parameters; the resulting JS shape follows from the bullet that fires first): + +| C++ return | C++ output params | Resulting JS shape | +| ---------- | ------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Non-`void` | None | Native return (no envelope). `Curve(): Handle_Geom_Curve` | +| Non-`void` | Class only (mutated in place) | Native return. Read mutated classes from your input variables. `curve.D0(u, pt) → void`; `surface.D2(u, v, P, D1U, D1V, D2U, D2V, D2UV) → void` | +| `void` | Class only | `void`. Read mutated classes from your input variables. `BRepBndLib.Add(shape, box, useTri) → void` | +| Non-`void` | Primitives / enums / elided Handles (with or without class outputs) | Envelope with `returnValue` for the C++ return + one named field per non-class output. Class outputs are NOT echoed. `Surface.Bounds(u1, u2, v1, v2): { U1: number; U2: number; V1: number; V2: number; [Symbol.dispose](): void }` | +| `void` | Primitives / enums / elided Handles (with or without class outputs) | Envelope with the same shape minus `returnValue` | + +**The six return-shape rules:** + +1. **Class outputs never mirror into the return envelope.** When a method declares a class output (`gp_Pln&`, `gp_Pnt&`, `Bnd_Box&`, …), the caller's instance is mutated and read directly; the envelope (if any) carries only non-class outputs. Regression: `tests/bindgen-output-shape.test.ts > no envelope mirrors a concrete class output as a non-return field`. +2. **Class arguments are mutated in place.** Pass your own freshly-constructed `gp_Pnt` / `Bnd_Box` / `GProp_GProps` / `TopoDS_Shape` and read it back after the call. There is no second copy. +3. **Native return values surface directly when no envelope is required.** A method whose only outputs are class-typed (or none at all) returns its native C++ value (or `void`) — not an `{ returnValue }` wrapper. +4. **Envelopes only for primitives, elided Handles, and mixed cases.** The envelope exists when JS cannot otherwise see a primitive/Handle output, and only those non-class outputs become fields. +5. **The C++ return value lives at `envelope.returnValue`.** The name is reserved to avoid collision with OCCT parameters literally named `result` (roughly a dozen public OCCT methods declare a parameter under that name), letting both the C++ return and an OCCT-named `result` parameter coexist in the same envelope without one shadowing the other. +6. **JSDoc is explicit.** Class params that mutate in place get a `Mutated in place; read the updated value from this argument after the call.` suffix (appended to the OCCT Doxygen description when present). Envelope fields get a multi-line `@returns A result object with fields:` block. + +**Placeholder conventions** (only relevant for envelope outputs — primitives and elided Handles): + +| Slot type | Passes through as | +| ------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| Primitive (`Standard_Real&`, `Standard_Integer&`, `Standard_Boolean&`) | Pass any value of the type (`0`, `0.0`, `false`); read the updated value from `envelope.` | +| Enum output (`TopAbs_State&`, `FairCurve_AnalysisCode&`) | Pass any enum value (e.g. `oc.TopAbs_State.TopAbs_IN.value`); read from `envelope.` | +| Concrete class output (`gp_Pnt&`, `gp_Vec&`, `Bnd_Box&`, `GProp_GProps&`, `TopoDS_Shape&`) | **Mutated in place** — construct it, pass it, read it back from your input variable. No envelope field. | +| `Handle&` output (any class) | **Position elided from the JS signature** — see [§B3](#b3--non-const-handlet-output-positions-elided-from-the-js-signature). Read from `envelope.`. | + +**Call-site migration table** (canonical cases — `_N` suffixes shown only where v2 emitted one; the exact suffix index varied by overload set): + +| Method | v2 (caller-allocated `{ current: 0 }` / Handle placeholders, `_N`-suffixed) | v3 (minimal transformation) | +| --------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| `Geom_Curve.D0` (class out, void return) | `const pt = new oc.gp_Pnt(); curve.D0(u, pt); console.log(pt.X(), pt.Y(), pt.Z())` | `curve.D0(u, pt); console.log(pt.X(), pt.Y(), pt.Z())` — identical mechanic | +| `Geom_Curve.D2` (3 class outs, void return) | `curve.D2(u, p, v1, v2); console.log(p.X(), v1.X(), v2.X())` — caller allocates `p`, `v1`, `v2` | `curve.D2(u, p, v1, v2); console.log(p.X(), v1.X(), v2.X())` — identical mechanic | +| `Geom_Surface.Bounds` (4 primitive outs, void return) | `const u1 = { current: 0 }, u2 = { current: 0 }, v1 = { current: 0 }, v2v = { current: 0 }; surface.Bounds(u1, u2, v1, v2v); console.log(u1.current, u2.current, v1.current, v2v.current)` | `using r = surface.Bounds(0, 0, 0, 0); console.log(r.U1, r.U2, r.V1, r.V2)` — primitives ride the envelope; `{ current: 0 }` wrappers gone | +| `BRepGProp.VolumeProperties` (class out, native return) | `const props = new oc.GProp_GProps(); const epsilon = oc.BRepGProp.VolumeProperties(shape, props); console.log(props.Mass(), epsilon)` | `using props = new oc.GProp_GProps(); const epsilon = BRepGProp.VolumeProperties(shape, props); console.log(props.Mass(), epsilon)` — identical mechanic; `using` optional but recommended | +| `BRepBndLib.Add` (class out, void return) | `const box = new oc.Bnd_Box(); oc.BRepBndLib.Add(shape, box, useTri); console.log(box.IsVoid())` | `BRepBndLib.Add(shape, box, useTri); console.log(box.IsVoid())` — reuse the caller-allocated `box` | +| `BRep_Builder.MakeVertex` (class out, void return) | `const v = new oc.TopoDS_Vertex(); builder.MakeVertex(v, p, tol); console.log(v.IsNull())` | `builder.MakeVertex(v, p, tol); console.log(v.IsNull())` — identical mechanic | +| `XCAFDoc_ColorTool.GetColor` (boolean return, class out) | `const color = new oc.Quantity_Color(); const hasColor = colorTool.GetColor_N(label, type, color); console.log(hasColor, color.Red(), color.Green(), color.Blue())` | `const hasColor = colorTool.GetColor(label, type, color); console.log(hasColor, color.Red(), color.Green(), color.Blue())` — class output stays caller-allocated; boolean return surfaces directly (no envelope: only output is a class) | +| `BRep_Tool.Curve` (Handle return, 2 primitive outs, 1 class `loc` out) | `const first = { current: 0 }, last = { current: 0 }; const handle = oc.BRep_Tool.Curve_N(edge, loc, first, last); console.log(handle, first.current, last.current)` — class `loc` caller-allocated, mutated in place | `using r = BRep_Tool.Curve(edge, loc, 0, 0); console.log(r.returnValue, r.First, r.Last)` — class `loc` still mutated in place; primitives ride the envelope; native Handle return at `r.returnValue` | +| `XCAFDoc_ClippingPlaneTool.GetClippingPlane` (boolean return, 1 class out, 1 Handle out, 1 primitive out) | `const theName = new oc.Handle_TCollection_HAsciiString(); const theCapping = { current: false }; const hasPlane = tool.GetClippingPlane_N(label, plane, theName, theCapping); console.log(hasPlane, plane, theName, theCapping.current)` | `using r = tool.GetClippingPlane(label, plane, capping); console.log(r.returnValue, plane.<…>, r.theName, r.theCapping)` — `plane` mutated in place; Handle output elided ([§B3](#b3--non-const-handlet-output-positions-elided-from-the-js-signature)); envelope holds boolean return as `returnValue`, the Handle output, and the primitive `theCapping` | + +How the C++ layer mutates a JS-supplied class argument: the codegen accepts the slot as `::emscripten::val`, then dereferences a raw-pointer cast back into the registered class instance: + +```cpp +BRepBndLib::Add(S, *B.as(emscripten::allow_raw_pointers()), useTriangulation); +``` + +The `val::as(allow_raw_pointers())` + deref pattern is the only form that round-trips through embind without making a copy — `val::as()` falls back to `BindingType` which copies by value and would silently lose mutations. The regression is locked down by `tests/bindgen-output-shape.test.ts > class outputs forward via *val::as(allow_raw_pointers())`. + +**`using` is still required for envelope returns** that own C++ resources (Handle fields). Lint rules that enforce `using` on disposable return values are recommended for large codebases. A class-output-only method returning `void` does **not** require `using` on the call site (there is nothing disposable to track). + +**Disposer idempotency** (relevant for try/finally migration paths): the envelope's `[Symbol.dispose]()` is one-shot per instance and alias-safe. Callers can invoke it manually inside try/finally **and** rely on `using` scope-exit to re-dispose without throwing `BindingError: instance already deleted`. + +**Action**: + +1. Walk the decision tree above for each call site and determine the new return shape. +2. Class output params keep their v2 mechanic — caller-allocated, mutated in place, read back from your input variable. No code change beyond dropping any `_N` suffix on the method name. +3. For primitive / enum `&` output params: drop the `{ current: 0 }` (or `{ current: false }`, etc.) wrappers — pass any value of the type and read the result from `envelope.` instead of `arg.current`. +4. For `Handle&` output params: stop allocating `new oc.Handle_()` placeholders — drop the position from the call entirely and read the freshly-assigned Handle from `envelope.` (see [§B3](#b3--non-const-handlet-output-positions-elided-from-the-js-signature)). +5. Where the C++ method has a native return value and the envelope appears, read it as `envelope.returnValue`. +6. Adopt `using` on envelope returns and class returns that own C++ resources — v3 wires `[Symbol.dispose]()` into both. Calls that return `void` or a primitive don't need it. + +### B3 — Non-const `Handle&` output positions elided from the JS signature + +Methods with non-const `Handle&` output parameters no longer accept a JS-side placeholder for those positions. v3 drops the Handle position from the JS-facing signature entirely; the C++ optional_override lambda declares a stack-local null Handle internally and forwards it into the call by reference. The resulting wrapper is surfaced as a field on the return envelope, disposed by the envelope's `[Symbol.dispose]`. + +Rationale: OCCT's contract guarantees that non-const `Handle&` is output-only — C++ never reads the input. v2 required callers to allocate a placeholder Handle wrapper (`new oc.Handle_()`) for each such position; that allocation was write-only from C++'s perspective and pure overhead from JS's. v3 elides those positions, eliminating the JS Embind wrapper and C++ `smart_ptr` allocation per call. Empirical benchmarks show ~2.29× wall-clock speedup and half the JS wrapper allocations on affected call sites. + +Reference smoke test: [`tests/smoke/smoke-handle-output-elision.test.ts`](tests/smoke/smoke-handle-output-elision.test.ts). + +**Before** (v2 — caller allocates a Handle placeholder for every `Handle&` output position): + +```ts +const poly = new oc.Handle_Poly_PolygonOnTriangulation(); +const tri = new oc.Handle_Poly_Triangulation(); +oc.BRep_Tool.PolygonOnTriangulation(edge, poly, tri, loc); +console.log(poly, tri); // populated in place by C++ +// loc (a class output) is mutated in place — read from your local `loc`. +``` + +**After**: + +```ts +using r = oc.BRep_Tool.PolygonOnTriangulation(edge, loc); +console.log(r.P, r.T); // freshly-assigned Handles owned by r's Symbol.dispose +// loc (a class output) is mutated in place — read its updated value directly, +// it is never echoed into r per the §B2 class-in-place rule. +``` + +Other affected signatures (full list materialises in `dist/opencascade_full.d.ts`): + +| Method | v2 (caller allocates `new oc.Handle_()` for each elided slot) | v3 (slot elided) | +| ----------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------ | +| `GeomInt_IntSS.BuildPCurves` | `BuildPCurves(f, l, Tol, S, C, new oc.Handle_Geom2d_Curve())` | `BuildPCurves(f, l, Tol, S, C)` | +| `ShapeAnalysis_Edge.TreatRLine` | `TreatRLine(RL, S1, S2, new oc.Handle_Geom_Curve(), new oc.Handle_Geom2d_Curve(), new oc.Handle_Geom2d_Curve(), tol)` | `TreatRLine(RL, S1, S2, tol)` | +| `ShapeConstruct.JoinCurves` (and many `New*` methods) | `NewCurve(edge, loc, tol, new oc.Handle_Geom_Curve())` | `NewCurve(edge, loc, tol)` | +| `HelixGeom_BuilderApproxCurve3d.ApprHelix` | `ApprHelix(t1, t2, pitch, rStart, taper, isCW, tol, new oc.Handle_Geom_Curve(), maxErr)` | `ApprHelix(t1, t2, pitch, rStart, taper, isCW, tol, maxErr)` | + +(The exact Handle wrapper class name varied by method; the shape — one allocation per `Handle&` output slot — was uniform across v2.) + +**Action**: + +1. Drop every non-const `Handle&` argument from your call sites; the position is no longer part of the JS signature. +2. Stop allocating `new oc.Handle_()` placeholders for output-only Handle slots — C++ never read them, and v3 has no slot to put them in. +3. Read the freshly-assigned Handle from `envelope.` on the returned envelope (in v2 you read it from the placeholder you passed in; v3 puts it on the envelope instead). + +### B4 — Envelope return field naming: `envelope.returnValue` + +Inside every envelope return ([§B2](#b2--output-parameter-return-shape-class-outputs-mutate-in-place-envelopes-only-when-js-truly-needs-them) row 4 and 5), the field that surfaces the C++ method's native return value is `returnValue`. The name is reserved to avoid collision with OCCT parameters literally named `result` — roughly a dozen public OCCT methods declare a parameter under that name, so the envelope keeps `returnValue` exclusively for the C++ method's native return and surfaces an OCCT-named `result` parameter as `envelope.result` without one shadowing the other. + +Concretely: + +- `BRep_Tool.Curve` (Handle return + primitive outs): `r.returnValue, r.First, r.Last` +- `XCAFDoc_ClippingPlaneTool.GetClippingPlane` (boolean return + Handle + primitive): `r.returnValue, r.theName, r.theCapping` +- `FairCurve_Batten.Compute` (`FairCurve_AnalysisCode` enum return + primitive outs): `r.returnValue, r.` + +Envelopes whose C++ return is `void` (e.g. `Geom_Surface.Bounds`) do not carry a `returnValue` field — they only carry the primitive/Handle outputs. + +**Collision fallback** — if a future OCCT method declares a parameter named `returnValue`, the codegen falls back to a suffixed name (`returnValue_`) for the parameter so the C++ return always stays at `envelope.returnValue`. This makes `returnValue` the stable, documented field name across every release. + +**Action**: when adopting the v3 envelope shape ([§B2](#b2--output-parameter-return-shape-class-outputs-mutate-in-place-envelopes-only-when-js-truly-needs-them)), read the native C++ return as `envelope.returnValue`. v2 surfaced the native return directly as the call expression's value (no envelope), so there is no field rename to apply — the change is structural, not a search-and-replace. + +--- + +## Section C — WebAssembly exception handling + +### C1 — Why this changed + +v2's exception build wrapped every potentially-throwing call site in a JavaScript `invoke_*` trampoline (`-fexceptions` / `-sDISABLE_EXCEPTION_CATCHING=0`). That added ~80% gzipped binary overhead. + +v3 uses native WASM exceptions (`-fwasm-exceptions`): the `throw` and `catch` instructions live in the WASM bytecode itself, the JS trampolines disappear, and the gzipped exception overhead drops to ~12%. The happy path has zero overhead. + +The shipped `full.yml` build is linked with the helpers needed to decode exceptions from JS (`-sEXPORT_EXCEPTION_HANDLING_HELPERS`). Browser support: see [Compatibility floor](#compatibility-floor). + +### C2 — Catch / decode pattern (consumer-facing) + +A caught exception is now a `WebAssembly.Exception`, decodable via the runtime helpers. The pattern below is the same one used by [`tests/smoke/smoke-exceptions.test.ts`](tests/smoke/smoke-exceptions.test.ts): + +```ts +import init from 'opencascade.js'; +const oc = await init({ locateFile }); + +try { + using cone = new oc.BRepPrimAPI_MakeCone(1, 0.5, 0); // Standard_DomainError: zero height + void cone.Shape(); +} catch (e) { + if (e instanceof WebAssembly.Exception) { + const [type, message] = oc.getExceptionMessage(e); + console.error(`${type}: ${message}`); + oc.decrementExceptionRefcount(e); + } else if (typeof e === 'number') { + // Legacy embind exception pointer — decode via OCJS helper + const failure = oc.OCJS.getStandard_FailureData(e); + console.error(failure.what()); + } else { + throw e; + } +} +``` + +Key APIs (all live on the OC instance returned by `init()`): + +- `oc.getExceptionMessage(e)` → `[typeName, message]` tuple +- `oc.incrementExceptionRefcount(e)` / `oc.decrementExceptionRefcount(e)` → manual refcount management when storing the exception across scopes +- `oc.OCJS.getStandard_FailureData(ptr)` → richer decode for OCCT `Standard_Failure` payloads +- `oc.OCJS.exceptionsEnabled()` → feature-detect at runtime (returns `false` for builds without exceptions) + +**Action**: replace any `try { … } catch (rawPointer)` style with the `WebAssembly.Exception` branch above. If you support both old and new builds, gate on `oc.OCJS.exceptionsEnabled()`. + +### C3 — Build flag migration (custom builds only) + +Skip this if you consume the published tarball. + +**Before** + +```yaml +emccFlags: + - -fexceptions + - -sDISABLE_EXCEPTION_CATCHING=0 +``` + +**After** + +```yaml +emccFlags: + - -fwasm-exceptions + - -sEXPORT_EXCEPTION_HANDLING_HELPERS +``` + +Every `.o` file in your build must use the same exception ABI; mixing `-fexceptions` and `-fwasm-exceptions` produces an unresolved `__cpp_exception` import at link time. The `OCJS_EXCEPTIONS=1` env var (or any of the named configurations in [`build-configs/configurations.json`](build-configs/configurations.json) that set it) handles this consistently. + +--- + +## Section D — OCCT V8 API breaking changes + +OCCT itself moved from V7.6.2 → V8.0.0 (commit `d3056ef`). The classes and methods below are the V8 changes that surface in JavaScript code. + +### D1 — `TopoDS` namespace bridge + +OCCT's `TopoDS` is a C++ namespace, not a class, so Embind cannot bind it directly. v3 ships a bridge class registered under the name `TopoDS` that exposes the eight downcast functions as static methods. + +Reference: [`tests/smoke/smoke-output-params.test.ts:126`](tests/smoke/smoke-output-params.test.ts), `dist/opencascade_full.d.ts:202837`. + +**Before** (v2 patterns varied — `prototype.Edge`, `_TopoDS_Edge`, manual `getPointer`, etc.) + +```ts +const edge = oc._TopoDS_Edge(shape); +``` + +**After** + +```ts +const edge = oc.TopoDS.Edge(shape); +const face = oc.TopoDS.Face(shape); +const wire = oc.TopoDS.Wire(shape); +const vertex = oc.TopoDS.Vertex(shape); +const shell = oc.TopoDS.Shell(shape); +const solid = oc.TopoDS.Solid(shape); +const compound = oc.TopoDS.Compound(shape); +const compSolid = oc.TopoDS.CompSolid(shape); +``` + +**Action**: rewrite cast call sites to `oc.TopoDS.(shape)`. + +### D2 — `Bnd_Box::Get` / `Bnd_Box2d::Get` removed + +OCCT V8 dropped the six-output-parameter accessor in favour of corner getters. + +Reference: `dist/opencascade_full.d.ts:19008`. + +**Before** + +```ts +const xMin = { current: 0 }, + yMin = { current: 0 }, + zMin = { current: 0 }; +const xMax = { current: 0 }, + yMax = { current: 0 }, + zMax = { current: 0 }; +box.Get(xMin, yMin, zMin, xMax, yMax, zMax); +console.log(xMin.current, yMin.current, zMin.current); +``` + +**After** + +```ts +using min = box.CornerMin(); +using max = box.CornerMax(); +console.log(min.X(), min.Y(), min.Z(), max.X(), max.Y(), max.Z()); +``` + +`Bnd_Box2d` follows the same pattern with 2D `CornerMin()` / `CornerMax()` returning `gp_Pnt2d`. + +**Action**: replace every `box.Get(…)` call with corner getters. + +### D3 — `Poly_Triangulation` normals API + +v2's `HasNormals()` + per-pass output reference is replaced by `HasNormals()` + value-returning `Normal(index)`. + +Reference: `dist/opencascade_full.d.ts:20576-20624`. + +**Before** + +```ts +if (tri.HasNormals()) { + for (let i = 1; i <= tri.NbNodes(); i++) { + const normal = new oc.gp_Dir(0, 0, 1); + tri.Normal(i, normal); + consume(normal); + } +} +``` + +**After** + +```ts +if (tri.HasNormals()) { + for (let i = 1; i <= tri.NbNodes(); i++) { + using normal = tri.Normal(i); // returns gp_Dir + consume(normal); + } +} +``` + +To set normals, use `tri.SetNormal(i, gpDir)` (replaces v2's mutate-in-place callbacks). + +**Action**: remove caller-allocated `gp_Dir` placeholders from normal iteration loops. + +### D4 — `BRepMesh_IncrementalMesh` constructor signature + +OCCT V8 reorganised the constructor overload set. The previously-common 5-arity convenience constructor is still available, but it now sits alongside additional `IMeshTools_Parameters`-based overloads, and the canonical signature has changed parameter order. + +Reference: `dist/opencascade_full.d.ts:82824-82831`. + +**Before** (v2 `_N`-suffixed dispatch) + +```ts +const mesh = new oc.BRepMesh_IncrementalMesh_2(shape, 0.1, false, 0.5, false); +``` + +**After** + +```ts +using mesh = new oc.BRepMesh_IncrementalMesh(shape, 0.1, false, 0.5, false); +// or with parameter object: +using params = new oc.IMeshTools_Parameters(); +params.Deflection = 0.1; +params.Angle = 0.5; +using meshFromParams = new oc.BRepMesh_IncrementalMesh(shape, params); +``` + +**Action**: drop the `_N` suffix; if your call site looks ambiguous, check the matching overload arity in `dist/opencascade_full.d.ts`. + +### D5 — `TopoDS_Shape::HashCode` removed + +OCCT V8 removed the member function `TopoDS_Shape::HashCode(upperBound)` in favour of `std::hash`. There is no JS-side replacement in the published build. + +**Before** + +```ts +const bucket = shape.HashCode(1024); +``` + +**After (consumer-side)** — derive a bucket from a stable shape property you already track, or maintain an external `Map` keyed by reference identity for the lifetime of the shape. + +**After (custom build)** — if you need the original bucket-mod-N semantics, inject a wrapper into your own YAML's `additionalCppCode`: + +```cpp +#include +#include + +class OCJS_ShapeHasher { +public: + static int HashCode(const TopoDS_Shape& shape, int upperBound) { + if (upperBound <= 0) return 0; + size_t h = std::hash{}(shape); + return static_cast((h % static_cast(upperBound)) + 1); + } +}; +``` + +```yaml +bindings: + - symbol: OCJS_ShapeHasher +``` + +Then call it as `oc.OCJS_ShapeHasher.HashCode(shape, 1024)`. + +**Action**: remove `.HashCode()` calls; either accept the loss or rebuild a custom variant with the snippet above. + +### D6 — Constructor and method "renumbering" advice is inverted from V7.x + +OCCT V7.x-era v2 docs told consumers to read the `_N` suffix off the generated `.d.ts` and use it verbatim. v3's suffix-free overloads (Section B1) collapse most of those — so the new advice is: + +1. Drop the `_N` suffix. +2. Only consult the `.d.ts` for the genuinely ambiguous cases that still emit suffixes (constructors / methods with two overloads sharing an arity). + +If you have a working V7 codebase, search-and-replace `oc.gp_Pnt_3` → `oc.gp_Pnt` etc. and let TypeScript point out the few remaining ambiguous cases. + +### D7 — Same-arity overload dispatch unified, legacy `int`/`size_t` pairs deduplicated + +Every same-arity method-overload group is now backed by a **single** embind val-dispatcher per access mode. Previously each JS-distinguishable overload was registered as its own `.function("Name", select_overload<…>(…))` entry, and embind's method table — keyed on `(name, arity)` — silently dropped every registration except the last. The surviving overload was the only one reachable from JS, which manifested as confusing `BindingError` failures on calls that the `.d.ts` declared as valid (e.g. `XCAFDoc_ColorTool::SetColor(TopoDS_Shape, Quantity_Color, …)`, `NCollection_List_TopoDS_Shape::Append(TopoDS_Shape)`). + +Two consumer-visible consequences: + +1. **JS-indistinguishable primitive pairs are collapsed at codegen time.** OCCT V8's NCollection `size_t` API migration ([OCCT `#1212`](https://dev.opencascade.org/content/occt-800)) introduced parallel `int`/`size_t` overloads for every indexed-container accessor (`NCollection_IndexedMap::FindKey`, `Substitute`, `RemoveLast` callsites, etc.). JS classifies both as `"number"`, so the dispatcher cannot distinguish them at runtime. The codegen now keeps the V8-modern `size_t` variant and drops the legacy `int` variant — only one entry survives per JS-equivalent signature. The `_N`-suffixed variants for these specific pairs are no longer emitted because there is no longer ambiguity to disambiguate. + +2. **Mixed static + instance same-arity groups now emit both `class_function` and `function`.** A handful of OCCT classes expose `static` and non-`static` overloads with identical arity (e.g. `XCAFDoc_ColorTool::GetColor` has a `static GetColor(TDF_Label, …)` family and an instance `GetColor(TopoDS_Shape, …)` family with the same arity). Previously the entire group was registered as one instance `.function(…)` and `oc.Class.foo(...)` static call sites hit an arity mismatch. Both shapes now exist on the JS class: `oc.XCAFDoc_ColorTool.GetColor(label, type, color)` (static) and `colorTool.GetColor(shape, type, color)` (instance) both dispatch correctly. + +```ts +// Before — only one survived, the rest BindingError'd at runtime. +const map = new oc.NCollection_IndexedMap_TopoDS_Shape_TopTools_ShapeMapHasher(); +// ... +const key = map.FindKey_1(1); // worked +const key = map.FindKey_2(1); // worked +const key = map.FindKey(1); // ❌ TypeError: map.FindKey is not a function + +// After — single primary entry, no suffixed variants for this group. +const key = map.FindKey(1); // ✅ dispatches to the size_t overload +``` + +**Action**: existing call sites that already used the unsuffixed name now succeed where they previously threw. If your code path explicitly references a `_1` / `_2` suffix on one of the JS-indistinguishable primitive-pair overloads (notably the V8 `int`/`size_t` NCollection accessors), drop the suffix — the bare name resolves to the `size_t` overload. + +> **Perf note.** The unified val-dispatcher imposes ~264 ns per same-arity call (~6 ns on methods with no overload ambiguity), totalling ~5 µs of dispatch overhead per typical CAD render — 0.003–0.011% of wall time. Full matrix and reproducibility: [BENCHMARKS.md §3.2](BENCHMARKS.md#32--per-call-cost-same-arity-dispatch-tax-poc-overload-dispatch-cost). + +--- + +## Section E — Removed symbol families + +The following families are excluded from the v3 default build entirely. Calls compile against TypeScript as `undefined` member access (no `.d.ts` declaration). + +| Family | Why | Migration | +| ----------------------------------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------- | +| `OpenGl_*`, `Aspect_Window`, the rest of `TKOpenGl` | The package targets headless CAD; interactive rendering is out of scope. | Render with your own engine (Three.js, Babylon, etc.) using triangulation extracted via `Poly_Triangulation`. | +| `TopOpe*` | Deprecated in OCCT itself; superseded by `BOPAlgo_*` and `BRepAlgoAPI_*`. | Use `BRepAlgoAPI_Fuse` / `Cut` / `Common` / `Section`, or the lower-level `BOPAlgo_*` machinery. | +| Several `Standard_Transient`-based legacy collections | Deprecated in OCCT V8; the auto-discovered `NCollection_*` variants cover the same cases. | Use the `NCollection_Array1_*` / `NCollection_Sequence_*` aliases that auto-discovery now emits. | +| `GCE2d_*` aliases | OCCT V8 normalised on `GC_*2d` spellings. | Use `GC_MakeCircle2d`, `GC_MakeArcOfCircle2d`, etc. | + +If your application depends on any of these and you cannot migrate, build a custom variant from source that adds them to the YAML `bindings` list — the codegen still understands them, they are just excluded from the published `full.yml`. + +--- + +## Section F — Build flag changes + +Skip if you only consume the prebuilt tarball. + +### F1 — Build CLI: `build-wasm.sh` with explicit subcommands and named configurations + +v2's source build was driven by Python scripts inside the Docker image — the image's `ENTRYPOINT` was `src/buildFromYaml.py`, and invocation passed your YAML config path straight through. v3 collapses the entry surface into a single shell wrapper, `build-wasm.sh`, with explicit subcommands (`full`, `link`, `validate`) and an optional `--config ` flag that selects an optimisation profile from [`build-configs/configurations.json`](build-configs/configurations.json). The Docker image's `ENTRYPOINT` is now `build-wasm.sh`, so the same arguments pass through inside or outside Docker. + +**Before** (v2 — Docker entrypoint runs `buildFromYaml.py` against your YAML; native builds called the Python scripts directly): + +```bash +docker run --rm -v "$(pwd):/src" donalffons/opencascade.js /src/your-config.yml +# or, on a host with the source tree: +python3 src/buildFromYaml.py /path/to/your-config.yml +``` + +**After** (v3 — explicit subcommand, optional `--config` flag, same Docker / host parity): + +```bash +docker run --rm -v "$(pwd):/src" ghcr.io/taucad/opencascade.js:beta \ + --config single-threaded full /src/your-config.yml +# or, on a host with the source tree: +./build-wasm.sh --config single-threaded full build-configs/full.yml +./build-wasm.sh --config single-threaded-smallest full build-configs/full.yml +./build-wasm.sh --config multi-threaded full build-configs/full.yml +./build-wasm.sh --config debug full build-configs/full.yml +``` + +The four shipped configurations (full env-var matrix in [BUILD_SYSTEM.md](BUILD_SYSTEM.md)) — every entry ships with native WASM exceptions, `EVAL_CTORS=2`, and Closure on; they differ only in optimisation level, threading, and wasm-opt budget: + +| Name | Purpose | +| -------------------------- | -------------------------------------------------------------------------------------------------------------------- | +| `single-threaded` | What the published tarball is built with: `-O3`, baseline SIMD, BigInt, wasm-opt `-O4`, converge. Browser default. | +| `single-threaded-smallest` | Size-tuned variant: `-Os` compile + wasm-opt `-O3`. Same feature set, smaller binary at a ~5–10% runtime cost. | +| `multi-threaded` | `-O3` + SIMD + native exceptions, threading on. For COOP/COEP-isolated, SAB-enabled deployments. | +| `debug` | `-O0` compile + wasm-opt `-O0`, SIMD off, converge off. Fastest build for iteration — not for production. | + +v2 had no named-configuration system — the YAML's `emccFlags` block was the only knob, and consumers hand-tuned per build. v3's `--config ` layers curated defaults on top of your YAML; add your own entry to `configurations.json` if none of the shipped profiles fit. + +### F2 — Reference `full.yml` bundled in the image; exceptions on by default + +v2 shipped example YAML templates (`customBuild_example.yml` and friends) and expected consumers to hand-write their config from scratch. v3 bundles a reference `full.yml` inside the Docker image at `/opencascade.js/build-configs/full.yml` — the same ~4,400-symbol list the published tarball builds from — so consumers can extract it as a starting point and trim down. The reference YAML's `emccFlags` block carries v3's defaults: `-fwasm-exceptions`, `-sEXPORT_EXCEPTION_HANDLING_HELPERS`, `-sWASM_BIGINT`, `-sEVAL_CTORS=2`, `-msimd128`. + +**v3 workflow** — extract the reference, trim, build: + +```bash +# Extract the reference YAML out of the image +docker run --rm --entrypoint cat \ + ghcr.io/taucad/opencascade.js:beta \ + /opencascade.js/build-configs/full.yml > my-config.yml + +# Edit my-config.yml to trim symbols, then build +docker run --rm -v "$(pwd):/src" ghcr.io/taucad/opencascade.js:beta \ + --config single-threaded full /src/my-config.yml +``` + +To build a non-exceptions variant, override `OCJS_EXCEPTIONS=0` on top of a shipped configuration (every named entry in `configurations.json` sets it to `1` by default in v3) so the env wins over the YAML's exception flags, or copy `full.yml` and strip the EH lines. + +See the [trim-symbols guide](docs/guides/trim-symbols.md) for the full extract-trim-build workflow. + +### F3 — Removed and renamed Emscripten flags + +| Direction | Flag | +| --------- | ------------------------------------------------------------------ | +| Removed | `-sUSE_ES6_IMPORT_META=0` (default in Emscripten 5.x) | +| Removed | `-sDISABLE_EXCEPTION_CATCHING=0` (replaced by `-fwasm-exceptions`) | +| Removed | `-fexceptions` (replaced by `-fwasm-exceptions`) | +| Renamed | `-sLLD_REPORT_UNDEFINED` → `-sERROR_ON_UNDEFINED_SYMBOLS=0` | +| Added | `-fwasm-exceptions` (default for `full.yml`) | +| Added | `-sEXPORT_EXCEPTION_HANDLING_HELPERS` (default for `full.yml`) | +| Added | `-sWASM_BIGINT` (default for `full.yml`) | +| Added | `-sEVAL_CTORS=2` (default for `full.yml`) | +| Added | `-msimd128` (default for `full.yml`) | + +Memory flags (`-sINITIAL_MEMORY=100MB`, `-sMAXIMUM_MEMORY=4GB`, `-sALLOW_MEMORY_GROWTH=1`) are unchanged. + +--- + +## Appendix G — Performance & size + +No consumer action — included for "is upgrading worth it" context. + +### Performance vs. V7.6.2 + +Single-threaded, `-O3` link, no LTO. + +| Workload | Improvement | +| ------------------ | ------------- | +| Primitives | -3% to +2% | +| Boolean operations | 22-31% faster | +| Fillets | 16-19% faster | +| Sketches | 9-13% faster | +| Complex models | 23-29% faster | + +### Size (gzipped) vs. V7.6.2 + +| Build | V7.6.2 | V8 (v3) | Change | +| ---------------------- | -------- | ------- | ------ | +| Single (no exceptions) | 6.05 MB | 5.65 MB | -6.6% | +| With exceptions | 10.42 MB | 6.35 MB | -39.1% | +| Exception overhead | +72.2% | +12.4% | — | diff --git a/BUILD_SYSTEM.md b/BUILD_SYSTEM.md new file mode 100644 index 00000000..56742521 --- /dev/null +++ b/BUILD_SYSTEM.md @@ -0,0 +1,377 @@ +# Build System + +The opencascade.js build system uses **Nx** for task orchestration and caching, replacing the custom `build-cache.py` system. The underlying Python build scripts (`Common.py`, `compileBindings.py`, `buildFromYaml.py`) remain, but are now invoked through Nx targets with correct input hashing and cache management. + +## Architecture + +The central design principle: **compile-time configuration and link-time flags are orthogonal concerns controlled by different actors**. + +### Channel 1: Compile-time configuration (maintainer-controlled) + +- Defined in `build-configs/configurations.json` as named configurations +- Selected via `--config ` CLI argument or `OCJS_CONFIG` env var +- Sets `OCJS_*` env vars for compile, wasm-opt, and closure compiler steps +- Individual env vars can override any config value + +### Channel 2: Link-time flags (consumer-controlled) + +- Defined in the consumer YAML's `emccFlags` array +- Passed **verbatim** to `emcc` at link time — no stripping, no filtering +- Exactly the same API consumers have used since v7.6.2 + +## Component Glossary + +A reference map of every moving part in the bindgen pipeline. Grouped by role so the layering is visible: how source code flows from OCCT headers, through a parser, through a code generator, into a compiler, into a linker, and out as a WebAssembly module. + +The whole pipeline can be read top-to-bottom as: **F generates C++ from E using B/C/G; D then compiles+links that C++ into H.** + +### A. Toolchain meta-installers + +These manage *other* toolchains. They are not compilers or libraries themselves. + +| name | role | +| --- | --- | +| **emsdk** (Emscripten SDK) | A Python-based meta-installer that downloads and version-locks the entire Emscripten toolchain (clang, `emcc`, libc++, sysroot, node, etc.) as a single bundle. We pin a specific emsdk release in `DEPS.json`; running `scripts/clone-deps.sh` installs it under `deps/emsdk/`. The bundle's exact clang/libc++ commits come from emsdk's manifest, not from us. | +| **uv** (Astral) | Hermetic Python interpreter + venv manager. Reads `.python-version` and `requirements.txt` to install an exact CPython and an exact set of Python packages into `.venv/`. Has no role in C++ — it only sets up the Python that runs the bindgen scripts. | + +### B. The C++ frontend (what reads source code) + +Two distinct copies of clang are in play here. The distinction matters. + +| name | role | +| --- | --- | +| **clang** (the driver, from emsdk) | The `clang++` executable at `deps/emsdk/upstream/bin/clang`. Drives preprocessing → parsing → codegen → linking. Wrapped by `emcc` to inject wasm-specific defaults. Version is whatever emsdk's manifest pinned (currently ahead of any released LLVM). | +| **libclang** (the Python binding) | The pip package `libclang` exposes ctypes bindings to a `libclang.{so,dylib}` — the C library form of the clang frontend. The bindgen's discover pass uses this to parse OCCT headers into an AST it can walk. **This is a separate clang from the driver above** and its version is independent. Pinned in `requirements.txt`. | +| **clang resource directory** | A small directory of compiler-builtin headers (`stddef.h`, `stdint.h`, `arm_neon.h`, intrinsic shims) that ships *with* every clang at `lib/clang//include/`. Defines macros and types that depend on the compiler's own version (`__INT32_C`, `__builtin_ctzg`, etc.) and **must match the clang version reading them**. | + +> **Important pairing rule:** libclang and libc++ are released together from the LLVM monorepo and the LLVM project only supports pairings within ±1 major release (per the official libc++ compiler-support policy). The parse-side libclang version and the libc++ headers libclang reads must stay aligned. See "C. The C++ standard library" below. + +### C. The C++ standard library + +| name | role | +| --- | --- | +| **libc++** (a.k.a. **libcxx**) | LLVM's C++ standard library implementation — `std::vector`, `std::optional`, ``, etc. **At parse time only the headers matter**; the runtime is irrelevant to libclang. libc++ headers `#include` compiler intrinsics from the clang resource directory and assume a minimum clang version. The libc++ release that ships in `deps/emsdk/upstream/emscripten/system/lib/libcxx/include/` is whatever emsdk's vendored clang shipped with. | +| **libc++abi** | Companion runtime to libc++ providing exception types, RTTI helpers, demanglers. Statically linked into the wasm at compile/link time. Not consumed during parse. | + +### D. The emscripten compile/link layer + +| name | role | +| --- | --- | +| **emcc** | Emscripten's `clang++` wrapper at `deps/emsdk/upstream/emscripten/emcc`. Adds `-target wasm32-unknown-emscripten`, points clang at the emscripten sysroot, calls `wasm-ld` at link time, then runs `wasm-opt`. Build scripts invoke `emcc`, not `clang` directly. | +| **wasm-ld** (a.k.a. **lld**) | LLVM's WebAssembly linker. Takes `.o` files compiled by emcc and links them into a `.wasm` module. Performs dead-code elimination of unreferenced symbols — this is where the link-time NCollection filter operates. | +| **binaryen / wasm-opt** | Post-link wasm bytecode optimiser. Shrinks and optimises the linked module. Invoked by `emcc` at `-O2` and above. | +| **emscripten sysroot** | A faux POSIX environment for wasm builds (`inttypes.h`, `wchar.h`, pthread shims, OpenGL/EGL stubs, etc.) under `system/include/` and `cache/sysroot/include/`. Replaces the host OS's C library headers so wasm builds are OS-independent. | +| **embind** | C++ template library shipped inside emscripten that generates the JS↔C++ glue from `EMSCRIPTEN_BINDINGS(name) { class_(…); }` macro blocks. **This is the actual binding mechanism** — the bindgen emits embind code; embind expands at compile time to produce the JS shims. | + +### E. The OCCT source being wrapped + +| name | role | +| --- | --- | +| **OCCT** (OpenCASCADE Technology) | The CAD kernel we produce bindings for. ~13,000 C++ headers organised into "packages" (TKMath, TKGeomBase, TKBRep, etc.). Cloned to `deps/OCCT/` at the commit pinned in `DEPS.json`. | +| **NCollection** | OCCT's home-grown template-based container library (`NCollection_Array1`, `NCollection_HArray1`, `NCollection_Sequence`, `NCollection_DataMap`, etc.). Used pervasively as parameter and return types. The bindgen enumerates the specific instantiations reachable from bound classes and produces concrete wrappers for each — without this enumeration step the generated `.d.ts` would lose its type fidelity. | +| **Standard / Standard_Macro / Standard_Integer** | OCCT's foundational type system. `Standard_Integer = int`, `Standard_Real = double`, `Standard_EXPORT` = compiler visibility attribute, `Handle(T) = opencascade::handle`. Every OCCT header transitively includes this; its successful parse is a precondition for any class body downstream to parse. | +| **rapidjson** | Header-only JSON parser. OCCT uses it for glTF I/O. Pure headers, no compile required. Cloned to `deps/rapidjson/`. | +| **FreeType** | Font rendering library. OCCT depends on it for text annotations and 3D text features. Compiled to wasm and statically linked. Cloned to `deps/freetype/`. | + +### F. The bindgen (`src/ocjs_bindgen/`) + +Our code. Generates embind C++ from OCCT headers, then drives `emcc` to compile+link the result. + +| component | role | +| --- | --- | +| **`config/paths.py`** | Resolves include paths for the libclang parse, including the libc++ headers libclang reads. Single source of truth for where headers come from. | +| **`config/flags.py`** | Build-flag state machine consumed by the compile/link drivers. Implements the env-var precedence rules documented under [Flag Precedence](#flag-precedence). | +| **`ast/parse.py`** | The single `libclang.Index.parse()` call site. Builds the giant `myMain.h` translation unit from all OCCT includes and hands it to libclang. | +| **`discover.py`** | The NCollection enumeration pass. Walks bound class methods, extracts template instantiations from their parameter and return types, mangles them into manifest entries (e.g. `NCollection_HArray1` → `NCollection_HArray1_gp_Pnt`). Writes `build/ncollection-manifest.json`. | +| **`codegen/embind/`** | Generates the `EMSCRIPTEN_BINDINGS(name) { class_("X").function("foo", &X::foo); }` C++ source files that `emcc` compiles. | +| **`link/rewrite.py`** | Applies the link-time NCollection filter — restricts the wasm-ld link set to symbols actually reachable from the consumer's bound classes. | +| **`filters/`** | Header-level and package-level exclusion rules (read from `bindgen-filters.yaml`). Drops OCCT packages that have no wasm meaning (OpenGL platform headers, OSD platform abstractions, etc.) before they reach the parse stage. | +| **`docs/`** | Doxygen-comment extractor; folds OCCT's `/** … */` blocks into JSDoc on the generated `.d.ts`. | +| **`build_drivers/`** | Subprocess wrappers around `emcc`, `wasm-ld`, `wasm-opt`, Closure Compiler, etc. The boundary between Python orchestration and shell processes. | + +### G. Per-build artifacts (regenerated each run) + +These are *not* source — they're intermediate files the pipeline produces and re-uses. + +| artifact | role | +| --- | --- | +| **`build/occt-includes/`** (the **flat include directory**) | A symlink farm aliasing every OCCT header by its bare basename, so `#include "Poly_Triangulation.hxx"` resolves without enumerating every OCCT subdirectory on `-I`. Built by `buildFlatIncludes()` in `paths.py`. | +| **`build/pch.h`** + **`build/pch.h.pch`** (the **precompiled header**) | A single header that `#include`s every OCCT and embind header, then precompiled by emcc into a binary form. Every embind translation unit at compile time loads the PCH instead of re-parsing thousands of headers — gives a ~25× compilation speedup. Pure compile-side optimisation; does not affect the libclang discover pass. | +| **`build/ncollection-manifest.json`** | Deduped list of `NCollection_*` instantiations the discover pass enumerated from the consumer's bound classes. Consumed by the link-time filter to retain only the symbols actually needed. | +| **`build/occt-cmake/`** | OCCT object files produced by `emcmake cmake` build of OCCT itself. These get linked into the final wasm by `wasm-ld`. Cached per compile-config. | + +### H. Support tooling + +| name | role | +| --- | --- | +| **CMake** | Configures and drives OCCT's own C++ build (compiles OCCT's `.cxx` into object archives) before `emcc` links them into wasm. Run via `emcmake cmake` to inject `emcc` as the compiler. Pinned in `requirements.txt`. | +| **Doxygen** | Parses OCCT's `/** … */` comments into XML; `extract-docs.py` folds that into the generated `.d.ts` JSDoc. Does not touch the wasm itself. Uses the system-installed `doxygen`. | +| **Nx** | Workspace build orchestrator. Caches per-task outputs so re-running unchanged steps is a no-op. The host build pipeline goes through Nx targets. See [Caching Behavior](#caching-behavior). | +| **Docker** | Alternative isolation: the same scripts run inside a Linux container with emsdk pre-installed. See [Consumer Workflows → Docker](#docker). | +| **Node.js** | Runs the JS-side smoke tests and `npm pack` for distribution. Pinned via `.nvmrc`. Not in the parse or compile pipelines. | + +### Build outputs (what the pipeline produces) + +The output set per consumer YAML. Names come from the YAML's `mainBuild.name` (here illustrated as `my_build`). + +| artifact | role | +| --- | --- | +| **`my_build.wasm`** | The compiled WebAssembly module — OCCT geometry kernel, embind glue, all linked together. The thing browsers and Node load. | +| **`my_build.js`** | JS wrapper emitted by `emcc` — module loader, exported function thunks, embind runtime. Imports the `.wasm` and exposes the JS API. | +| **`my_build.d.ts`** | TypeScript declarations emitted by the bindgen's codegen. Type fidelity here depends on the discover pass having enumerated every reachable NCollection instantiation; gaps surface as `: number` or `: unknown` downgrades. | +| **`my_build.js.symbols`** | Symbol table emitted by `wasm-ld`. Useful for diffing two builds to see which symbols were retained or dropped. | + +### How the components flow together + +A single end-to-end build, with each step labelled by which component does the work: + +1. **A** (`clone-deps.sh`) materialises **emsdk**, **OCCT**, **rapidjson**, **FreeType** under `deps/`. +2. **A** (`uv`) creates `.venv/` and installs **F**'s Python dependencies (including the **B** `libclang` binding). +3. **F** (`paths.py`, `buildFlatIncludes()`) builds **G** (the flat include directory). +4. **F** (`paths.py`, `buildPch()`) calls **D** (`emcc`) to build **G** (the PCH). +5. **F** (`ast/parse.py`) calls **B** (`libclang`) to parse **E** (OCCT headers via the flat include dir) using **C** (`libc++` headers). +6. **F** (`discover.py`) walks the resulting AST and writes **G** (`ncollection-manifest.json`). +7. **F** (`codegen/embind/`) generates embind C++ source. +8. **D** (`emcc`) compiles the generated source + OCCT source into `.o` files, using the **G** PCH for speed. +9. **D** (`wasm-ld`) links the `.o` set into a `.wasm`, with **F** (`link/rewrite.py`) applying the NCollection filter. +10. **D** (`wasm-opt`) shrinks the linked wasm. +11. The build outputs (`my_build.wasm`, `.js`, `.d.ts`, `.symbols`) land in the consumer's chosen output directory. + +The [Task Graph](#task-graph) below is the Nx-orchestrated version of steps 4–10 with the parallelism and caching annotations. + +## Task Graph + +``` +setup (uncached) → pch → generate → compile-bindings ─┐ + │ ├─→ link → build + └─→ compile-sources ───────────────┘ +``` + +`compile-bindings` and `compile-sources` run in parallel after `pch` completes. + +## configurations.json + +All named compile-time configurations live in `build-configs/configurations.json`. Each entry is a map of `OCJS_*` environment variable names to values. + +### Supported keys + +The **bare default** column is what `build-wasm.sh` would fall back to if you set neither an env var nor `--config`. The **`single-threaded` config** column is what `configurations.json`'s `single-threaded` entry sets — the production default that the published tarball is linked with and what `build-wasm.sh` selects when `OCJS_CONFIG` and `--config` are both unset (see the `OCJS_CONFIG="${OCJS_CONFIG:-single-threaded}"` fallback in `build-wasm.sh`). All four shipped configurations (`single-threaded`, `single-threaded-smallest`, `multi-threaded`, `debug`) ship with native WASM exceptions, `EVAL_CTORS=2`, and Closure on; they differ on opt level, threading, and wasm-opt budget. + +| Key | Description | Bare default | `single-threaded` config | +| --------------------- | ------------------------------------------------------- | ----------------- | ------------------------ | +| `OCJS_OPT` | Compile optimization level (`-O0`, `-O2`, `-O3`, `-Os`) | `-O2` | `-O3` | +| `OCJS_LTO` | Enable LTO at compile time (`0` or `1`) | `0` | `0` | +| `OCJS_EXCEPTIONS` | Enable native WASM exceptions (`0` or `1`) | `0` | `1` | +| `OCJS_EH_MODE` | Exception handling mode (`wasm` or `js`) | `wasm` | `wasm` | +| `OCJS_SIMD` | Enable baseline SIMD (`-msimd128`, `0` or `1`) | `0` | `1` | +| `OCJS_RELAXED_SIMD` | Enable Relaxed SIMD opcodes (requires `OCJS_SIMD=1`; Safari 26.x does not yet implement Relaxed SIMD) | `0` | `0` | +| `OCJS_BIGINT` | Enable `-sWASM_BIGINT` for native i64↔BigInt | `0` | `1` | +| `THREADING` | Threading mode (`single-threaded` or `multi-threaded`) | `single-threaded` | `single-threaded` | +| `OCJS_DEFINES` | Comma-separated C preprocessor defines | _(empty)_ | `OCCT_NO_DUMP` | +| `OCJS_UNDEFINES` | Comma-separated C preprocessor undefines | _(empty)_ | `OCC_CONVERT_SIGNALS` | +| `OCJS_WASM_OPT_LEVEL` | wasm-opt optimization level | `-O3` | `-O4` | +| `OCJS_CLOSURE` | Run Closure Compiler (`true` or `false`) | `false` | `true` | +| `OCJS_EVAL_CTORS` | Enable Emscripten eval ctors (`true` or `false`) | `false` | `true` | +| `OCJS_EVAL_CTORS_LEVEL` | `-sEVAL_CTORS=N` level when `OCJS_EVAL_CTORS=true` | `2` | `2` | +| `OCJS_CONVERGE` | Use `--converge` in wasm-opt (`true` or `false`) | `false` | `true` | +| `OCJS_MALLOC` | Heap allocator (`dlmalloc` or `mimalloc`) | `dlmalloc` | `mimalloc` | +| `OCJS_EXTRA_CFLAGS` | Extra compile flags appended to C/CXX | _(empty)_ | _(empty)_ | + +### Adding a new configuration + +Add an entry to `build-configs/configurations.json`: + +```json +{ + "my-experiment": { + "OCJS_OPT": "-O3", + "OCJS_LTO": "1", + "OCJS_EXCEPTIONS": "0", + "OCJS_SIMD": "1", + "OCJS_BIGINT": "1", + "THREADING": "single-threaded", + "OCJS_WASM_OPT_LEVEL": "-O4", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_CONVERGE": "true" + } +} +``` + +Unspecified keys fall back to the bare defaults in `build-wasm.sh` (see the table above). + +## Consumer YAML Format + +The consumer YAML format is unchanged from v7.6.2: + +```yaml +mainBuild: + name: my_build.js + bindings: + - symbol: TopoDS_Shape + - symbol: BRepBuilderAPI_MakeEdge + emccFlags: + - -O3 + - -flto + - -fwasm-exceptions + - -sEXPORT_ES6=1 + - -sMODULARIZE + - -sALLOW_MEMORY_GROWTH=1 + - -sWASM_BIGINT + - --no-entry +``` + +All `emccFlags` are passed **verbatim** to `emcc` at link time. The consumer has full control over link-time behavior. + +## Fill-Not-Strip Rules + +When linking, the build system applies "fill-not-strip" logic for optimization and LTO flags: + +1. If consumer `emccFlags` already contains an `-O*` flag → used as-is +2. If consumer `emccFlags` lacks `-O*` → the config's `OCJS_OPT` value is added (default: `-O2`) +3. If consumer `emccFlags` already contains `-flto` → used as-is +4. If consumer `emccFlags` lacks `-flto` and `OCJS_LTO=1` → `-flto` is added + +Consumer flags are never stripped or modified. + +## Flag Precedence + +For compile-time flags, precedence is (highest to lowest): + +1. Explicit env var in the shell (e.g., `OCJS_OPT=-Os`) +2. Value from `configurations.json` entry (via `--config`) +3. `build-wasm.sh` built-in defaults + +## Consistency Validation + +The build system warns (non-fatal) when compile-time and link-time flags are mismatched: + +- Compiled with `OCJS_EXCEPTIONS=1` but emccFlags has `-sDISABLE_EXCEPTION_CATCHING=1` +- Compiled with `OCJS_SIMD=1` but emccFlags lacks `-msimd128` +- Compiled without exceptions but emccFlags has `-fwasm-exceptions` + +## Caching Behavior + +Nx computes cache keys from `namedInputs` defined in `nx.json`: + +- **compileConfig**: `configurations.json` content, `OCJS_CONFIG`, and all compile-time `OCJS_*` env vars +- **linkConfig**: Post-processing env vars (`OCJS_WASM_OPT_LEVEL`, `OCJS_CLOSURE`, `OCJS_CONVERGE`, etc.) +- **toolchain**: `emcc --version` output +- **depsVersion**: `DEPS.json` content +- **generatorCode**: All `src/**/*.py` files and `bindgen-filters.yaml` + +### Cache sharing + +Same config + different consumer YAMLs → compile targets cache-hit, link target cache-miss. +Different configs → fully separate compile caches. + +### Debugging cache misses + +```bash +npx nx show project ocjs # Show resolved project config +NX_VERBOSE_LOGGING=true npx nx run ocjs:pch # Verbose logging +``` + +## Maintainer Workflows + +### Full build with a named configuration + +```bash +./build-wasm.sh --config single-threaded full path/to/consumer.yml +``` + +### Link only (reuses compile cache) + +```bash +./build-wasm.sh --config single-threaded link path/to/consumer.yml +``` + +### Override a single flag from the config + +```bash +OCJS_WASM_OPT_LEVEL=-O4 ./build-wasm.sh --config single-threaded full consumer.yml +``` + +### Using Nx directly + +```bash +OCJS_CONFIG=single-threaded OCJS_YAML=path/to/consumer.yml npx nx run ocjs:build +``` + +### Running individual targets + +```bash +OCJS_CONFIG=single-threaded npx nx run ocjs:pch +OCJS_CONFIG=single-threaded npx nx run ocjs:generate +OCJS_CONFIG=single-threaded npx nx run ocjs:compile-bindings +OCJS_CONFIG=single-threaded npx nx run ocjs:compile-sources +OCJS_CONFIG=single-threaded OCJS_YAML=consumer.yml npx nx run ocjs:link +``` + +## Consumer Workflows + +### Docker + +```bash +docker run -e OCJS_CONFIG=single-threaded \ + -v $(pwd)/my-config.yml:/src/config.yml \ + -v $(pwd)/output:/output \ + opencascade-js link config.yml +``` + +### Checkout-based + +```bash +cd repos/opencascade.js +./scripts/clone-deps.sh +./build-wasm.sh --config single-threaded full path/to/consumer.yml +``` + +## Self-Contained Dependencies + +Run `scripts/clone-deps.sh` to clone all dependencies into `deps/` (pass +`--dest ` to target a different location, e.g. `--dest ..` for the +legacy sibling layout): + +- `deps/emsdk/` — Emscripten SDK (version from `DEPS.json`) +- `deps/OCCT/` — OpenCASCADE Technology (pinned commit) +- `deps/rapidjson/` — RapidJSON (pinned commit) +- `deps/freetype/` — FreeType (pinned commit) + +The script is idempotent and validates pinned commits when `OCJS_STRICT_DEPS=1`. + +## Migration from v2 + +v2 drove the source build through the Python entry point `src/buildFromYaml.py` (wrapped by the Docker image's `ENTRYPOINT`). v3 replaces that with a single shell wrapper, `build-wasm.sh`, sitting on top of Nx-managed bindgen / compile / link steps. Behaviours that consumers of a v2 custom build may need to adjust: + +| v2 | v3 | +| ------------------------------------ | --------------------------------------------------------- | +| `src/buildFromYaml.py ` | `./build-wasm.sh [--config ] ` | +| `../assimpjs/emsdk` (relative path) | `deps/emsdk/` (cloned via `clone-deps.sh`) | +| Flag stripping in `buildFromYaml.py` | Fill-not-strip (consumer flags pass through verbatim) | +| `OCJS_BIGINT` env var appendage | Consumer specifies `-sWASM_BIGINT` directly in emccFlags | +| `OCJS_EVAL_CTORS` env var appendage | Consumer specifies `-sEVAL_CTORS=N` directly in emccFlags | + +Cache and task-graph mechanics (Nx content-hashing, `npx nx reset` for cleanup, the `dependsOn` task graph) are v3-only and have no v2 equivalent — they replace the implicit single-shot Python pipeline. + +## Troubleshooting + +### Stale dependencies + +```bash +rm -rf deps/ && ./scripts/clone-deps.sh +``` + +### Unexpected cache miss + +Set `NX_VERBOSE_LOGGING=true` to see which inputs changed. + +### Flag consistency warnings + +These are non-fatal. They indicate a mismatch between compile-time configuration and consumer link-time flags. Review both your `--config` choice and consumer YAML's `emccFlags`. + +### Full cache reset + +```bash +npx nx reset +``` diff --git a/CHANGELOG.md b/CHANGELOG.md index bb1aed61..39aaa36c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,37 +1,158 @@ # Changelog -## v1.1.4 (unreleased) +## v3.0.0-beta.2 + +Final beta before release candidate. Adds the pre-built multi-threaded WASM to the published npm tarball. + +### Highlights + +- **Multi-threaded subpath exports** — `@taucad/opencascade.js/multi` (ESM loader + types) and `@taucad/opencascade.js/multi/wasm` (`opencascade_full_multi.wasm`). Consumers no longer need to rebuild from source to opt into pthread-enabled OCCT. +- **Smoke coverage** — `tests/smoke/smoke-package-exports.test.ts` guards the static exports contract; `tests/smoke/smoke-multi-threaded.test.ts` live-boots the MT binary when `SharedArrayBuffer` is available. +- **Documentation sweep** — README, BREAKING_CHANGES, BENCHMARKS, MAINTAINER, and ocjs.org docs updated for the `/multi` import surface, COOP/COEP prerequisites, and OCCT parallel activation. + +## v3.0.0 + +v3 is a ground-up modernisation: OCCT V8 (GA), native WebAssembly exceptions, ES modules, full TypeScript bindings with idiomatic JSDoc, content-addressed build caching, and reproducible builds via pinned dependency commits. + +**Full v2 → v3 migration guide:** [BREAKING_CHANGES.md](BREAKING_CHANGES.md) — every consumer-visible change with Before / After code samples and migration steps. + +### Highlights + +- **OCCT V8.0.0** (GA, up from V7.6.2) and **Emscripten 5.0.1** (up from 3.1.14). +- **libclang 18.1.1** for the bindgen parser (up from `15.0.6.1`), paired with vendored **LLVM 17.0.6** libc++ + clang resource headers to satisfy the LLVM project's libc++/clang N-1 compat-window policy. This is what makes the v3 bindings _accurate_ for OCCT V8 — libclang 18 exposes `templateTypedefs`, sees through `DEFINE_STANDARD_HANDLE` expansions, and resolves `NCollection_*` template instantiations that v2's libclang 15 either skipped, mislabelled as `UNEXPOSED`, or surfaced as duplicate registrations. The parse environment is hermetic: `src/ocjs_bindgen/config/paths.py` routes libclang at the vendored libc++ headers and clang resource directory, not at the host system's clang. +- **Native WebAssembly exceptions** (`-fwasm-exceptions`) replace JS `invoke_*` trampolines: ~12% gzipped size overhead vs. the prior ~80%, with zero happy-path performance cost. `WebAssembly.Exception` is decodable end-to-end via `getExceptionMessage`, `incrementExceptionRefcount`, `decrementExceptionRefcount`, and `OCJS.getStandard_FailureData` — see [§C](BREAKING_CHANGES.md#section-c--webassembly-exception-handling). +- **Performance vs. V7.6.2**: 22-31% faster boolean operations, 16-19% faster fillets, 23-29% faster complex models. Full numbers in [Appendix G](BREAKING_CHANGES.md#appendix-g--performance--size). +- **ES module distribution** — `"type": "module"`, single default-export `init` function, single `opencascade_full.{js,wasm,d.ts}` triple replacing v2's facade module. The wasm binary is exposed via the `@taucad/opencascade.js/wasm` subpath export so bundlers (Vite, Webpack, Rspack), Node `import.meta.resolve`, Bun, and Deno all resolve it identically — see [§A](BREAKING_CHANGES.md#section-a--module-loading). +- **Suffix-free overload symbols** — a single `gp_Pnt`, `BRepPrimAPI_MakeBox`, `BRepBuilderAPI_MakeEdge`, etc., with a value-based dispatcher that picks the right C++ overload from your argument types. The `_N`-suffixed overload subclasses are gone except for genuinely ambiguous same-arity cases. Same-arity dispatch is now unified across `class_function` + instance overload sets, fixing v2's silently-clobbered registrations. See [§B1](BREAKING_CHANGES.md#b1--suffix-free-overloads) and [§D7](BREAKING_CHANGES.md#d7--same-arity-overload-dispatch-unified-legacy-intsize_t-pairs-deduplicated). Dispatcher cost measured at ~264 ns/call (~5 µs per typical CAD render, 0.003–0.011% of wall time) — see [BENCHMARKS.md §3](BENCHMARKS.md#3--embind-overload-dispatch). +- **Output-parameter return shape redesigned** — methods with class output parameters (`gp_Pnt&`, `Bnd_Box&`, `GProp_GProps&`, …) mutate the caller's instance in place and read directly from it (no envelope mirroring). Methods with primitive / enum / elided-Handle outputs return a structured envelope; v2's `{ current: 0 }` placeholders are gone. See [§B2](BREAKING_CHANGES.md#b2--output-parameter-return-shape-class-outputs-mutate-in-place-envelopes-only-when-js-truly-needs-them). +- **Non-const `Handle&` output positions elided** from the JS signature — callers no longer allocate `new oc.Handle_()` placeholders for output-only Handle slots. Drop the position from the call entirely and read the freshly-assigned Handle from the envelope. ~2.29× wall-clock speedup on affected call sites. See [§B3](BREAKING_CHANGES.md#b3--non-const-handlet-output-positions-elided-from-the-js-signature). +- **`TopoDS` namespace bridge** — `oc.TopoDS.Edge(shape)`, `oc.TopoDS.Face(shape)`, etc., replacing v2's mix of `prototype.Edge`, `_TopoDS_Edge`, manual `getPointer` patterns. See [§D1](BREAKING_CHANGES.md#d1--topods-namespace-bridge). +- **Baseline WebAssembly SIMD** (`-msimd128`) on by default. Relaxed-SIMD ops (`-mrelaxed-simd`) are gated behind `OCJS_RELAXED_SIMD=1` because Safari 26.x cannot parse them. +- **`-sWASM_BIGINT`** on by default — eliminates the Emscripten i64 legalisation pass. +- **Full TypeScript bindings** with Doxygen-derived JSDoc rendered correctly in Monaco IntelliSense, fixed-width primitive types (`int8_t`, `uint32_t`, `int64_t`) mapped to TS scalars, sized-tuple emission for C array parameters, and string enums. +- **`Symbol.dispose` lifecycle** on every disposable binding — explicit resource management is wired in for both class wrappers and envelope returns that own Handle resources. The disposer is idempotent and alias-safe. +- **Reproducible builds** via `DEPS.json` (every external dependency — OCCT, rapidjson, freetype, Emscripten, LLVM 17 — pinned to an exact commit hash) plus a `provenance.json` sidecar shipped alongside every release artefact. +- **Cached, incremental builds** through Nx with content-addressed inputs — 10-30 minute clean builds become seconds on a hit. + +### Breaking changes + +Each entry deep-links into [BREAKING_CHANGES.md](BREAKING_CHANGES.md) for Before / After code samples and migration steps. + +- **[A — Module loading](BREAKING_CHANGES.md#section-a--module-loading)** — `dist/` ships a single triple (no facade); ESM-only with explicit `locateFile`; wasm binary reached via the `@taucad/opencascade.js/wasm` subpath export (no `dist/*` deep-imports). +- **[B — JS / TS API surface](BREAKING_CHANGES.md#section-b--js--ts-api-surface-changes)** — `_N`-suffixed overload subclasses collapsed to single symbols; output-parameter return shape redesigned (class outputs mutate in place, primitives / enums / elided Handles ride a structured envelope); non-const `Handle&` output positions elided from the JS signature; envelope native-return field is `envelope.returnValue` (reserved to avoid collision with OCCT parameters named `result`). +- **[C — WebAssembly exception handling](BREAKING_CHANGES.md#section-c--webassembly-exception-handling)** — caught exceptions are `WebAssembly.Exception` instances; decode via the `getExceptionMessage` runtime helper. +- **[D — OCCT V8 API](BREAKING_CHANGES.md#section-d--occt-v8-api-breaking-changes)** — `TopoDS` namespace bridge replaces direct namespace binding; `Bnd_Box::Get` removed (use `CornerMin` / `CornerMax`); `Poly_Triangulation` normals API now value-returning; `BRepMesh_IncrementalMesh` constructor signature; `TopoDS_Shape::HashCode` removed with no shipped replacement; same-arity overload dispatch unified across static + instance variants; JS-indistinguishable `int`/`size_t` NCollection pairs collapsed at codegen time (V8's `size_t` migration). +- **[E — Removed symbol families](BREAKING_CHANGES.md#section-e--removed-symbol-families)** — `OpenGl_*` / `Aspect_Window` / rest of `TKOpenGl` (headless target); `TopOpe*` (use `BOPAlgo_*` / `BRepAlgoAPI_*`); legacy `Standard_Transient`-based collections (use auto-discovered `NCollection_*`); `GCE2d_*` aliases (use `GC_*2d`). +- **[F — Build flag changes](BREAKING_CHANGES.md#section-f--build-flag-changes)** — source-build CLI replaced (`src/buildFromYaml.py` → `build-wasm.sh` with explicit subcommands and an optional `--config ` selecting an optimisation profile from `configurations.json`); reference `full.yml` (~4,400 symbols) bundled inside the Docker image as the starting point for custom builds; native WebAssembly exceptions on by default; Emscripten flag renames and additions from the 3.x → 5.x toolchain upgrade. + +### Build system + +- **Native WASM exceptions as the baseline link mode** — replaces `-fexceptions` JS `invoke_*` trampolines with `-fwasm-exceptions`, cutting exception-build size overhead from ~80% to ~12% gzipped. +- **`build-wasm.sh` unified entry point** (Docker `ENTRYPOINT` + host CLI parity) — explicit subcommands (`full`, `link`, `validate`, `generate`, `bindings`, `sources`, `pch`), `--help`, optional `--config ` from `configurations.json`, and build-summary output. +- **Named build configurations** in `configurations.json` — `single-threaded` (production default), `single-threaded-smallest` (size-tuned `-Os`), `multi-threaded` (SAB threading), `debug`. All ship with native WASM exceptions, `EVAL_CTORS=2`, and Closure on. +- **Reference `full.yml` bundled inside the Docker image** at `/opencascade.js/build-configs/full.yml` — the ~4,400-symbol list the published tarball builds from. Extract it as a starting point for trimming via the [trim-symbols guide](docs/guides/trim-symbols.md). +- **`DEPS.json` dependency pinning** — every external dependency (OCCT, rapidjson, freetype, Emscripten, LLVM 17) is pinned to an exact commit hash with version metadata. `clone-deps.sh` automates setup. +- **Hermetic libclang parse environment** — `src/ocjs_bindgen/config/paths.py` is now the single source of truth for include resolution during the bindgen discover pass. It points libclang at the vendored LLVM 17 libc++ headers + clang resource directory (matching libclang 18's expectations under the N-1 policy) and at the OCCT flat-include symlink farm, so the parse is reproducible across hosts and immune to whatever system clang the developer happens to have. Foundation for cross-arch (`darwin-arm64`, `linux-x86_64`, `linux-aarch64`) bit-identical builds via `uv`-managed Python 3.14.4. +- **Build provenance** — every build emits a `provenance.json` sidecar capturing toolchain versions, source commits, compile / link flags, cache key, and output sizes. Shipped alongside the WASM in the published tarball. +- **Nx-based caching** — the full pipeline (`apply-patches` → `pch` → `generate-bindings` → `compile-bindings` → `compile-sources` → `link` → `validate` → `provenance`) is wired through Nx with content-addressed inputs (including git-ignored files), so partial rebuilds are surgical. Clean full build ≈ 30 minutes; cache hits skip compilation entirely. Stale `.o` files compiled with one set of flags are invalidated when the flags change. +- **Validation harness** (`build-wasm.sh validate `) — post-build checks that every requested symbol has a compiled `.o`, the `.wasm` exists at a reasonable size, and Emscripten EH helpers are present in the linked JS glue when requested. +- **Configurable optimisation** — `wasm-opt` runs at `-O4` for production configs and `-O3` for size-tuned; `--traps-never-happen` is enabled; `OCJS_EXTRA_CFLAGS` passes arbitrary flags through to `emcc`. +- **Updated Dockerfile** to `emscripten/emsdk:5.0.1` with pinned digest, dependencies cloned at exact commits from `DEPS.json`, entrypoint via `build-wasm.sh` with env-var passthrough; a Docker E2E validation script is included. + +### Tests + +- **Comprehensive smoke suite** under [`tests/smoke/`](tests/smoke/) — primitives, smart pointers, topology, transforms, wire/face building, fillets/chamfers, sweep/loft, OBJ I/O, XCAF, intersections, output params, enum dispatch, BRep tool overloads, embind machinery, missing-OCCT-modules detection, suffix-free overload resolution, Handle-output elision, exception decode, `Symbol.dispose` disposal, and modern `NCollection` bindings. +- **Type-only tests** (`tests/types.test-d.ts`, `enum-dispatch.test-d.ts`, `enums.test-d.ts`, `namespaces.test-d.ts`, `output-params.test-d.ts`, `disposable-containers.test-d.ts`) — lock the published `.d.ts` shape against regression. +- **Bindgen output-shape regression** (`tests/bindgen-output-shape.test.ts`) — asserts the codegen never emits envelope fields that mirror concrete class outputs and that class outputs always forward via `*val::as(allow_raw_pointers())`. +- **Semantic-diagnostic and `dts-validation` harnesses** — type-check the codegen output end-to-end and track the `any` count in the generated `.d.ts` to prevent silent type-resolution regressions. + +### Documentation + +- New [BREAKING_CHANGES.md](BREAKING_CHANGES.md) — single comprehensive v2 → v3 consumer migration guide with Before / After code samples for every breaking change. +- Rewritten [README.md](README.md) with quick start, Docker workflow, environment-variable reference, and customisation pointers. +- [BUILD_SYSTEM.md](BUILD_SYSTEM.md) — full `OCJS_*` env-var matrix, configuration authoring guide, and the v2 → v3 build-system migration table. +- [docs/optimization-guide.md](docs/optimization-guide.md) — size vs. speed, LTO, defines, `wasm-opt`. +- [docs/build-config-reference.md](docs/build-config-reference.md) — YAML schema and customisation reference. + +### Source pinning (this release) + +Full commit hashes live in [DEPS.json](DEPS.json). + +- OCCT `V8_0_0` (GA, commit `d3056ef8`) +- rapidjson post-1.1.0 (commit `24b5e7a8`) +- freetype `VER-2-13-0` (commit `de8b92dd`) +- Emscripten `5.0.1` (digest `sha256:c89732ef…`) +- libclang `18.1.1` (Python binding, pinned in `requirements.txt`; up from v2's `15.0.6.1`) +- LLVM `17.0.6` (vendored prebuilt — parse-side libc++ + clang resource headers; N-1 compat with libclang 18.1.1) + +## Earlier releases (v0.1.x – v1.1.x) + +Pre-v3 release notes, preserved verbatim. The two giant class lists from `v1.1.0` are wrapped in `
` for readability — expand to view. + +### v1.1.4 (unreleased) + version only used for testing on npm -## v1.1.3 (unreleased) +### v1.1.3 (unreleased) + version only used for testing on npm -## v1.1.2 (unreleased) -* CI-Testing system implemented, which uses some of the code in the `opencascade-examples` repository (but can also define stand-alone tests). +### v1.1.2 (unreleased) + +- CI-Testing system implemented, which uses some of the code in the `opencascade-examples` repository (but can also define stand-alone tests). + +### v1.1.1 + +- Removed support for `TColQuantity_Array1OfLength` and `TopoDS_ListOfShape`, as they cause errors during initialization of the library. + +### v1.1.0 + +- More accurate way of counting supported and unsupported classes. +- Removed support for classes `Aspect_Background`, `Aspect_CircularGrid`, `Aspect_GenId`, `Aspect_GradientBackground`, `Aspect_Grid`, `Aspect_RectangularGrid`, `Aspect_Touch`, `Aspect_VKeySet`, `Aspect_Window`, `math_Householder`, `math_IntegerVector`, `math_Matrix`, `math_Vector` due to an error (breaking change). +- Added support for many `IntPatch_*`, `Interface_*`, `OSD_*`, `OpenGl_*`, and `WNT_ClassDefinitionError` classes. + +
+ Full added-classes list + + `IntPatch_ALine`, `IntPatch_ALineToWLine`, `IntPatch_ArcFunction`, `IntPatch_CSFunction`, `IntPatch_CurvIntSurf`, `IntPatch_GLine`, `IntPatch_HCurve2dTool`, `IntPatch_HInterTool`, `IntPatch_ImpImpIntersection`, `IntPatch_ImpPrmIntersection`, `IntPatch_InterferencePolyhedron`, `IntPatch_LineConstructor`, `IntPatch_PolyArc`, `IntPatch_PolyLine`, `IntPatch_Polygo`, `IntPatch_PolyhedronTool`, `IntPatch_PrmPrmIntersection`, `IntPatch_PrmPrmIntersection_T3Bits`, `IntPatch_SpecialPoints`, `IntPatch_TheIWLineOfTheIWalking`, `IntPatch_TheIWalking`, `IntPatch_ThePathPointOfTheSOnBounds`, `IntPatch_TheSOnBounds`, `IntPatch_TheSearchInside`, `IntPatch_TheSegmentOfTheSOnBounds`, `IntPatch_TheSurfFunction`, `IntPatch_WLineTool`, `Interface_Category`, `Interface_CheckFailure`, `Interface_CheckTool`, `Interface_CopyMap`, `Interface_EntityCluster`, `Interface_FileParameter`, `Interface_GTool`, `Interface_GlobalNodeOfGeneralLib`, `Interface_GlobalNodeOfReaderLib`, `Interface_IntVal`, `Interface_InterfaceMismatch`, `Interface_NodeOfGeneralLib`, `Interface_NodeOfReaderLib`, `Interface_ParamList`, `Interface_ParamSet`, `Interface_ReportEntity`, `Interface_STAT`, `Interface_ShareFlags`, `Interface_ShareTool`, `Interface_SignLabel`, `Interface_Static`, `Interface_TypedValue`, `Interface_UndefinedContent`, `OSD`, `OSD_Directory`, `OSD_DirectoryIterator`, `OSD_Disk`, `OSD_Environment`, `OSD_Exception`, `OSD_Exception_ACCESS_VIOLATION`, `OSD_Exception_ARRAY_BOUNDS_EXCEEDED`, `OSD_Exception_CTRL_BREAK`, `OSD_Exception_FLT_DENORMAL_OPERAND`, `OSD_Exception_FLT_DIVIDE_BY_ZERO`, `OSD_Exception_FLT_INEXACT_RESULT`, `OSD_Exception_FLT_INVALID_OPERATION`, `OSD_Exception_FLT_OVERFLOW`, `OSD_Exception_FLT_STACK_CHECK`, `OSD_Exception_FLT_UNDERFLOW`, `OSD_Exception_ILLEGAL_INSTRUCTION`, `OSD_Exception_INT_DIVIDE_BY_ZERO`, `OSD_Exception_INT_OVERFLOW`, `OSD_Exception_INVALID_DISPOSITION`, `OSD_Exception_IN_PAGE_ERROR`, `OSD_Exception_NONCONTINUABLE_EXCEPTION`, `OSD_Exception_PRIV_INSTRUCTION`, `OSD_Exception_STACK_OVERFLOW`, `OSD_Exception_STATUS_NO_MEMORY`, `OSD_FileIterator`, `OSD_Host`, `OSD_MAllocHook`, `OSD_MemInfo`, `OSD_OSDError`, `OSD_PerfMeter`, `OSD_Process`, `OSD_Protection`, `OSD_SIGBUS`, `OSD_SIGHUP`, `OSD_SIGILL`, `OSD_SIGINT`, `OSD_SIGKILL`, `OSD_SIGQUIT`, `OSD_SIGSEGV`, `OSD_SIGSYS`, `OSD_SharedLibrary`, `OSD_Signal`, `OpenGl_Aspects`, `OpenGl_AspectsProgram`, `OpenGl_AspectsSprite`, `OpenGl_AspectsTextureSet`, `OpenGl_BackgroundArray`, `OpenGl_CappingAlgo`, `OpenGl_CappingPlaneResource`, `OpenGl_Caps`, `OpenGl_Clipping`, `OpenGl_ClippingIterator`, `OpenGl_ClippingState`, `OpenGl_Context`, `OpenGl_Element`, `OpenGl_Flipper`, `OpenGl_Font`, `OpenGl_FrameBuffer`, `OpenGl_FrameStats`, `OpenGl_FrameStatsPrs`, `OpenGl_GraduatedTrihedron`, `OpenGl_GraphicDriver`, `OpenGl_Group`, `OpenGl_IndexBuffer`, `OpenGl_LayerList`, `OpenGl_LightSourceState`, `OpenGl_LineAttributes`, `OpenGl_MaterialState`, `OpenGl_ModelWorldState`, `OpenGl_NamedResource`, `OpenGl_OitState`, `OpenGl_PointSprite`, `OpenGl_PrimitiveArray`, `OpenGl_ProjectionState`, `OpenGl_RaytraceGeometry`, `OpenGl_Resource`, `OpenGl_Sampler`, `OpenGl_SetOfPrograms`, `OpenGl_SetOfShaderPrograms`, `OpenGl_ShaderManager`, `OpenGl_ShaderObject`, `OpenGl_ShaderProgram`, `OpenGl_ShaderUniformLocation`, `OpenGl_StateCounter`, `OpenGl_StateInterface`, `OpenGl_StencilTest`, `OpenGl_Structure`, `OpenGl_StructureShadow`, `OpenGl_Text`, `OpenGl_TextBuilder`, `OpenGl_Texture`, `OpenGl_TextureBufferArb`, `OpenGl_TextureFormat`, `OpenGl_TextureSet`, `OpenGl_TriangleSet`, `OpenGl_VariableSetterSelector`, `OpenGl_VertexBuffer`, `OpenGl_VertexBufferCompat`, `OpenGl_Window`, `OpenGl_Workspace`, `OpenGl_WorldViewState`, `WNT_ClassDefinitionError`. + +
+ +- Added support for many `NCollection_Array1` template specializations. + +
+ Full `NCollection_Array1` specialization list + + `TColStd_Array1OfByte`, `Graphic3d_Array1OfAttribute`, `TColgp_Array1OfPnt`, `TColgp_Array1OfPnt2d`, `Poly_Array1OfTriangle`, `TColStd_Array1OfInteger`, `TShort_Array1OfShortReal`, `Quantity_Array1OfColor`, `TColgp_Array1OfDir`, `TColStd_Array1OfTransient`, `TColStd_Array1OfAsciiString`, `Interface_Array1OfHAsciiString`, `TColStd_Array1OfReal`, `TColGeom_Array1OfSurface`, `AppParCurves_Array1OfMultiPoint`, `TColgp_Array1OfVec`, `TColgp_Array1OfVec2d`, `AppDef_Array1OfMultiPointConstraint`, `AppParCurves_Array1OfConstraintCouple`, `AppParCurves_Array1OfMultiBSpCurve`, `AppParCurves_Array1OfMultiCurve`, `Approx_Array1OfAdHSurface`, `Approx_Array1OfGTrsf2d`, `BOPDS_VectorOfPave`, `BRepAdaptor_Array1OfCurve`, `TColStd_Array1OfBoolean`, `Extrema_Array1OfPOnCurv`, `Extrema_Array1OfPOnSurf`, `Bnd_Array1OfSphere`, `GeomFill_Array1OfLocationLaw`, `TopTools_Array1OfShape`, `GeomPlate_Array1OfSequenceOfReal`, `Plate_Array1OfPinpointConstraint`, `TColgp_Array1OfXYZ`, `GeomPlate_Array1OfHCurve`, `TColGeom2d_Array1OfCurve`, `GeomFill_Array1OfSectionLaw`, `ChFiDS_SecArray1`, `Bnd_Array1OfBox`, `Message_ArrayOfMsg`, `Bnd_Array1OfBox2d`, `TColStd_Array1OfListOfInteger`, `ChFiDS_StripeArray1`, `Expr_Array1OfNamedUnknown`, `Expr_Array1OfGeneralExpression`, `Expr_Array1OfSingleRelation`, `Extrema_Array1OfPOnCurv2d`, `TColgp_Array1OfXY`, `TColgp_Array1OfCirc2d`, `GccEnt_Array1OfPosition`, `TColgp_Array1OfLin2d`, `TColGeom2d_Array1OfBSplineCurve`, `TColGeom2d_Array1OfBezierCurve`, `TColGeom_Array1OfBSplineCurve`, `TColGeom_Array1OfBezierCurve`, `GeomLib_Array1OfMat`, `Graphic3d_ArrayOfIndexedMapOfStructure`, `HLRAlgo_Array1OfPHDat`, `HLRAlgo_Array1OfPINod`, `HLRAlgo_Array1OfPISeg`, `HLRAlgo_Array1OfTData`, `HLRBRep_Array1OfEData`, `HLRBRep_Array1OfFData`, `Intf_Array1OfLin`, `IGESAppli_Array1OfNode`, `IGESAppli_Array1OfFiniteElement`, `IGESData_Array1OfIGESEntity`, `IGESDraw_Array1OfConnectPoint`, `IGESGraph_Array1OfTextDisplayTemplate`, `IGESAppli_Array1OfFlow`, `IGESDefs_Array1OfTabularData`, `IGESGraph_Array1OfTextFontDef`, `IGESDimen_Array1OfGeneralNote`, `IGESBasic_Array1OfLineFontEntity`, `IGESData_Array1OfDirPart`, `IGESDimen_Array1OfLeaderArrow`, `IGESDraw_Array1OfViewKindEntity`, `IGESGraph_Array1OfColor`, `IGESGeom_Array1OfBoundary`, `IGESGeom_Array1OfCurveOnSurface`, `IGESGeom_Array1OfTransformationMatrix`, `IGESSolid_Array1OfLoop`, `IGESSolid_Array1OfFace`, `IGESSolid_Array1OfShell`, `IGESSolid_Array1OfVertexList`, `IntTools_Array1OfRange`, `IntTools_Array1OfRoots`, `Interface_Array1OfFileParameter`, `MeshVS_Array1OfSequenceOfInteger`, `StepDimTol_Array1OfDatumReferenceModifier`, `StepRepr_Array1OfRepresentationItem`, `StepVisual_Array1OfTessellatedItem`, `StepDimTol_Array1OfDatumSystemOrReference`, `StepVisual_Array1OfPresentationStyleSelect`, `StepVisual_Array1OfPresentationStyleAssignment`, `TColgp_Array1OfDir2d`, `TColGeom_Array1OfCurve`, `TColStd_Array1OfExtendedString`, `TDataStd_LabelArray1`, `TDataXtd_Array1OfTrsf`, `StepAP203_Array1OfApprovedItem`, `StepAP203_Array1OfCertifiedItem`, `StepAP203_Array1OfChangeRequestItem`, `StepAP203_Array1OfClassifiedItem`, `StepAP203_Array1OfContractedItem`, `StepAP203_Array1OfDateTimeItem`, `StepAP203_Array1OfPersonOrganizationItem`, `StepAP203_Array1OfSpecifiedItem`, `StepAP203_Array1OfStartRequestItem`, `StepAP203_Array1OfWorkItem`, `StepRepr_Array1OfMaterialPropertyRepresentation`, `StepFEA_Array1OfNodeRepresentation`, `StepAP214_Array1OfApprovalItem`, `StepAP214_Array1OfDateAndTimeItem`, `StepAP214_Array1OfDateItem`, `StepAP214_Array1OfDocumentReferenceItem`, `StepAP214_Array1OfExternalIdentificationItem`, `StepAP214_Array1OfGroupItem`, `StepAP214_Array1OfOrganizationItem`, `StepAP214_Array1OfPersonAndOrganizationItem`, `StepAP214_Array1OfPresentedItemSelect`, `StepAP214_Array1OfSecurityClassificationItem`, `StepAP214_Array1OfAutoDesignDateAndPersonItem`, `StepAP214_Array1OfAutoDesignDateAndTimeItem`, `StepAP214_Array1OfAutoDesignDatedItem`, `StepAP214_Array1OfAutoDesignGeneralOrgItem`, `StepAP214_Array1OfAutoDesignGroupedItem`, `StepAP214_Array1OfAutoDesignPresentedItemSelect`, `StepAP214_Array1OfAutoDesignReferencingItem`, `StepBasic_Array1OfApproval`, `StepBasic_Array1OfDerivedUnitElement`, `StepBasic_Array1OfDocument`, `StepBasic_Array1OfNamedUnit`, `StepBasic_Array1OfOrganization`, `StepBasic_Array1OfPerson`, `StepBasic_Array1OfProductContext`, `StepBasic_Array1OfProduct`, `StepBasic_Array1OfProductDefinition`, `StepBasic_Array1OfUncertaintyMeasureWithUnit`, `StepData_Array1OfField`, `StepDimTol_Array1OfDatumReference`, `StepDimTol_Array1OfDatumReferenceCompartment`, `StepDimTol_Array1OfDatumReferenceElement`, `StepDimTol_Array1OfGeometricToleranceModifier`, `StepDimTol_Array1OfToleranceZoneTarget`, `StepRepr_Array1OfShapeAspect`, `StepElement_Array1OfCurveElementEndReleasePacket`, `StepElement_Array1OfCurveElementSectionDefinition`, `StepElement_Array1OfHSequenceOfCurveElementPurposeMember`, `StepElement_Array1OfHSequenceOfSurfaceElementPurposeMember`, `StepElement_Array1OfMeasureOrUnspecifiedValue`, `StepElement_Array1OfSurfaceSection`, `StepElement_Array1OfVolumeElementPurpose`, `StepElement_Array1OfVolumeElementPurposeMember`, `StepFEA_Array1OfCurveElementEndOffset`, `StepFEA_Array1OfCurveElementEndRelease`, `StepFEA_Array1OfCurveElementInterval`, `StepFEA_Array1OfDegreeOfFreedom`, `StepFEA_Array1OfElementRepresentation`, `StepGeom_Array1OfCompositeCurveSegment`, `StepGeom_Array1OfBoundaryCurve`, `StepGeom_Array1OfCartesianPoint`, `StepGeom_Array1OfCurve`, `StepGeom_Array1OfPcurveOrSurface`, `StepGeom_Array1OfSurfaceBoundary`, `StepGeom_Array1OfTrimmingSelect`, `StepRepr_Array1OfPropertyDefinitionRepresentation`, `StepShape_Array1OfFaceBound`, `StepShape_Array1OfEdge`, `StepShape_Array1OfConnectedEdgeSet`, `StepShape_Array1OfFace`, `StepShape_Array1OfConnectedFaceSet`, `StepShape_Array1OfGeometricSetSelect`, `StepShape_Array1OfOrientedClosedShell`, `StepShape_Array1OfOrientedEdge`, `StepShape_Array1OfShapeDimensionRepresentationItem`, `StepShape_Array1OfShell`, `StepShape_Array1OfValueQualifier`, `StepVisual_Array1OfAnnotationPlaneElement`, `StepVisual_Array1OfBoxCharacteristicSelect`, `StepVisual_Array1OfCameraModelD3MultiClippingInterectionSelect`, `StepVisual_Array1OfCameraModelD3MultiClippingUnionSelect`, `StepVisual_Array1OfCurveStyleFontPattern`, `StepVisual_Array1OfDirectionCountSelect`, `StepVisual_Array1OfDraughtingCalloutElement`, `StepVisual_Array1OfFillStyleSelect`, `StepVisual_Array1OfInvisibleItem`, `StepVisual_Array1OfLayeredItem`, `StepVisual_Array1OfStyleContextSelect`, `StepVisual_Array1OfSurfaceStyleElementSelect`, `StepVisual_Array1OfTextOrCharacter`, `Storage_ArrayOfCallBack`, `Storage_ArrayOfSchema`, `Storage_PArray`, `TColQuantity_Array1OfLength`, `TColStd_Array1OfCharacter`, `TDF_AttributeArray1`, `TFunction_Array1OfDataMapOfGUIDDriver`, `TopOpeBRep_Array1OfVPointInter`, `TopOpeBRep_Array1OfLineInter`, `TopTools_Array1OfListOfShape`, `TopOpeBRepDS_Array1OfDataMapOfIntegerListOfInterference`, `math_Array1OfValueAndWeight`. + +
+ +- Added support for many `NCollection_List` template specializations. + +
+ Full `NCollection_List` specialization list + + `TColStd_ListOfInteger`, `PrsMgr_ListOfPresentations`, `PrsMgr_ListOfPresentableObjects`, `SelectMgr_TriangFrustums`, `TopoDS_ListOfShape`, `AIS_ListOfInteractive`, `AIS_NListOfEntityOwner`, `SelectMgr_ListOfFilter`, `TopTools_ListOfShape`, `TColStd_ListOfTransient`, `V3d_ListOfLight`, `V3d_ListOfView`, `Message_ListOfAlert`, `BOPAlgo_ListOfCheckResult`, `BOPDS_ListOfPave`, `BOPDS_ListOfPaveBlock`, `IntSurf_ListOfPntOn2S`, `BOPTools_ListOfConnexityBlock`, `TopTools_ListOfListOfShape`, `BRep_ListOfPointRepresentation`, `BOPAlgo_ListOfEdgeInfo`, `DBRep_ListOfEdge`, `DBRep_ListOfFace`, `HLRBRep_ListOfBPoint`, `DBRep_ListOfHideData`, `BOPTools_ListOfCoupleOfShape`, `BRep_ListOfCurveRepresentation`, `BRepCheck_ListOfStatus`, `BRepFill_ListOfOffsetWire`, `ChFiDS_ListOfStripe`, `ChFiDS_Regularities`, `BRepOffset_ListOfInterval`, `TDF_LabelList`, `CDM_ListOfReferences`, `CDM_ListOfDocument`, `TColStd_ListOfReal`, `TopOpeBRepDS_ListOfInterference`, `ChFiDS_ListOfHElSpine`, `Law_Laws`, `DDF_TransactionStack`, `ExprIntrp_StackOfGeneralExpression`, `ExprIntrp_StackOfGeneralRelation`, `ExprIntrp_StackOfGeneralFunction`, `TColStd_ListOfAsciiString`, `FEmTool_ListOfVectors`, `Font_NListOfSystemFont`, `HLRAlgo_InterferenceList`, `HLRAlgo_ListOfBPoint`, `HLRBRep_ListOfBPnt2D`, `HLRTopoBRep_ListOfVData`, `IntAna_ListOfCurve`, `IntPolyh_ListOfCouples`, `IntTools_ListOfCurveRangeSample`, `IntTools_ListOfSurfaceRangeSample`, `IntTools_ListOfBox`, `MeshVS_PolyhedronVerts`, `Message_ListOfMsg`, `NLPlate_StackOfPlate`, `Poly_ListOfTriangulation`, `Prs3d_NListOfSequenceOfPnt`, `QANCollection_ListOfPnt`, `TDataStd_ListOfExtendedString`, `TDataStd_ListOfByte`, `TDF_AttributeList`, `TNaming_ListOfNamedShape`, `TDF_AttributeDeltaList`, `TDF_IDList`, `TDF_DeltaList`, `TNaming_ListOfIndexedDataMapOfShapeListOfShape`, `TNaming_ListOfMapOfShape`, `TopBas_ListOfTestInterference`, `TopOpeBRep_ListOfBipoint`, `TopOpeBRepBuild_ListOfLoop`, `TopOpeBRepBuild_ListOfListOfLoop`, `TopOpeBRepBuild_ListOfShapeListOfShape`, `TopOpeBRepBuild_ListOfPave`, `TopOpeBRepTool_ListOfC2DF`, `VrmlData_ListOfNode`. + +
+ +### v1.0.2 + +- Added constructors for `TColgp_Array1OfPnt` as manual bindings. -## v1.1.1 -* Removed support for `TColQuantity_Array1OfLength` and `TopoDS_ListOfShape`, as they cause errors during initialization of the library. +### v1.0.1 -## v1.1.0 -* More accurate way of counting supported and unsupported classes -* Removed support for classes `Aspect_Background`, `Aspect_CircularGrid`, `Aspect_GenId`, `Aspect_GradientBackground`, `Aspect_Grid`, `Aspect_RectangularGrid`, `Aspect_Touch`, `Aspect_VKeySet`, `Aspect_Window`, `math_Householder`, `math_IntegerVector`, `math_Matrix`, `math_Vector` due to an error (breaking change) -* Added support for classes `IntPatch_ALine`, `IntPatch_ALineToWLine`, `IntPatch_ArcFunction`, `IntPatch_CSFunction`, `IntPatch_CurvIntSurf`, `IntPatch_GLine`, `IntPatch_HCurve2dTool`, `IntPatch_HInterTool`, `IntPatch_ImpImpIntersection`, `IntPatch_ImpPrmIntersection`, `IntPatch_InterferencePolyhedron`, `IntPatch_LineConstructor`, `IntPatch_PolyArc`, `IntPatch_PolyLine`, `IntPatch_Polygo`, `IntPatch_PolyhedronTool`, `IntPatch_PrmPrmIntersection`, `IntPatch_PrmPrmIntersection_T3Bits`, `IntPatch_SpecialPoints`, `IntPatch_TheIWLineOfTheIWalking`, `IntPatch_TheIWalking`, `IntPatch_ThePathPointOfTheSOnBounds`, `IntPatch_TheSOnBounds`, `IntPatch_TheSearchInside`, `IntPatch_TheSegmentOfTheSOnBounds`, `IntPatch_TheSurfFunction`, `IntPatch_WLineTool`, `Interface_Category`, `Interface_CheckFailure`, `Interface_CheckTool`, `Interface_CopyMap`, `Interface_EntityCluster`, `Interface_FileParameter`, `Interface_GTool`, `Interface_GlobalNodeOfGeneralLib`, `Interface_GlobalNodeOfReaderLib`, `Interface_IntVal`, `Interface_InterfaceMismatch`, `Interface_NodeOfGeneralLib`, `Interface_NodeOfReaderLib`, `Interface_ParamList`, `Interface_ParamSet`, `Interface_ReportEntity`, `Interface_STAT`, `Interface_ShareFlags`, `Interface_ShareTool`, `Interface_SignLabel`, `Interface_Static`, `Interface_TypedValue`, `Interface_UndefinedContent`, `OSD`, `OSD_Directory`, `OSD_DirectoryIterator`, `OSD_Disk`, `OSD_Environment`, `OSD_Exception`, `OSD_Exception_ACCESS_VIOLATION`, `OSD_Exception_ARRAY_BOUNDS_EXCEEDED`, `OSD_Exception_CTRL_BREAK`, `OSD_Exception_FLT_DENORMAL_OPERAND`, `OSD_Exception_FLT_DIVIDE_BY_ZERO`, `OSD_Exception_FLT_INEXACT_RESULT`, `OSD_Exception_FLT_INVALID_OPERATION`, `OSD_Exception_FLT_OVERFLOW`, `OSD_Exception_FLT_STACK_CHECK`, `OSD_Exception_FLT_UNDERFLOW`, `OSD_Exception_ILLEGAL_INSTRUCTION`, `OSD_Exception_INT_DIVIDE_BY_ZERO`, `OSD_Exception_INT_OVERFLOW`, `OSD_Exception_INVALID_DISPOSITION`, `OSD_Exception_IN_PAGE_ERROR`, `OSD_Exception_NONCONTINUABLE_EXCEPTION`, `OSD_Exception_PRIV_INSTRUCTION`, `OSD_Exception_STACK_OVERFLOW`, `OSD_Exception_STATUS_NO_MEMORY`, `OSD_FileIterator`, `OSD_Host`, `OSD_MAllocHook`, `OSD_MemInfo`, `OSD_OSDError`, `OSD_PerfMeter`, `OSD_Process`, `OSD_Protection`, `OSD_SIGBUS`, `OSD_SIGHUP`, `OSD_SIGILL`, `OSD_SIGINT`, `OSD_SIGKILL`, `OSD_SIGQUIT`, `OSD_SIGSEGV`, `OSD_SIGSYS`, `OSD_SharedLibrary`, `OSD_Signal`, `OpenGl_Aspects`, `OpenGl_AspectsProgram`, `OpenGl_AspectsSprite`, `OpenGl_AspectsTextureSet`, `OpenGl_BackgroundArray`, `OpenGl_CappingAlgo`, `OpenGl_CappingPlaneResource`, `OpenGl_Caps`, `OpenGl_Clipping`, `OpenGl_ClippingIterator`, `OpenGl_ClippingState`, `OpenGl_Context`, `OpenGl_Element`, `OpenGl_Flipper`, `OpenGl_Font`, `OpenGl_FrameBuffer`, `OpenGl_FrameStats`, `OpenGl_FrameStatsPrs`, `OpenGl_GraduatedTrihedron`, `OpenGl_GraphicDriver`, `OpenGl_Group`, `OpenGl_IndexBuffer`, `OpenGl_LayerList`, `OpenGl_LightSourceState`, `OpenGl_LineAttributes`, `OpenGl_MaterialState`, `OpenGl_ModelWorldState`, `OpenGl_NamedResource`, `OpenGl_OitState`, `OpenGl_PointSprite`, `OpenGl_PrimitiveArray`, `OpenGl_ProjectionState`, `OpenGl_RaytraceGeometry`, `OpenGl_Resource`, `OpenGl_Sampler`, `OpenGl_SetOfPrograms`, `OpenGl_SetOfShaderPrograms`, `OpenGl_ShaderManager`, `OpenGl_ShaderObject`, `OpenGl_ShaderProgram`, `OpenGl_ShaderUniformLocation`, `OpenGl_StateCounter`, `OpenGl_StateInterface`, `OpenGl_StencilTest`, `OpenGl_Structure`, `OpenGl_StructureShadow`, `OpenGl_Text`, `OpenGl_TextBuilder`, `OpenGl_Texture`, `OpenGl_TextureBufferArb`, `OpenGl_TextureFormat`, `OpenGl_TextureSet`, `OpenGl_TriangleSet`, `OpenGl_VariableSetterSelector`, `OpenGl_VertexBuffer`, `OpenGl_VertexBufferCompat`, `OpenGl_Window`, `OpenGl_Workspace`, `OpenGl_WorldViewState`, `WNT_ClassDefinitionError` -* Added supported for the following specializations of the `NCollection_Array1` template class: `TColStd_Array1OfByte`, `Graphic3d_Array1OfAttribute`, `TColgp_Array1OfPnt`, `TColgp_Array1OfPnt2d`, `Poly_Array1OfTriangle`, `TColStd_Array1OfInteger`, `TShort_Array1OfShortReal`, `Quantity_Array1OfColor`, `TColgp_Array1OfDir`, `TColStd_Array1OfTransient`, `TColStd_Array1OfAsciiString`, `Interface_Array1OfHAsciiString`, `TColStd_Array1OfReal`, `TColGeom_Array1OfSurface`, `AppParCurves_Array1OfMultiPoint`, `TColgp_Array1OfVec`, `TColgp_Array1OfVec2d`, `AppDef_Array1OfMultiPointConstraint`, `AppParCurves_Array1OfConstraintCouple`, `AppParCurves_Array1OfMultiBSpCurve`, `AppParCurves_Array1OfMultiCurve`, `Approx_Array1OfAdHSurface`, `Approx_Array1OfGTrsf2d`, `BOPDS_VectorOfPave`, `BRepAdaptor_Array1OfCurve`, `TColStd_Array1OfBoolean`, `Extrema_Array1OfPOnCurv`, `Extrema_Array1OfPOnSurf`, `Bnd_Array1OfSphere`, `GeomFill_Array1OfLocationLaw`, `TopTools_Array1OfShape`, `GeomPlate_Array1OfSequenceOfReal`, `Plate_Array1OfPinpointConstraint`, `TColgp_Array1OfXYZ`, `GeomPlate_Array1OfHCurve`, `TColGeom2d_Array1OfCurve`, `GeomFill_Array1OfSectionLaw`, `ChFiDS_SecArray1`, `Bnd_Array1OfBox`, `Message_ArrayOfMsg`, `Bnd_Array1OfBox2d`, `TColStd_Array1OfListOfInteger`, `ChFiDS_StripeArray1`, `Expr_Array1OfNamedUnknown`, `Expr_Array1OfGeneralExpression`, `Expr_Array1OfSingleRelation`, `Extrema_Array1OfPOnCurv2d`, `TColgp_Array1OfXY`, `TColgp_Array1OfCirc2d`, `GccEnt_Array1OfPosition`, `TColgp_Array1OfLin2d`, `TColGeom2d_Array1OfBSplineCurve`, `TColGeom2d_Array1OfBezierCurve`, `TColGeom_Array1OfBSplineCurve`, `TColGeom_Array1OfBezierCurve`, `GeomLib_Array1OfMat`, `Graphic3d_ArrayOfIndexedMapOfStructure`, `HLRAlgo_Array1OfPHDat`, `HLRAlgo_Array1OfPINod`, `HLRAlgo_Array1OfPISeg`, `HLRAlgo_Array1OfTData`, `HLRBRep_Array1OfEData`, `HLRBRep_Array1OfFData`, `Intf_Array1OfLin`, `IGESAppli_Array1OfNode`, `IGESAppli_Array1OfFiniteElement`, `IGESData_Array1OfIGESEntity`, `IGESDraw_Array1OfConnectPoint`, `IGESGraph_Array1OfTextDisplayTemplate`, `IGESAppli_Array1OfFlow`, `IGESDefs_Array1OfTabularData`, `IGESGraph_Array1OfTextFontDef`, `IGESDimen_Array1OfGeneralNote`, `IGESBasic_Array1OfLineFontEntity`, `IGESData_Array1OfDirPart`, `IGESDimen_Array1OfLeaderArrow`, `IGESDraw_Array1OfViewKindEntity`, `IGESGraph_Array1OfColor`, `IGESGeom_Array1OfBoundary`, `IGESGeom_Array1OfCurveOnSurface`, `IGESGeom_Array1OfTransformationMatrix`, `IGESSolid_Array1OfLoop`, `IGESSolid_Array1OfFace`, `IGESSolid_Array1OfShell`, `IGESSolid_Array1OfVertexList`, `IntTools_Array1OfRange`, `IntTools_Array1OfRoots`, `Interface_Array1OfFileParameter`, `MeshVS_Array1OfSequenceOfInteger`, `StepDimTol_Array1OfDatumReferenceModifier`, `StepRepr_Array1OfRepresentationItem`, `StepVisual_Array1OfTessellatedItem`, `StepDimTol_Array1OfDatumSystemOrReference`, `StepVisual_Array1OfPresentationStyleSelect`, `StepVisual_Array1OfPresentationStyleAssignment`, `TColgp_Array1OfDir2d`, `TColGeom_Array1OfCurve`, `TColStd_Array1OfExtendedString`, `TDataStd_LabelArray1`, `TDataXtd_Array1OfTrsf`, `StepAP203_Array1OfApprovedItem`, `StepAP203_Array1OfCertifiedItem`, `StepAP203_Array1OfChangeRequestItem`, `StepAP203_Array1OfClassifiedItem`, `StepAP203_Array1OfContractedItem`, `StepAP203_Array1OfDateTimeItem`, `StepAP203_Array1OfPersonOrganizationItem`, `StepAP203_Array1OfSpecifiedItem`, `StepAP203_Array1OfStartRequestItem`, `StepAP203_Array1OfWorkItem`, `StepRepr_Array1OfMaterialPropertyRepresentation`, `StepFEA_Array1OfNodeRepresentation`, `StepAP214_Array1OfApprovalItem`, `StepAP214_Array1OfDateAndTimeItem`, `StepAP214_Array1OfDateItem`, `StepAP214_Array1OfDocumentReferenceItem`, `StepAP214_Array1OfExternalIdentificationItem`, `StepAP214_Array1OfGroupItem`, `StepAP214_Array1OfOrganizationItem`, `StepAP214_Array1OfPersonAndOrganizationItem`, `StepAP214_Array1OfPresentedItemSelect`, `StepAP214_Array1OfSecurityClassificationItem`, `StepAP214_Array1OfAutoDesignDateAndPersonItem`, `StepAP214_Array1OfAutoDesignDateAndTimeItem`, `StepAP214_Array1OfAutoDesignDatedItem`, `StepAP214_Array1OfAutoDesignGeneralOrgItem`, `StepAP214_Array1OfAutoDesignGroupedItem`, `StepAP214_Array1OfAutoDesignPresentedItemSelect`, `StepAP214_Array1OfAutoDesignReferencingItem`, `StepBasic_Array1OfApproval`, `StepBasic_Array1OfDerivedUnitElement`, `StepBasic_Array1OfDocument`, `StepBasic_Array1OfNamedUnit`, `StepBasic_Array1OfOrganization`, `StepBasic_Array1OfPerson`, `StepBasic_Array1OfProductContext`, `StepBasic_Array1OfProduct`, `StepBasic_Array1OfProductDefinition`, `StepBasic_Array1OfUncertaintyMeasureWithUnit`, `StepData_Array1OfField`, `StepDimTol_Array1OfDatumReference`, `StepDimTol_Array1OfDatumReferenceCompartment`, `StepDimTol_Array1OfDatumReferenceElement`, `StepDimTol_Array1OfGeometricToleranceModifier`, `StepDimTol_Array1OfToleranceZoneTarget`, `StepRepr_Array1OfShapeAspect`, `StepElement_Array1OfCurveElementEndReleasePacket`, `StepElement_Array1OfCurveElementSectionDefinition`, `StepElement_Array1OfHSequenceOfCurveElementPurposeMember`, `StepElement_Array1OfHSequenceOfSurfaceElementPurposeMember`, `StepElement_Array1OfMeasureOrUnspecifiedValue`, `StepElement_Array1OfSurfaceSection`, `StepElement_Array1OfVolumeElementPurpose`, `StepElement_Array1OfVolumeElementPurposeMember`, `StepFEA_Array1OfCurveElementEndOffset`, `StepFEA_Array1OfCurveElementEndRelease`, `StepFEA_Array1OfCurveElementInterval`, `StepFEA_Array1OfDegreeOfFreedom`, `StepFEA_Array1OfElementRepresentation`, `StepGeom_Array1OfCompositeCurveSegment`, `StepGeom_Array1OfBoundaryCurve`, `StepGeom_Array1OfCartesianPoint`, `StepGeom_Array1OfCurve`, `StepGeom_Array1OfPcurveOrSurface`, `StepGeom_Array1OfSurfaceBoundary`, `StepGeom_Array1OfTrimmingSelect`, `StepRepr_Array1OfPropertyDefinitionRepresentation`, `StepShape_Array1OfFaceBound`, `StepShape_Array1OfEdge`, `StepShape_Array1OfConnectedEdgeSet`, `StepShape_Array1OfFace`, `StepShape_Array1OfConnectedFaceSet`, `StepShape_Array1OfGeometricSetSelect`, `StepShape_Array1OfOrientedClosedShell`, `StepShape_Array1OfOrientedEdge`, `StepShape_Array1OfShapeDimensionRepresentationItem`, `StepShape_Array1OfShell`, `StepShape_Array1OfValueQualifier`, `StepVisual_Array1OfAnnotationPlaneElement`, `StepVisual_Array1OfBoxCharacteristicSelect`, `StepVisual_Array1OfCameraModelD3MultiClippingInterectionSelect`, `StepVisual_Array1OfCameraModelD3MultiClippingUnionSelect`, `StepVisual_Array1OfCurveStyleFontPattern`, `StepVisual_Array1OfDirectionCountSelect`, `StepVisual_Array1OfDraughtingCalloutElement`, `StepVisual_Array1OfFillStyleSelect`, `StepVisual_Array1OfInvisibleItem`, `StepVisual_Array1OfLayeredItem`, `StepVisual_Array1OfStyleContextSelect`, `StepVisual_Array1OfSurfaceStyleElementSelect`, `StepVisual_Array1OfTextOrCharacter`, `Storage_ArrayOfCallBack`, `Storage_ArrayOfSchema`, `Storage_PArray`, `TColQuantity_Array1OfLength`, `TColStd_Array1OfCharacter`, `TDF_AttributeArray1`, `TFunction_Array1OfDataMapOfGUIDDriver`, `TopOpeBRep_Array1OfVPointInter`, `TopOpeBRep_Array1OfLineInter`, `TopTools_Array1OfListOfShape`, `TopOpeBRepDS_Array1OfDataMapOfIntegerListOfInterference`, `math_Array1OfValueAndWeight` -* Added supported for the following specializations of the `NCollection_List` template class: `TColStd_ListOfInteger`, `PrsMgr_ListOfPresentations`, `PrsMgr_ListOfPresentableObjects`, `SelectMgr_TriangFrustums`, `TopoDS_ListOfShape`, `AIS_ListOfInteractive`, `AIS_NListOfEntityOwner`, `SelectMgr_ListOfFilter`, `TopTools_ListOfShape`, `TColStd_ListOfTransient`, `V3d_ListOfLight`, `V3d_ListOfView`, `Message_ListOfAlert`, `BOPAlgo_ListOfCheckResult`, `BOPDS_ListOfPave`, `BOPDS_ListOfPaveBlock`, `IntSurf_ListOfPntOn2S`, `BOPTools_ListOfConnexityBlock`, `TopTools_ListOfListOfShape`, `BRep_ListOfPointRepresentation`, `BOPAlgo_ListOfEdgeInfo`, `DBRep_ListOfEdge`, `DBRep_ListOfFace`, `HLRBRep_ListOfBPoint`, `DBRep_ListOfHideData`, `BOPTools_ListOfCoupleOfShape`, `BRep_ListOfCurveRepresentation`, `BRepCheck_ListOfStatus`, `BRepFill_ListOfOffsetWire`, `ChFiDS_ListOfStripe`, `ChFiDS_Regularities`, `BRepOffset_ListOfInterval`, `TDF_LabelList`, `CDM_ListOfReferences`, `CDM_ListOfDocument`, `TColStd_ListOfReal`, `TopOpeBRepDS_ListOfInterference`, `ChFiDS_ListOfHElSpine`, `Law_Laws`, `DDF_TransactionStack`, `ExprIntrp_StackOfGeneralExpression`, `ExprIntrp_StackOfGeneralRelation`, `ExprIntrp_StackOfGeneralFunction`, `TColStd_ListOfAsciiString`, `FEmTool_ListOfVectors`, `Font_NListOfSystemFont`, `HLRAlgo_InterferenceList`, `HLRAlgo_ListOfBPoint`, `HLRBRep_ListOfBPnt2D`, `HLRTopoBRep_ListOfVData`, `IntAna_ListOfCurve`, `IntPolyh_ListOfCouples`, `IntTools_ListOfCurveRangeSample`, `IntTools_ListOfSurfaceRangeSample`, `IntTools_ListOfBox`, `MeshVS_PolyhedronVerts`, `Message_ListOfMsg`, `NLPlate_StackOfPlate`, `Poly_ListOfTriangulation`, `Prs3d_NListOfSequenceOfPnt`, `QANCollection_ListOfPnt`, `TDataStd_ListOfExtendedString`, `TDataStd_ListOfByte`, `TDF_AttributeList`, `TNaming_ListOfNamedShape`, `TDF_AttributeDeltaList`, `TDF_IDList`, `TDF_DeltaList`, `TNaming_ListOfIndexedDataMapOfShapeListOfShape`, `TNaming_ListOfMapOfShape`, `TopBas_ListOfTestInterference`, `TopOpeBRep_ListOfBipoint`, `TopOpeBRepBuild_ListOfLoop`, `TopOpeBRepBuild_ListOfListOfLoop`, `TopOpeBRepBuild_ListOfShapeListOfShape`, `TopOpeBRepBuild_ListOfPave`, `TopOpeBRepTool_ListOfC2DF`, `VrmlData_ListOfNode` +- Updated builds. -## v1.0.2 -* added constructors for `TColgp_Array1OfPnt` as manual bindings +### v1.0.0 -## v1.0.1 -* Updated builds +- First version using Embind and automatically generated bindings. +- Lots of breaking changes in this version. Most notably: + - Overloaded methods and constructors are now fully supported (on all supported classes). Please have a look at the [conventions](embind/conventions.md) for details. + - Static methods have a slightly different interface. Before, you would call them via `openCascade.ClassName.prototype.staticMethod()`. Now, you call them via `openCascade.ClassName.staticMethod()`. +- Largely improved coverage of the OpenCascade API. +- TypeScript support has been removed. It will be added back in, soon. -## v1.0.0 -* First version using Embind and automatically generated bindings. -* Lots of breaking changes in this version. Most notably: - * Overloaded methods and constructors are now fully supported (on all supported classes). Please have a look at the [conventions](embind/conventions.md) for details. - * Static methods have a slightly different interface. Before, you would call them via `openCascade.ClassName.prototype.staticMethod()`. Now, you call them via `openCascade.ClassName.staticMethod()`. -* Largely improved coverage of the OpenCascade API -* Typescript support has been removed. It will be added back in, soon. +### v0.1.19 -## v0.1.19 -* Last version with WebIDL bindings. +- Last version with WebIDL bindings. diff --git a/DEPS.json b/DEPS.json new file mode 100644 index 00000000..1535a8a3 --- /dev/null +++ b/DEPS.json @@ -0,0 +1,50 @@ +{ + "$schema": "deps-lock-v1", + "description": "Pinned dependency versions for reproducible opencascade.js builds. Both Dockerfile and build-wasm.sh reference this file.", + "dependencies": { + "occt": { + "repository": "https://github.com/Open-Cascade-SAS/OCCT.git", + "commit": "d3056ef80c9668f395da40f5fd7be186cae4501f", + "version": "V8_0_0", + "description": "Open CASCADE Technology — the C++ CAD kernel" + }, + "rapidjson": { + "repository": "https://github.com/Tencent/rapidjson.git", + "commit": "24b5e7a8b27f42fa16b96fc70aade9106cf7102f", + "version": "post-1.1.0 (master)", + "description": "JSON parser/generator for C++ (header-only)" + }, + "freetype": { + "repository": "https://github.com/freetype/freetype.git", + "commit": "de8b92dd7ec634e9e2b25ef534c54a3537555c11", + "version": "VER-2-13-0", + "description": "Font rendering library" + }, + "emscripten": { + "repository": "https://github.com/emscripten-core/emsdk.git", + "docker_image": "emscripten/emsdk:5.0.1", + "docker_digest": "sha256:c89732ef63a56de5a96395c5a8c1c7904f7420131a045406e6fedc4cbe1cc198", + "emsdk_version": "5.0.1", + "description": "Emscripten SDK for compiling C++ to WebAssembly" + }, + "llvm17": { + "version": "17.0.6", + "description": "Vendored prebuilt LLVM 17 — parse-side libc++ + clang resource headers for libclang 18.1.1 (N-1 compat window per libc++ support policy).", + "base_url": "https://github.com/llvm/llvm-project/releases/download/llvmorg-17.0.6", + "platforms": { + "darwin-arm64": { + "filename": "clang+llvm-17.0.6-arm64-apple-darwin22.0.tar.xz", + "sha256": "1264eb3c2a4a6d5e9354c3e5dc5cb6c6481e678f6456f36d2e0e566e9400fcad" + }, + "linux-x86_64": { + "filename": "clang+llvm-17.0.6-x86_64-linux-gnu-ubuntu-22.04.tar.xz", + "sha256": "884ee67d647d77e58740c1e645649e29ae9e8a6fe87c1376be0f3a30f3cc9ab3" + }, + "linux-aarch64": { + "filename": "clang+llvm-17.0.6-aarch64-linux-gnu.tar.xz", + "sha256": "6dd62762285326f223f40b8e4f2864b5c372de3f7de0731cb7cd55ca5287b75a" + } + } + } + } +} diff --git a/Dockerfile b/Dockerfile index d3c5d9a6..0bde0df9 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,75 +1,518 @@ -FROM emscripten/emsdk:3.1.14 AS base-image - -RUN \ - apt update -y && \ - apt install -y \ - bash \ - build-essential \ - cmake \ - curl \ - git \ - libffi-dev \ - libgdbm-dev \ - libncurses5-dev \ - libnss3-dev \ - libreadline-dev \ - libsqlite3-dev \ - libssl-dev \ - libbz2-dev \ - npm \ - python3 \ - python3-pip \ - python3-setuptools \ - zlib1g-dev - -RUN \ - pip install \ - libclang==15.0.6.1 \ - pyyaml==6.0 \ - cerberus==1.3.4 \ - argparse==1.4.0 - -WORKDIR /rapidjson/ -RUN \ - git clone -b v1.1.0 https://github.com/Tencent/rapidjson.git . - -WORKDIR /freetype/ -RUN \ - git clone -b VER-2-13-0 https://github.com/freetype/freetype.git . - -ENV OCCT_COMMIT_HASH_FULL bb368e271e24f63078129283148ce83db6b9670a -WORKDIR /occt/ -RUN \ - curl "https://git.dev.opencascade.org/gitweb/?p=occt.git;a=snapshot;h=${OCCT_COMMIT_HASH_FULL};sf=tgz" -o occt.tar.gz && \ - tar -xvf occt.tar.gz && \ - export OCCT_COMMIT_HASH=$(echo ${OCCT_COMMIT_HASH_FULL} | cut -c 1-7) && \ - mv occt-$OCCT_COMMIT_HASH/* . && \ - mv occt-$OCCT_COMMIT_HASH/.* . || true && \ - rm occt-$OCCT_COMMIT_HASH -r +# opencascade.js — OCCT V8 WASM build image +# +# Build: +# DOCKER_BUILDKIT=1 docker build -t opencascade-js . +# +# Per-tag production builds (consumer images): +# docker buildx build --target final-single -t opencascade-js:single-threaded . +# docker buildx build --target final-multi -t opencascade-js:multi-threaded . +# docker buildx build --target bindgen-base -t opencascade-js:bindgen-base . +# +# Default target is final-single (matches the canonical Quickstart tag). +# +# Run (single-mount Quickstart — outputs land next to your YAML): +# docker run --rm \ +# -v "$(pwd):/src" \ +# -u "$(id -u):$(id -g)" \ +# opencascade-js link my.yml +# +# Persistent caching across runs (recommended for iterative work): +# docker volume create ocjs-nx-cache ocjs-build-cache +# docker run --rm \ +# -v ocjs-nx-cache:/opencascade.js/.nx \ +# -v ocjs-build-cache:/opencascade.js/build \ +# -v "$(pwd):/src" \ +# -u "$(id -u):$(id -g)" \ +# opencascade-js link my.yml +# +# Environment overrides: +# docker run -e OCJS_OPT="-Os" -e OCJS_EXCEPTIONS=1 ... opencascade-js link my.yml +# +# YAML path resolution: relative paths (e.g. `link my.yml`) resolve against +# the bind-mounted WORKDIR (/src). Absolute paths (e.g. `link /src/my.yml`) +# are honoured as-is. See scripts/docker-entrypoint.sh::show_help for details. +# +# ───────────────────────────────────────────────────────────────────────────── +# Stage architecture (5 logical stages; final-{threading} are thin tag-bearing +# stages over the matching compiled-{threading} stage): +# +# deps-base OS toolchain (emsdk + apt + Node 24 + uv + Python 3.14) +# + clone-deps.sh (OCCT/rapidjson/freetype/LLVM 17 tarball) +# + LLVM 17 trim (~5 GB pruned in-RUN to ~250 MB) +# + apt/uv cache purge +# → invariant under in-repo source changes +# → not published +# +# bindgen-base deps-base + npm ci + apply-patches + pch + generate +# + delete generated .cpp/.h sources in same RUN +# → invariant under threading config +# → published as `:bindgen-base` (custom-bindings starting point) +# → consumers re-run `generate` against their own YAML +# +# compiled-single-threaded bindgen-base + (re)generate + compile-bindings +# compiled-multi-threaded + compile-sources (CMake static libs) +# + delete .cpp/.h sources, .cpp.o.d dep files, CMake scratch +# → fan-out per ARG threading +# → not published directly; final-{threading} adds metadata +# +# final-single compiled-{threading} + OCI labels + WORKDIR + ENTRYPOINT + CMD +# final-multi → published as `:single-threaded` / `:multi-threaded` +# +# Each named stage is independently buildable via `--target`. R10 in-RUN pruning +# is applied at every heavy stage; deletions stay inside the same RUN block so +# Docker layer storage actually shrinks (whiteout markers over fat parent layers +# would not). +# +# Notes on the underlying build pipeline: +# - All dependency fetching (OCCT/rapidjson/freetype git clones, Python venv, +# LLVM 17 tarball) is delegated to scripts/clone-deps.sh — the same script +# the host build uses. The Dockerfile is a thin OS+toolchain layer on top. +# - emsdk is the only dep clone-deps.sh skips here: the base image already +# ships /emsdk with the `emsdk` launcher, and the script's §2 explicitly +# detects this via `[ -x $EMSDK_DIR/emsdk ]`. A pre-symlink at +# /opencascade.js/deps/emsdk → /emsdk activates that path. +# - apt-installed Doxygen satisfies _ensure_doxygen at runtime (no GitHub download). +# - The entrypoint dispatches recognised subcommands through `npx nx run` so +# consumers benefit from Nx's content-addressed cache (warm runs ≤ 5 min). + +# syntax=docker/dockerfile:1.7 + +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 1: deps-base +# OS toolchain + dependency clones, with LLVM 17 trim and cache purge folded +# into the clone-deps RUN so all of those bytes are gone from the layer. +# ═════════════════════════════════════════════════════════════════════════════ +FROM emscripten/emsdk:5.0.1@sha256:c89732ef63a56de5a96395c5a8c1c7904f7420131a045406e6fedc4cbe1cc198 AS deps-base + +LABEL org.opencontainers.image.title="opencascade.js (deps-base)" \ + org.opencontainers.image.description="OS toolchain + dependency clones (emsdk, Node 24, uv, Python 3.14, OCCT, rapidjson, freetype, LLVM 17 — header-trimmed)" + +# ── System packages ───────────────────────────────────────────────────────── +# Notes on what is intentionally NOT installed: +# - cmake: installed via the PyPI wheel `cmake==4.3.2` in the venv below. +# Keeps host (`brew install cmake@4`) and container on the same major. +# - python3/python3-pip/python3-venv: replaced by `uv python install 3.14.4` +# which downloads python-build-standalone — bit-identical interpreter +# lineage on macOS arm64 and Linux arm64. Foundation for libclang +# parse-environment parity (see src/ocjs_bindgen/config/paths.py). +RUN --mount=type=cache,target=/var/cache/apt,id=ocjs-apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt/lists,id=ocjs-apt-lists,sharing=locked \ + apt-get update -y && \ + apt-get install -y --no-install-recommends \ + bash \ + build-essential \ + ca-certificates \ + curl \ + doxygen \ + git \ + gnupg \ + jq \ + libc6-dev \ + unzip \ + xz-utils + +# libc6-dev note: provides /usr/include/sys/types.h + friends (glibc userspace +# headers) that `_get_host_libc_include()` in src/ocjs_bindgen/config/paths.py +# routes libclang's parse pass at. Without this package, /usr/include has only +# /usr/include/stdint.h (from linux-libc-dev that build-essential pulls in) and +# OCCT headers transitively requesting fail to parse — the same +# silent type-degradation cascade that has historically struck libc++/libc +# version mismatches, just triggered by missing libc instead of mismatched +# libc++. On macOS Apple's SDK bundles a complete libc by default; on Linux it +# is a separate package. + +# ── Node.js 24 (NodeSource) ───────────────────────────────────────────────── +RUN --mount=type=cache,target=/var/cache/apt,id=ocjs-apt,sharing=locked \ + --mount=type=cache,target=/var/lib/apt/lists,id=ocjs-apt-lists,sharing=locked \ + curl -fsSL https://deb.nodesource.com/setup_24.x | bash - && \ + apt-get install -y --no-install-recommends nodejs + +# ── uv (Python toolchain manager) + Python 3.14.4 ─────────────────────────── +# uv installs python-build-standalone — same upstream CPython binary lineage +# on macOS arm64 and Linux arm64 for a given release tag. Replaces both apt +# python3* packages and pyenv. Host bootstrap is identical (see MAINTAINER.md). +# +# UV_PYTHON_INSTALL_DIR=/opt/uv-python relocates uv's python tree from +# /root/.local/share/uv/python/… (which has mode 0700 by default and breaks +# non-root execution via `docker run -u "$(id -u):$(id -g)"`) to a +# world-traversable /opt subtree. The venv at /opencascade.js/.venv/bin/python +# symlinks into this tree; without the relocation, non-root containers fail +# at startup with "python not found" because the symlink target lives under +# a directory the unprivileged user cannot traverse. +ENV UV_PYTHON_INSTALL_DIR=/opt/uv-python +RUN curl -LsSf https://astral.sh/uv/install.sh | \ + env UV_INSTALL_DIR=/usr/local/bin INSTALLER_NO_MODIFY_PATH=1 sh && \ + uv python install 3.14.4 && \ + chmod -R go+rX /opt/uv-python + +# Put /usr/local/bin (uv) ahead of emsdk's bundled Node 22 so `node`/`npm` +# resolve to the NodeSource-installed v24. The venv path gets prepended +# below after clone-deps.sh creates it. +# +# Emcc still uses its bundled Node 22 internally via the NODE_JS absolute +# path in /emsdk/.emscripten — that's how emscripten orchestrates its own +# toolchain and is independent of $PATH lookups. We only need Node 24 for +# our project's `npx nx run …` / `npm ci` invocations, matching the host's +# Node version (see .nvmrc and package.json:engines). +ENV PATH="/opencascade.js/.venv/bin:/usr/local/bin:/usr/bin:/bin:${PATH}" WORKDIR /opencascade.js/ + +# Pre-create the venv with the pinned Python so /opencascade.js/.venv/bin/python3 +# lands on PATH BEFORE clone-deps.sh runs (its line 53 requires python3 to parse +# DEPS.json). The script's §3 fast-paths past an already-created venv and still +# runs `uv pip install -r requirements.txt`, so this does NOT re-duplicate the +# pip-install logic — it just bootstraps the python3 binary the script needs to +# function. The base image intentionally has no system python3 (see uv-only +# note above). +RUN uv venv --python 3.14.4 /opencascade.js/.venv + +RUN mkdir -p /opencascade.js/deps && \ + ln -s /emsdk /opencascade.js/deps/emsdk + +COPY DEPS.json requirements.txt /opencascade.js/ +COPY scripts/clone-deps.sh /opencascade.js/scripts/clone-deps.sh + +# ── Dependency fetch + LLVM 17 trim + cache purge (mega-RUN, R10) ─────────── +# clone-deps.sh §1-§4 fetches: OCCT/rapidjson/freetype git checkouts, +# Python .venv pip install, LLVM 17 tarball extract (~5.6 GB). +# +# LLVM 17 trim: src/ocjs_bindgen/config/paths.py consumes only: +# - deps/llvm-17/include/c++/v1/ (libc++ generic headers) +# - deps/llvm-17/include//c++/v1/ (libc++ __config_site — +# Linux tarballs only; +# Apple bundles it under +# c++/v1/ directly) +# - deps/llvm-17/lib/clang/17/include/ (clang resource headers) +# The actual libclang.so used by the parse pass is the pip wheel +# `libclang==18.1.1`. Everything else in the LLVM 17 tarball (bin/, the rest +# of lib/, libexec/, share/) is unused by the build and prunable. +# We retain all of include/ (~100 MB) rather than just include/c++/ because +# pruning the target-triple subdir hides __config_site (a hard requirement +# for libc++ <__config> to parse) — see paths.py::_get_libc_include_args. +# +# uv pip cache: cleared because the venv is now fully populated and the +# downloaded wheel cache (~150 MB) is dead weight in the image. +RUN bash scripts/clone-deps.sh --dest /opencascade.js/deps && \ + echo "── Trimming LLVM 17 vendored tarball (R10) ────────────────────────" && \ + find /opencascade.js/deps/llvm-17 -mindepth 1 -maxdepth 1 \ + ! -name include \ + ! -name lib \ + -exec rm -rf {} + && \ + find /opencascade.js/deps/llvm-17/lib -mindepth 1 -maxdepth 1 \ + ! -name clang \ + -exec rm -rf {} + && \ + find /opencascade.js/deps/llvm-17/lib/clang -mindepth 1 -maxdepth 1 \ + ! -name 17 \ + -exec rm -rf {} + && \ + find /opencascade.js/deps/llvm-17/lib/clang/17 -mindepth 1 -maxdepth 1 \ + ! -name include \ + -exec rm -rf {} + && \ + echo "── LLVM 17 retained:" && \ + du -sh /opencascade.js/deps/llvm-17 && \ + echo "── Purging uv pip cache + apt lists ───────────────────────────────" && \ + uv cache clean && \ + rm -rf /root/.cache /tmp/* /var/tmp/* && \ + apt-get clean + +# Convenience top-level symlinks: preserve the long-standing /occt, /rapidjson, +# /freetype, /llvm-17 paths so the `ENV OCCT_ROOT=/occt` defaults below (and +# any external bind-mount UX like `-v /my/occt:/occt`) keep working. The real +# bytes live under /opencascade.js/deps/; these are just aliases. +RUN ln -s /opencascade.js/deps/OCCT /occt && \ + ln -s /opencascade.js/deps/rapidjson /rapidjson && \ + ln -s /opencascade.js/deps/freetype /freetype && \ + ln -s /opencascade.js/deps/llvm-17 /llvm-17 + +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 2: bindgen-base +# In-repo build system + npm ci + apply-patches + pch + generate, with +# generated .cpp/.h sources pruned in-RUN. Published as :bindgen-base — the +# custom-bindings starting point. Consumers re-run `generate` against their +# own YAML in the compile-bindings flow. +# ═════════════════════════════════════════════════════════════════════════════ +# bindgen-content holds every heavy build artifact (apply-patches + pch + +# generate + non-root perm chmod) but does NOT include the runtime entrypoint +# COPY or OCI labels. The published `:bindgen-base` image and the `compiled-*` +# stages both derive from this content layer. +# +# Splitting the published `bindgen-base` stage off this content layer is the +# architectural pre-condition for entrypoint patches being a thin terminal- +# layer change: when scripts/docker-entrypoint.sh changes, the COPY layer in +# the published `bindgen-base` and the `final-*` stages cache-miss, but +# `bindgen-content` (and therefore `compiled-single-threaded` / +# `compiled-multi-threaded`) cache-hit because they don't reference the +# entrypoint script at all. +FROM deps-base AS bindgen-content + +# Install Nx CLI + project devDeps deterministically from package-lock.json +COPY package.json package-lock.json nx.json project.json /opencascade.js/ +RUN --mount=type=cache,target=/root/.npm,id=ocjs-npm,sharing=locked \ + npm ci --no-audit --no-fund + +# Copy the build system. DEPS.json + scripts/clone-deps.sh were copied above +# (they are inputs to the dep-fetch RUN); this stage brings in the rest of +# the build system using an explicit allow-list of build-time scripts so the +# runtime-only docker-entrypoint.sh can be COPYed late in each ENTRYPOINT- +# bearing stage. That keeps future entrypoint patches as a thin terminal- +# layer change instead of invalidating apply-patches/pch/generate and the +# multi-GB compiled-* layers downstream. +# +# scripts/docker-entrypoint.sh — runtime, late-COPYed in final-* + bindgen-base +# scripts/docker-e2e-validate.sh — host-only, never enters the image +# scripts/clone-deps.sh — already in deps-base (line above), excluded here COPY src ./src -WORKDIR /src/ +COPY tsconfig.json* ./ +COPY build-configs ./build-configs +COPY build-wasm.sh ./build-wasm.sh +COPY scripts/enumerate-symbols.py scripts/validate-build.py scripts/generate-docs.mjs ./scripts/ +COPY scripts/lib ./scripts/lib +COPY bindgen-filters.yaml ./bindgen-filters.yaml +RUN chmod +x build-wasm.sh + +# ── Default environment ───────────────────────────────────────────────────── +# The named configuration in build-configs/configurations.json drives every +# build flag (-O3, SIMD, mimalloc, eval_ctors, closure, threading, etc.). +# Override at runtime with `-e OCJS_CONFIG=` (see +# build-configs/configurations.json for available named configurations) or +# per-flag overrides (`-e OCJS_OPT=-Os`, etc.). +ENV OCCT_ROOT=/occt +ENV RAPIDJSON_ROOT=/rapidjson +ENV FREETYPE_ROOT=/freetype +ENV EMSDK=/emsdk +# OCCT source patches (using-statement, Standard_Dump stub, noexcept dtors, +# STEPCAF DynamicType) are HARD REQUIREMENTS for every supported build — +# they're applied unconditionally by build-wasm.sh::step_apply_patches. +# The legacy OCJS_PATCH_DUMP / OCJS_PATCH_STEPCAF env-var toggles were +# removed because making required behaviour optional is a footgun. +# Output directory defaults to /src (the canonical Quickstart mount point) +# so single-mount `docker run -v "$(pwd):/src" …` writes artifacts next to +# the consumer's YAML automatically. Override with `-e OCJS_OUTPUT_DIR=` +# + a matching `-v` mount for power users who want a separate output dir. +ENV OCJS_OUTPUT_DIR=/src +# Strict-types guardrail: defaults to warn-only -- the link step always +# prints a triage summary to stderr if the .d.ts contains rewrites-to- +# `unknown` method signatures or unbound class references (the silent +# type-loss failure mode from the May-2026 replicad regression). The +# build proceeds. CI consumers who want to escalate the warning to a +# hard build failure should set OCJS_STRICT_TYPES=1 explicitly at +# `docker run` time. See `ocjs_bindgen.link.yaml_build._enforce_strict_types_gate` +# for the policy. + +RUN mkdir -p build/bindings build/sources + +# ── apply-patches + pch + generate + prune (mega-RUN, R10) ────────────────── +# Apply OCCT patches, build flat includes + PCH, generate Embind .cpp + .h + +# .d.ts.json fragments — then delete the generated .cpp/.h sources INSIDE +# this same RUN so they never appear in any image layer. PCH (the expensive +# bit, ~600 MB) and .d.ts.json (the type-graph index, ~few MB) are kept. +# +# Consumers of :bindgen-base who want a custom YAML build re-run `generate` +# against their own YAML; the cached PCH + patched OCCT tree make that step +# fast (~10-30s). The compiled-{threading} child stages also re-run +# `generate` because they need the .cpp files back to compile against. +# ── apply-patches + pch + generate + prune + non-root perms (mega-RUN) ────── +# Folding `chmod -R go+w` for the writable-by-non-root paths INTO this same +# RUN is critical: a separate `chmod -R` layer copies every modified inode +# (PCH ≈ 600 MB, build/ tree ≈ 1.5 GB) into the new overlay layer because +# overlayfs treats permission changes as content changes — that produces a +# ~2 GB duplicate layer for what should be a metadata-only operation. By +# applying chmod in-place inside the same RUN, the perms commit alongside +# the original file content with zero duplication. +# +# Consumers running with `docker run -u "$(id -u):$(id -g)"` need writable +# locations for Nx's content-addressed cache (.nx), build outputs (build/), +# and emsdk's per-run scratch. Without this chmod, the first non-root run +# fails with EACCES when Nx tries to create its .nx subdirectory under +# /opencascade.js (root:root mode 0755 by default). +RUN npx nx run ocjs:apply-patches && \ + npx nx run ocjs:pch && \ + npx nx run ocjs:generate && \ + echo "── Pruning generated .cpp/.h sources (kept: .d.ts.json + PCH) ────" && \ + find build/bindings -type f -name '*.cpp' -delete && \ + find build/bindings -type f -name '*.h' -delete && \ + rm -rf /root/.npm/_cacache && \ + echo "── Setting non-root execution perms (folded; avoids 2 GB chmod layer) ──" && \ + mkdir -p /opencascade.js/.nx && \ + chmod -R go+w /opencascade.js/.nx /opencascade.js/build && \ + chmod go+w /opencascade.js && \ + echo "── Allowing git on vendored OCCT/rapidjson/freetype for non-root runs ──" && \ + git config --system --add safe.directory '*' && \ + echo "── Marking .venv/.deps-ready (skip uv pip install on non-root rerun) ──" && \ + touch /opencascade.js/.venv/.deps-ready && \ + chmod go+w /opencascade.js/.venv/.deps-ready && \ + echo "── Making emsdk libembind.js writable for non-root reset+repatch ──" && \ + chmod go+w /emsdk/upstream/emscripten/src/lib \ + /emsdk/upstream/emscripten/src/lib/libembind.js + +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 2b: bindgen-base (published as ghcr.io/taucad/opencascade.js:bindgen-base) +# +# Thin published wrapper around `bindgen-content`: adds OCI labels, the +# late-COPY of the runtime entrypoint, WORKDIR/ENTRYPOINT/CMD. Patching +# `scripts/docker-entrypoint.sh` invalidates only the COPY + ENTRYPOINT +# layers here (and the equivalents in `final-single` / `final-multi`); the +# heavy `bindgen-content` stage and the downstream `compiled-*` stages +# cache-hit because they never reference the entrypoint script. +# ═════════════════════════════════════════════════════════════════════════════ +FROM bindgen-content AS bindgen-base + +# ── OCI metadata for the published :bindgen-base image ────────────────────── +ARG REVISION +ARG VERSION +ARG SOURCE_URL=https://github.com/taucad/opencascade.js +LABEL org.opencontainers.image.title="opencascade.js (bindgen-base)" \ + org.opencontainers.image.description="Custom-bindings starting point: OCCT patches + PCH + generate index pre-baked (.cpp sources pruned; re-run generate against your YAML)" \ + org.opencontainers.image.source="${SOURCE_URL}" \ + org.opencontainers.image.url="${SOURCE_URL}" \ + org.opencontainers.image.revision="${REVISION}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.licenses="LGPL-2.1-only" \ + org.opencontainers.image.vendor="taucad" + +# R17: :bindgen-base ships with the same docker-entrypoint dispatcher as the +# final-{threading} images so consumers get a consistent UX across all +# published tags. Consumers wanting interactive shell override the entrypoint: +# docker run --rm -it --entrypoint bash ghcr.io/taucad/opencascade.js:bindgen-base +COPY scripts/docker-entrypoint.sh /opencascade.js/scripts/docker-entrypoint.sh +WORKDIR /src +ENTRYPOINT ["/opencascade.js/scripts/docker-entrypoint.sh"] +CMD ["--help"] + +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 3a: compiled-single-threaded +# ═════════════════════════════════════════════════════════════════════════════ +# Note the `FROM bindgen-content` (not `bindgen-base`): inheriting from the +# pre-COPY content layer is what isolates `compiled-*` from entrypoint patches. +FROM bindgen-content AS compiled-single-threaded + +# Reset to /opencascade.js for the build-tree RUNs; final-* will WORKDIR /src. +WORKDIR /opencascade.js/ + +# Nx daemon plugin workers fail under Docker+qemu (linux/amd64 on arm64 hosts): +# "Failed to start plugin worker for plugin nx/core/package-json". Disabling +# here keeps bindgen-content cacheable while fixing compiled-* + consumer link. +ENV NX_DAEMON=false +ENV OCJS_CONFIG=single-threaded +ENV THREADING=single-threaded + +# ── (re)generate + compile-bindings + compile-sources + prune (mega-RUN) ──── +# bindgen-base deleted the generated .cpp/.h files from its own layer so the +# published :bindgen-base image stays small. compiled-{threading} re-runs +# generate (cheap given PCH + patches are cached) to materialise the .cpp +# files, then compiles them, then prunes the source files + CMake scratch. +# .o files for bindings + OCCT static .a libs are kept (needed for link). +RUN --mount=type=cache,target=/emsdk/upstream/emscripten/cache,id=ocjs-emsdk-${OCJS_CONFIG},sharing=locked \ + npx nx run ocjs:generate && \ + npx nx run ocjs:compile-bindings && \ + npx nx run ocjs:compile-sources && \ + echo "── Pruning compile intermediates (kept: .o files + OCCT .a libs) ──" && \ + find build/bindings -type f -name '*.cpp' -delete && \ + find build/bindings -type f -name '*.h' -delete && \ + find build -type f -name '*.cpp.o.d' -delete && \ + if [ -d build/occt-cmake ]; then \ + find build/occt-cmake -mindepth 1 -maxdepth 2 \ + ! -path 'build/occt-cmake/lin32' \ + ! -path 'build/occt-cmake/lin32/clang' \ + -prune -exec rm -rf {} + ; \ + find build/occt-cmake/lin32/clang -mindepth 1 -maxdepth 1 \ + ! -name lib \ + ! -name bin \ + -exec rm -rf {} + ; \ + fi && \ + echo "── Re-applying non-root perms (folded; bindgen-base chmod stale here) ──" && \ + chmod -R go+w /opencascade.js/.nx /opencascade.js/build + +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 3b: compiled-multi-threaded +# ═════════════════════════════════════════════════════════════════════════════ +FROM bindgen-content AS compiled-multi-threaded + +WORKDIR /opencascade.js/ + +ENV NX_DAEMON=false +ENV OCJS_CONFIG=multi-threaded +ENV THREADING=multi-threaded + +RUN --mount=type=cache,target=/emsdk/upstream/emscripten/cache,id=ocjs-emsdk-${OCJS_CONFIG},sharing=locked \ + npx nx run ocjs:generate && \ + npx nx run ocjs:compile-bindings && \ + npx nx run ocjs:compile-sources && \ + echo "── Pruning compile intermediates (kept: .o files + OCCT .a libs) ──" && \ + find build/bindings -type f -name '*.cpp' -delete && \ + find build/bindings -type f -name '*.h' -delete && \ + find build -type f -name '*.cpp.o.d' -delete && \ + if [ -d build/occt-cmake ]; then \ + find build/occt-cmake -mindepth 1 -maxdepth 2 \ + ! -path 'build/occt-cmake/lin32' \ + ! -path 'build/occt-cmake/lin32/clang' \ + -prune -exec rm -rf {} + ; \ + find build/occt-cmake/lin32/clang -mindepth 1 -maxdepth 1 \ + ! -name lib \ + ! -name bin \ + -exec rm -rf {} + ; \ + fi && \ + echo "── Re-applying non-root perms (folded; bindgen-base chmod stale here) ──" && \ + chmod -R go+w /opencascade.js/.nx /opencascade.js/build + +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 4a: final-single (published as ghcr.io/taucad/opencascade.js:single-threaded) +# ═════════════════════════════════════════════════════════════════════════════ +FROM compiled-single-threaded AS final-single -ARG threading=single-threaded -ENV threading=$threading +# ── OCI image metadata ────────────────────────────────────────────────────── +# REVISION/VERSION are injected by CI (docker/metadata-action + github.sha); +# SOURCE_URL defaults to the taucad fork and can be overridden for downstream +# rebuilds. Labels follow the opencontainers.org spec so `docker inspect` and +# GHCR's UI surface provenance, licensing, and source links automatically. +ARG REVISION +ARG VERSION +ARG SOURCE_URL=https://github.com/taucad/opencascade.js +LABEL org.opencontainers.image.title="opencascade.js (single-threaded)" \ + org.opencontainers.image.description="OpenCASCADE.js single-threaded WASM build image (warm cache, ≤5min link)" \ + org.opencontainers.image.source="${SOURCE_URL}" \ + org.opencontainers.image.url="${SOURCE_URL}" \ + org.opencontainers.image.revision="${REVISION}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.licenses="LGPL-2.1-only" \ + org.opencontainers.image.vendor="taucad" -FROM base-image AS test-image +# WORKDIR /src makes the consumer's bind-mounted YAML directory the working +# directory at runtime. Combined with `ENV OCJS_OUTPUT_DIR=/src` in +# bindgen-base, the canonical single-mount Quickstart pattern +# (`docker run -v "$(pwd):/src" …`) writes artifacts next to the YAML. +# +# Late-COPY of docker-entrypoint.sh: see bindgen-base for the rationale — +# any future entrypoint patch only invalidates this terminal layer, not the +# multi-GB compiled-single-threaded content above. +COPY scripts/docker-entrypoint.sh /opencascade.js/scripts/docker-entrypoint.sh +WORKDIR /src -RUN \ - mkdir /opencascade.js/build/ && \ - mkdir /opencascade.js/dist/ && \ - /opencascade.js/src/applyPatches.py +ENTRYPOINT ["/opencascade.js/scripts/docker-entrypoint.sh"] +CMD ["--help"] -ENTRYPOINT ["/opencascade.js/src/buildFromYaml.py"] +# ═════════════════════════════════════════════════════════════════════════════ +# Stage 4b: final-multi (published as ghcr.io/taucad/opencascade.js:multi-threaded) +# ═════════════════════════════════════════════════════════════════════════════ +FROM compiled-multi-threaded AS final-multi -FROM test-image AS custom-build-image +ARG REVISION +ARG VERSION +ARG SOURCE_URL=https://github.com/taucad/opencascade.js +LABEL org.opencontainers.image.title="opencascade.js (multi-threaded)" \ + org.opencontainers.image.description="OpenCASCADE.js multi-threaded WASM build image (requires COOP/COEP on consumer pages)" \ + org.opencontainers.image.source="${SOURCE_URL}" \ + org.opencontainers.image.url="${SOURCE_URL}" \ + org.opencontainers.image.revision="${REVISION}" \ + org.opencontainers.image.version="${VERSION}" \ + org.opencontainers.image.licenses="LGPL-2.1-only" \ + org.opencontainers.image.vendor="taucad" -RUN \ - /opencascade.js/src/generateBindings.py && \ - /opencascade.js/src/compileBindings.py ${threading} && \ - /opencascade.js/src/compileSources.py ${threading} && \ - chmod -R 777 /opencascade.js/ && \ - chmod -R 777 /occt +# Late-COPY of docker-entrypoint.sh: see bindgen-base for the rationale — +# any future entrypoint patch only invalidates this terminal layer, not the +# multi-GB compiled-multi-threaded content above. +COPY scripts/docker-entrypoint.sh /opencascade.js/scripts/docker-entrypoint.sh +WORKDIR /src -ENTRYPOINT ["/opencascade.js/src/buildFromYaml.py"] +ENTRYPOINT ["/opencascade.js/scripts/docker-entrypoint.sh"] +CMD ["--help"] diff --git a/LICENSE.OCCT-Exception b/LICENSE.OCCT-Exception new file mode 100644 index 00000000..9e7df979 --- /dev/null +++ b/LICENSE.OCCT-Exception @@ -0,0 +1,17 @@ +Open CASCADE exception (version 1.0) to GNU LGPL version 2.1. + +The object code (i.e. not a source) form of a "work that uses the Library" +can incorporate material from a header file that is part of the Library. +As a special exception to the GNU Lesser General Public License version 2.1, +you may distribute such object code incorporating material from header files +provided with the Open CASCADE Technology libraries (including code of CDL +generic classes) under terms of your choice, provided that you give +prominent notice in supporting documentation to this code that it makes use +of or is based on facilities provided by the Open CASCADE Technology software. + +--- + +This package, @taucad/opencascade.js, ships compiled object code derived from +the Open CASCADE Technology libraries (https://www.opencascade.com/), used +under the LGPL-2.1 with the Open CASCADE exception above. See LICENSE for the +full text of the GNU Lesser General Public License, version 2.1. diff --git a/MAINTAINER.md b/MAINTAINER.md new file mode 100644 index 00000000..3e834490 --- /dev/null +++ b/MAINTAINER.md @@ -0,0 +1,162 @@ +# Maintainer Guide + +Build-from-source, configuration, and release workflow for `@taucad/opencascade.js`. Consumers reaching for the published tarball should start from [README.md](README.md) — this document is for fork maintainers and contributors building OCCT WASM locally. + +## Table of Contents + +- [Quick Start (Native Build)](#quick-start-native-build) +- [Build Configuration](#build-configuration) + - [YAML Configs](#yaml-configs) + - [Configurations](#configurations) + - [Environment Variables](#environment-variables) +- [Customizing Your Build](#customizing-your-build) +- [Build Commands](#build-commands) +- [Docker End-to-End Validation](#docker-end-to-end-validation) +- [Additional Documentation](#additional-documentation) + +## Quick Start (Native Build) + +Prerequisites: Python 3.10+, Git, CMake, a C++ toolchain. + +```bash +# 1. Clone opencascade.js +git clone https://github.com/taucad/opencascade.js.git +cd opencascade.js + +# 2. Install Emscripten SDK +git clone https://github.com/emscripten-core/emsdk.git ../emsdk +cd ../emsdk && ./emsdk install 5.0.1 && ./emsdk activate 5.0.1 && source ./emsdk_env.sh +cd ../opencascade.js + +# 3. Clone dependencies at pinned commits +./scripts/clone-deps.sh + +# 4. Install Python build dependencies +pip install -r requirements.txt + +# 5. Build WASM (use nohup — full builds take 10-30+ min) +nohup env OCJS_LTO=0 ./build-wasm.sh full build-configs/full.yml > build.log 2>&1 & +tail -f build.log +``` + +> **Tip:** Full builds take 10-30+ minutes (longer with cold caches). Using `nohup` ensures the build continues if your terminal session disconnects. For link-only rebuilds (~1-2 min), `nohup` is optional. + +Output files appear alongside the YAML config: `opencascade_full.wasm`, `opencascade_full.js`, `opencascade_full.d.ts`. + +## Build Configuration + +### YAML Configs + +YAML configs define which OCCT classes are bound to JavaScript: + +- `build-configs/full.yml` — all symbols, single-threaded, native WASM exceptions on by default with `getExceptionMessage` runtime helpers + +See [docs/reference/yaml-schema.md](docs/reference/yaml-schema.md) for the full YAML schema, including `additionalCppCode`, `additionalCppFiles`, and `mainBuild.additionalBindCode`. + +### Configurations + +Named compile-time configurations live in [`build-configs/configurations.json`](build-configs/configurations.json). Apply one with `--config`: + +```bash +# Production default — what the published tarball is built with: -O3, baseline SIMD, +# BigInt, native WASM exceptions, EVAL_CTORS=2, Closure, converge, mimalloc. +./build-wasm.sh --config single-threaded full build-configs/full.yml + +# Size-tuned variant: -Os compile + wasm-opt -O3, same feature set, smaller binary +./build-wasm.sh --config single-threaded-smallest full build-configs/full.yml + +# Threaded variant for SAB/COOP+COEP-isolated deployments +./build-wasm.sh --config multi-threaded full build-configs/full.yml + +# Debug — fastest build, -O0 compile + wasm-opt -O0, SIMD off, converge off +./build-wasm.sh --config debug full build-configs/full.yml +``` + +Add your own entry to `configurations.json` to define a new configuration. See [BUILD_SYSTEM.md](BUILD_SYSTEM.md) for the full list of `OCJS_*` keys. + +The published npm tarball ships **both** build outputs: + +| Artifact prefix | Config | Subpath export | +| -------------------------- | ----------------------------------- | -------------------------------------------------------------------- | +| `opencascade_full.*` | `single-threaded` + `full.yml` | `@taucad/opencascade.js` / `@taucad/opencascade.js/wasm` | +| `opencascade_full_multi.*` | `multi-threaded` + `full_multi.yml` | `@taucad/opencascade.js/multi` / `@taucad/opencascade.js/multi/wasm` | + +Each triple includes a matching `*.provenance.json` sidecar (`dist/opencascade_full.provenance.json` and `dist/opencascade_full_multi.provenance.json`). + +### npm release + +After `dist/` contains both ST and MT artifacts and smoke tests pass: + +```bash +npm pack --dry-run # verify tarball lists all 12 dist files (6 ST + 6 MT) +npm publish --tag rc --access public +``` + +Do **not** publish from a dirty tree or without both binaries present — consumers expect the MT subpath to resolve at install time. + +### Environment Variables + +Two layers of "default" matter here. The **bare default** is what `build-wasm.sh` falls back to if you set neither an env var nor a `--config`. The **shipped `full.yml` build** is what the published `@taucad/opencascade.js` tarball was actually linked with — the YAML config carries its own `emccFlags` (`-sWASM_BIGINT`, `-sEVAL_CTORS=2`, `-msimd128`) that win regardless of env var, and every named entry in [`build-configs/configurations.json`](build-configs/configurations.json) sets the corresponding `OCJS_*` envs to match. + +| Variable | Bare default | Shipped `full.yml` build | Description | +| ------------------- | ----------------- | ------------------------ | -------------------------------------------------------------------------------------------------------------------- | +| `OCJS_OPT` | `-O2` | `-O3` | Compile optimization level | +| `OCJS_LTO` | `1` | `0` | LTO at compile time. Empirically harmful for OCCT — see [custom emcc flags guide](docs/guides/custom-emcc-flags.md). | +| `OCJS_EXCEPTIONS` | `0` | `1` | Native WASM exceptions. Shipped build forces this on for decodable C++ exceptions. | +| `OCJS_SIMD` | `0` | `1` | Baseline WASM SIMD (`-msimd128`). Universally supported. | +| `OCJS_RELAXED_SIMD` | `0` | `0` | Relaxed SIMD ops on top of `OCJS_SIMD`. Safari 26.x cannot parse these — leave off for cross-browser builds. | +| `OCJS_BIGINT` | `0` | `1` | `-sWASM_BIGINT` for native i64↔BigInt; eliminates the i64 legalization pass. | +| `OCJS_EVAL_CTORS` | `false` | `true` | `-sEVAL_CTORS=N` static-init evaluation at compile time. | +| `OCJS_EXTRA_CFLAGS` | _(empty)_ | _(empty)_ | Extra compile flags appended to C/CXX (e.g. `"-mllvm -inline-threshold=128"`). | +| `OCJS_DEFINES` | _(empty)_ | `OCCT_NO_DUMP` | Comma-separated list of `-D` macros. | +| `OCJS_UNDEFINES` | _(empty)_ | `OCC_CONVERT_SIGNALS` | Comma-separated list of `-U` undefines. | +| `THREADING` | `single-threaded` | `single-threaded` | Threading mode (`single-threaded` or `multi-threaded`). | + +The bare-default column is only relevant if you invoke `build-wasm.sh` without `--config` _and_ without `OCJS_CONFIG` — the script's own fallback selects the `single-threaded` configuration when both are unset, so in practice you always get the rightmost column unless you go out of your way to disable it. + +## Customizing Your Build + +Create a custom YAML config with only the symbols your application needs: + +1. Copy `build-configs/full.yml` as a starting point +2. Remove symbols you don't use from `bindings` +3. (Most cases) handle typedefs for NCollection and `Handle` types are auto-discovered, so manual `additionalCppCode` edits are usually unnecessary. Edit only when you hit a missing-handle linker error. +4. Validate: `./build-wasm.sh validate build-configs/my-config.yml` +5. Build: `./build-wasm.sh link build-configs/my-config.yml` + +Fewer symbols = smaller WASM binary. Each symbol adds ~15-25 KB. + +## Build Commands + +```bash +# Full build — always use nohup (10-30+ min) +nohup env ./build-wasm.sh full > build.log 2>&1 & + +./build-wasm.sh link # Link only (fastest, reuses .o files) +./build-wasm.sh validate # Validate config without building +./build-wasm.sh cache-list # List cached compilations +./build-wasm.sh cache-gc [n] # Clean old cache entries +./build-wasm.sh --help # Full usage information +``` + +## Docker End-to-End Validation + +`scripts/docker-e2e-validate.sh` builds the image, links a consumer YAML, asserts byte-size delta versus a locally-built baseline, and runs a JS smoke test. Driven via Nx: + +```bash +pnpm nx run ocjs:docker-e2e +``` + +The script verifies image build success, consumer link, wasm byte-size delta against a local baseline, and a JS-side smoke test. + +## Additional Documentation + +- [BREAKING_CHANGES.md](BREAKING_CHANGES.md) — consumer migration guide +- [CHANGELOG.md](CHANGELOG.md) — release notes +- [BUILD_SYSTEM.md](BUILD_SYSTEM.md) — full `OCJS_*` env-var matrix and configuration authoring +- [docs/reference/yaml-schema.md](docs/reference/yaml-schema.md) — YAML schema reference +- [docs/guides/custom-emcc-flags.md](docs/guides/custom-emcc-flags.md) — tuning size, speed, and build time +- [docs/guides/trim-symbols.md](docs/guides/trim-symbols.md) — trim from `full.yml` to a consumer-sized build +- [docs/guides/extend-with-cpp.md](docs/guides/extend-with-cpp.md) — add wrappers via `additionalCppCode` / `additionalCppFiles` / `additionalBindCode` +- [docs/guides/reproducible-ci.md](docs/guides/reproducible-ci.md) — pin-by-SHA, `provenance.json`, SBOM, lockfile discipline +- [TODO.md](TODO.md) — contributor backlog diff --git a/README.md b/README.md index 895c6446..835452ee 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,7 @@ -[![Build OpenCascade.js](https://github.com/donalffons/opencascade.js/actions/workflows/buildFull.yml/badge.svg?event=workflow_dispatch)](https://github.com/donalffons/opencascade.js/actions/workflows/buildFull.yml) -![OpenCascade Version](https://img.shields.io/badge/OpenCascade%20Version-7.6.2-green.svg) -

Logo -

OpenCascade.js

+

opencascade.js

A port of the OpenCascade CAD library to JavaScript and WebAssembly via Emscripten. @@ -12,22 +9,194 @@ Explore the docs »

- Examples - · - Issues + Issues · - Discuss + Discuss

-# Projects & Examples: +

+ docker + ghcr +

+ +## Choose Your Path + +| I want to… | Go to | +| ---------------------------------------------------------- | ----------------------------------------------------------------------------------------- | +| **Use OCCT from JS or TS** (npm install, ESM `init`) | [Quickstart (npm)](#quickstart-npm) | +| **Run a reproducible build** (CI, Docker, custom YAML) | [Quickstart (Docker)](#quickstart-docker) | +| **See what changed in v3** (OCCT V8, ESM-only, exceptions) | [What's New in v3](#whats-new-in-v3) · [BREAKING_CHANGES.md](BREAKING_CHANGES.md) | +| **Customize the binding set** (trim YAML, add wrappers) | [docs/reference/yaml-schema.md](docs/reference/yaml-schema.md) | +| **Build OCCT WASM from source** (fork maintainers) | [MAINTAINER.md](MAINTAINER.md) | +| **Contribute or report an issue** | [Contributing](#contributing) · [Issues](https://github.com/taucad/opencascade.js/issues) | + +## Table of Contents + +- [Choose Your Path](#choose-your-path) +- [Table of Contents](#table-of-contents) +- [Quickstart (npm)](#quickstart-npm) + - [Multi-threaded build](#multi-threaded-build) +- [Quickstart (Docker)](#quickstart-docker) +- [Tags](#tags) +- [What's New in v3](#whats-new-in-v3) +- [Documentation](#documentation) +- [Projects Using opencascade.js](#projects-using-opencascadejs) +- [Contributing](#contributing) +- [License](#license) + +## Quickstart (npm) + +> Upgrading from v2? See **[BREAKING_CHANGES.md](BREAKING_CHANGES.md)** for the v3 migration guide (package rename, ESM-only loading, exception decode pattern, OCCT V8 API). + +```bash +pnpm add @taucad/opencascade.js@beta +# or: npm install @taucad/opencascade.js@beta +``` + +The package is ESM-only with a default-export `init` function. Pass `locateFile` so the Emscripten loader can resolve the wasm binary from your bundler's output (browser) or `node_modules` layout (Node). Both runtimes reach the binary through the `@taucad/opencascade.js/wasm` subpath export — no `dist/...` deep imports required. + +```ts +// Node +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import init from '@taucad/opencascade.js'; + +const WASM_DIR = dirname(fileURLToPath(import.meta.resolve('@taucad/opencascade.js/wasm'))); + +const oc = await init({ + locateFile: (filename: string) => join(WASM_DIR, filename), +}); + +using box = new oc.BRepPrimAPI_MakeBox(10, 10, 10); +const shape = box.Shape(); +``` + +```ts +// Vite / browser +import init from '@taucad/opencascade.js'; +import wasmUrl from '@taucad/opencascade.js/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); +``` + +The published tarball ships pre-built WASM at `dist/opencascade_full.{wasm,js,d.ts}` (single-threaded default) and `dist/opencascade_full_multi.{wasm,js,d.ts}` (multi-threaded opt-in), each with a `provenance.json` sidecar describing the exact toolchain and source commits used. + +### Multi-threaded build + +For batch meshing, boolean grids, and STEP→glTF pipelines that benefit from OCCT's internal thread pool, import the pthread-enabled variant instead of the default: + +```ts +// Node +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import init from '@taucad/opencascade.js/multi'; + +const WASM_DIR = dirname(fileURLToPath(import.meta.resolve('@taucad/opencascade.js/multi/wasm'))); + +const oc = await init({ + locateFile: (filename: string) => join(WASM_DIR, filename), +}); + +// Run once after init — flip OCCT global parallel defaults and size the thread pool. +oc.BOPAlgo_Options.SetParallelMode(true); // booleans fan out by default +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); // meshing fan out by default +const pool = oc.OSD_ThreadPool.DefaultPool(-1); // lazy-init pool to NbLogicalProcessors +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); // let each call use all workers +``` + +```ts +// Vite / browser (requires COOP/COEP headers — see docs) +import init from '@taucad/opencascade.js/multi'; +import wasmUrl from '@taucad/opencascade.js/multi/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); + +oc.BOPAlgo_Options.SetParallelMode(true); +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); +using pool = oc.OSD_ThreadPool.DefaultPool(-1); +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); +``` + +Browsers require `Cross-Origin-Opener-Policy: same-origin` and `Cross-Origin-Embedder-Policy: require-corp` on every page that loads the threaded wasm. See the [multi-threaded build guide](https://ocjs.org/docs/package/guides/multi-threading) for activation, benchmarks, and when not to ship threaded; [toolchain custom-build](https://ocjs.org/docs/toolchain/guides/multi-threading) covers the YAML recipe for trimmed MT variants. + +## Quickstart (Docker) + +Pre-built images are published to [ghcr.io/taucad/opencascade.js](https://github.com/taucad/opencascade.js/pkgs/container/opencascade.js): + +- **Release tags** (`v*`) publish multi-arch manifest lists (`linux/amd64` + `linux/arm64`). +- **Branch pushes** publish `linux/amd64`-only images for fast smoke iteration. + +No local build required. + +```bash +docker pull ghcr.io/taucad/opencascade.js:single-threaded + +# Single-mount Quickstart — outputs land next to your YAML +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js:single-threaded link my-config.yml +``` + +For cached iterative builds (link-only reruns in ≤ 5 min), see the named-volume recipe in [MAINTAINER.md](MAINTAINER.md#docker-end-to-end-validation). Apple Silicon runs natively from the manifest list — no `--platform` flag required. + +The entrypoint dispatches subcommands (`link`, `compile-bindings`, `compile-sources`, `pch`, `generate`, `apply-patches`) through `npx nx run ocjs:`. `link` is the end-to-end command — Nx's `dependsOn` graph pulls every upstream step with cache reuse, so a fresh container performs a full build and cached re-runs replay only the link. Use `docker run … --help` for the complete reference, or `docker run … nx ` as an escape hatch into raw Nx. + +## Tags + +| Tag | What it points at | +| ------------------------------- | ---------------------------------------------------------------------------------- | +| `:single-threaded` | Latest release, single-threaded warm cache (default for browser CAD UIs) | +| `:multi-threaded` | Latest release, multi-threaded warm cache (requires COOP/COEP) | +| `:bindgen-base` | Latest release, post-PCH/generate but pre-compile (custom-bindings starting point) | +| `:-single-threaded` | Pinned release, single-threaded (e.g. `:3.0.0-single-threaded`) | +| `:-multi-threaded` | Pinned release, multi-threaded | +| `:-bindgen-base` | Pinned release, bindgen-base | +| `:branch-` | Branch tip, single-threaded (amd64-only, ephemeral — 7-day GHCR retention) | +| `:multi-threaded-branch-` | Branch tip, multi-threaded (amd64-only, ephemeral) | +| `:bindgen-base-branch-` | Branch tip, bindgen-base (amd64-only, ephemeral) | + +On release tags, Docker resolves the right architecture from the manifest list automatically — no `--platform` flag is needed on either `linux/amd64` or `linux/arm64` hosts. + +## What's New in v3 + +- **OCCT 8.0.0** — 1,085 commits of improvements; 22-31% faster boolean operations +- **Emscripten 5.0.1** — LLVM 17, modern WASM features +- **Native WASM Exceptions** — `-fwasm-exceptions` replaces JS invoke trampolines; decodable end-to-end via `getExceptionMessage` +- **ESM-only distribution** — `"type": "module"`; default export is single-threaded `opencascade_full.{js,wasm,d.ts}`; multi-threaded `opencascade_full_multi.{js,wasm,d.ts}` ships under `@taucad/opencascade.js/multi` and `/multi/wasm` +- **Full TypeScript bindings** — Doxygen-derived JSDoc rendered correctly in Monaco IntelliSense +- **Suffix-free overloads** — single symbol per class with val-based dispatcher, no more `_2`/`_3` subclasses (measured at ~264 ns/call, <0.011% of wall time on typical CAD models — see [BENCHMARKS.md](BENCHMARKS.md)) +- **Reproducible builds** — `DEPS.json` pins every dependency to an exact commit; per-build `provenance.json` sidecar +- **Cached, incremental builds** — content-addressed compilation cache turns 10-30 minute clean builds into seconds on hit + +See [CHANGELOG.md](CHANGELOG.md) for the full v3.0.0 entry. For empirical evidence of every measurable fork change (wall-clock CAD perf vs native C++, multi-threading speedup, embind dispatch cost, RBV overhead), see **[BENCHMARKS.md](BENCHMARKS.md)**. + +## Documentation + +- [BREAKING_CHANGES.md](BREAKING_CHANGES.md) — v3 consumer migration guide +- [CHANGELOG.md](CHANGELOG.md) — release notes +- **[BENCHMARKS.md](BENCHMARKS.md)** — empirical evidence hub: wall-clock CAD perf vs native C++, multi-threading speedup, embind dispatch cost, RBV overhead +- [MAINTAINER.md](MAINTAINER.md) — native build, env vars, customization for fork maintainers +- [docs/reference/yaml-schema.md](docs/reference/yaml-schema.md) — YAML schema (bindings, emccFlags, additionalCppCode, additionalCppFiles, additionalBindCode) +- [BUILD_SYSTEM.md](BUILD_SYSTEM.md) — `OCJS_*` env-var matrix and configuration authoring +- [docs/guides/custom-emcc-flags.md](docs/guides/custom-emcc-flags.md) — tuning size, speed, and build time +- [docs/guides/trim-symbols.md](docs/guides/trim-symbols.md) — trim from `full.yml` to a consumer-sized build +- [docs/guides/extend-with-cpp.md](docs/guides/extend-with-cpp.md) — add wrappers via `additionalCppCode` / `additionalCppFiles` / `additionalBindCode` +- [docs/guides/reproducible-ci.md](docs/guides/reproducible-ci.md) — pin-by-SHA, `provenance.json`, SBOM, lockfile discipline + +## Projects Using opencascade.js + +- [ArchiYou](https://archiyou.com/) — Library, Code-CAD Design Tool, Community Hub +- [BitByBit](https://bitbybit.dev/) — Code- & node-based CAD Design Tool +- [CascadeStudio](https://github.com/zalo/CascadeStudio) — Library and Code-CAD Design Tool +- [RepliCAD](https://replicad.xyz/) — Library and Code-CAD Design Tool +- [Tau](https://tau.new/) — AI-native CAD platform for the web + +## Contributing -* [ArchiYou](https://archiyou.com/): Library, Code-CAD Design Tool, Community Hub -* [BitByBit](https://bitbybit.dev/): Code- & node-based - CAD Design Tool -* [CascadeStudio](https://github.com/zalo/CascadeStudio): Library and Code-CAD Design Tool -* [RepliCAD](https://replicad.xyz/): Library and Code-CAD Design Tool -* [OpenCascade.js-examples](https://github.com/donalffons/opencascade.js-examples): Contains general examples on how to use the library. +Contributions are welcome! See [TODO.md](TODO.md) for the current backlog and [MAINTAINER.md](MAINTAINER.md) for build-from-source instructions. -# Contributing +## License -Contributions are welcome! Feel free to have a look at the [todo-list](TODO.md) if you need some inspiration on what else needs to be done. +See [LICENSE](LICENSE). diff --git a/TODO.md b/TODO.md index 82c88f66..be17f881 100644 --- a/TODO.md +++ b/TODO.md @@ -1,42 +1,47 @@ -# OpenCascade.js To-Do's +# opencascade.js — backlog (v3) -## 1. AdditionalCppCode +An honest, public backlog. Items here are either next-cut work or known investigations that have not yet landed. Closed items live in [`CHANGELOG.md`](CHANGELOG.md). Test failures and bugs go to GitHub issues, not here. -* not specifying additionalCppCode should give you the default tools from opencascade.full.yml +## Bindgen -## 2. Improve Bindings +- **Regex / glob support in YAML `bindings`**: today, every entry must be a literal `- symbol: ClassName`. Adding `- pattern: ^STEPControl_.*$` would compress hand-trimmed YAML files and reduce drift between consumer YAML and OCCT releases. +- **Trailing-default parity for C-string-wrapper methods**: the trailing-default → optional-arg parity that landed for plain methods (e.g. `BRepOffsetAPI_ThruSections::Build`) is gated off for the C-string wrapper path. Methods like `IFSelect_Act::SetGroup(group, file = "")` still require explicit `file=""` from JS. ~30 OCCT methods are affected; folding the truncation loop into the C-string-wrapper emit in `Bindings.processMethodOrProperty` (the `hasCStringArgs` / `returnIsCString` branch around `bindings.py:1463`) would close the gap. The TS gate in `TypescriptBindings.processMethodOrProperty` must stay coherent with whatever the embind side accepts. +- **Trailing-default parity for multi-overload methods**: same gap, gated by `numOverloads == 1`. When a class has multiple same-named overloads and one carries trailing defaults, the truncation has to be registered alongside the existing `select_overload<>` entries without colliding with the `_emitValDispatchMethod` arity-tree. Mechanical extension; needs collision testing against the val-dispatch path in `bindings.py`. +- **Trailing-default parity for return-by-value-wrapper methods**: methods whose return type triggers `_returnTypeRequiresValueWrapper` already emit a custom `optional_override` lambda; that lambda would need its own truncation loop to fan out arities. Not on the critical path for the original `Build()` smoking gun but worth folding in once (1) and (2) above land so the four method-emit gates collapse into a single shared truncation helper. +- **Single source of truth for the trailing-default eligibility gate**: TS (`TypescriptBindings.processMethodOrProperty`) and embind (`Bindings.processMethodOrProperty`) currently duplicate the predicate set (`numOverloads == 1`, `not hasOutputParams`, `not hasCStringArgs`, `not returnIsCString`, `not _returnTypeRequiresValueWrapper`). Extract into a shared helper (e.g. `_methodTrailingDefaultsEligible(method, args)`) so future tightenings/relaxations cannot drift between surfaces and silently emit `?`-marked TS args without a matching embind binding (the asymmetric-trap class of bug discovered during the PoC). +- **`std::optional` as a return type (Gate-5)**: bindgen consumes `std::optional` only as a _parameter_ wrapper today (matrix rows {3, 4, 5, 21, 22}); it never emits it as a _return_ type. A method whose C++ signature is `std::optional foo(...)` should map `std::optional(v) → v` and `std::nullopt → undefined` on the JS side, with the `.d.ts` rendering the return as `T | undefined`. Work: (1) detect an `std::optional` return in the embind emit path and route it through `register_optional::fromWireType` (the wire converter already round-trips both directions — confirmed by the PoC's `t3_maybe_value` in `experiments/poc-occt-integration/t1-t4.test.mjs`); (2) teach the `.d.ts` return-type renderer to unwrap `std::optional` to `T | undefined` (mirror of the param-side `T?` handling); (3) flip `OPTIONAL_RETURN_AVAILABLE = true` and write the real bodies in `tests/smoke/smoke-optional-return-types.test.ts` (3 activation-gate pins are already authored and skipped against this flag). Cross-check the strict-null discipline: a returned `nullopt` collapses to `undefined` (not `null`), keeping the surface consistent with rule 5's `undefined`-means-absence convention. Deferred to Gate 5 per `docs/research/ocjs-optional-overload-resolution-blueprint.md` ("Open Items Deferred to Gate 5"); no production OCCT signature is blocked on it yet, so it can land opportunistically once a real `std::optional`-returning surface is in scope. +- **`register_optional` for enum/class inner types (P1)**: `register_optional` ships only for `bool` (203 sites), `handle` (102), `handle` (2), `int` (1), `TDF_HAllocator` (1) — and zero enum/class/`double` inner types. Any genuine `std::optional` parameter therefore reaches an unbound type at runtime and the full-arity ctor/method throws `Cannot construct … due to unbound types`. Bound public casualties (per `docs/research/ocjs-register-optional-enum-class-gap.md`): `BRepGraph_ParentExplorer` / `BRepGraph_ChildExplorer` (inner enum `BRepGraph_NodeId::Kind` — avoid-kind pruning + `Config` ctor + `GetConfig()` slice; arities 2–4 still work via arity-pad), and `Bnd_Box::Center` / `Bnd_Box2d::Center` (`optional` / `optional` — trivially recovered today via `CornerMin()`/`CornerMax()` midpoint). Fix: emit a `register_optional` for every enum/class used as a genuine `std::optional` param. Restoring all _public_ sites needs 3 inner types (`BRepGraph_NodeId::Kind`, `gp_Pnt`, `gp_Pnt2d`); ≈6 (+`double` + `math_Vector`/`math_Matrix`) also covers the internal modern-V8 math result family. Also harden `tests/smoke/smoke-genuine-optional-param.test.ts` to exercise (and fail loudly on) the full-arity enum ctor — its current 4-arg non-throw assertions route around the unbound invoker and mask the gap. Unblocks the `MIXED_DISPATCH_AVAILABLE` skipped smoke (`tests/smoke/smoke-mixed-fanout-optional.test.ts`). +- **Generic template-typedef discovery — the "R9" durable fix (P1)**: template-typedef discovery in `discover.py` is gated on the `NCOLLECTION_CONTAINERS` allowlist, so non-NCollection instantiations (`math_VectorBase` = `math_Vector`, `BVH_Box`, `std::bitset<18>`, …) are never enumerated and never get a constructible `class_<>` binding. Consequences: the `math_Vector` family is unbound (`docs/research/ocjs-math-vector-exclusion.md`), the 4 `Approx_ComputeLine` instantiation classes (`BRepApprox_TheComputeLine*OfApprox`, `GeomInt_TheComputeLine*OfWLApprox`) are excluded, 6 `// dropped:` methods land on the `The*Of*` walking-line functors (C3 in `docs/research/ocjs-dropped-methods-audit.md`), and a large `unknown`-type tail persists (`docs/research/ocjs-bindgen-unknown-coverage-audit-v2.md` R9). Fix: refactor discovery to enroll any reachable, fully-instantiated (non-dependent) template typedef, reusing the R2 canonical-key augmentation. Highest-leverage single bindgen change for surface breadth. Risk: medium — manifest grows ~50–100 entries and may surface latent compile errors; stage generate-only first, then enable `class_<>` emit per-package as smoke tests pass. +- **Re-bind `DE_ShapeFixParameters` + `DESTEP_Parameters` as `value_object`s (P2)**: these plain parameter structs are YAML-excluded, which drops `Get/SetShapeFixParameters` (12) and `DESTEP_Parameters` overloads (9) from `STEP`/`IGESControl_Reader/Writer` and `STEPCAFControl_*` (`docs/research/ocjs-dropped-methods-audit.md` R1). Import shape-healing / STEP-write tuning currently has no JS surface (workaround: `Interface_Static` globals). Low risk — pure data structs, no transitive deps. Land only if import-tuning becomes a product need. +- **Expose `BOPAlgo_PaveFiller` via a factory (P2)**: abstract/no-public-ctor exclusion drops `PerformWithFiller`/`PPaveFiller`/`DSFiller` (21 methods) across `BRepAlgoAPI_{Fuse,Cut,Common,Section,Splitter,BuilderAlgo}` (`docs/research/ocjs-dropped-methods-audit.md` R3), losing the _shared pave-filler_ reuse optimisation for multi-op boolean chains. Largely redundant with the already-bound `BRepAlgoAPI_BuilderAlgo` (multi-tool path, ~5.66× faster). Medium risk — needs an `optional_override`/factory ctor; verify it links. Land only if shared-filler perf is needed. -* Passing objects as references is not consistent with passing built-in types, right now. The fix should be fairly easy and non-breaking. -* It is impossible to return references to built-in types, right now. Is there a way to avoid a breaking change? -* If a function takes a c-style string as a parameter, currently we wrap this into a std::string instead, because that is compatible with Embind. However, certain APIs like STEPCAFControl_Writer::Transfer behave differently if the c-style string is a null pointer. Currently, that case cannot be covered with the current bindings. +## Build system -## 3. Examples and Tests +- ~~**Provenance signing**: extend `provenance.json` with cosign signatures so downstream consumers can verify provenance without trusting GHCR's manifest list alone.~~ **Completed (R16)** — keyless cosign signing of the manifest-list digest is now part of every release publish; per-arch digests are signed for branch tags. See `cosign verify ghcr.io/taucad/opencascade.js:single-threaded …` in [docs-site](docs-site/content/docs/toolchain/reference/docker-image.mdx#cosign-signatures). +- **Reproducible-CI guide adoption**: most downstream consumers still pin by tag rather than digest. Promote the `provenance.json` + image-digest workflow in the next release notes. +- **Switch libclang vendoring from tarball-extract to pip wheel** (deferred from blueprint D11): the vendored LLVM 17 tree is currently 5.6 GB pre-trim → 250 MB post-trim (header-only). A `pip install libclang-headers==18.x` wheel approach would let us skip the tarball download + trim entirely. Open question: does such a wheel exist, and does it ship the `c++/v1` libc++ headers we actually consume? Worth a one-day spike before the next major image release. +- **GHCR retention policy revisit** (deferred from blueprint D4): current policy retains release tags indefinitely and branch tags 7 days; revisit whether a 30-day or 90-day window for release tags (with a "keep the last 5 minor versions" override) would meaningfully reduce GHCR storage cost without surprising consumers who pin to older versions. -* Allow interactive code editing on the home page - * Either by building a simple "Playground" page using [monaco](https://microsoft.github.io/monaco-editor/) - * Or by linking to example code using CodeSandbox / StackBlitz -* When the above step done, we can archive the examples repository -* Add more examples and / or tests +## Test coverage -## 4. Community Project Section +- **Round-trip geometry coverage for mesh exporters**: `STEP`, `IGES`, and `BRep` smokes already write-then-read with `STEPControl_Reader` / `IGESControl_Reader` / `BRepTools` to assert geometry survives the round-trip. `GLB`, `OBJ`, `PLY`, and `STL` smokes currently stop at parsing vertex/face counts out of the serialised output; extend them to re-import through `RWGltf_CafReader` / `RWObj_CafReader` / `RWPly_PlyReader` / `RWStl_Reader` and assert geometric equality within tolerance. +- **Per-template Playwright artifacts**: capture and archive screenshots from `starter-templates/` smokes on every CI run, not just on failure. Useful for tracking visual drift across `@react-three/drei` or `three.js` upgrades. -* Add section about featured community projects?! -* Ask first if the community really wants / needs that (yet) or not +## Community -## 5. Default values in bindings +- **Featured community projects**: confirm the projects listed in `README.md` (`ArchiYou`, `BitByBit`, `CascadeStudio`, `RepliCAD`, `Tau`) are still active and accepting contributors; add new ones if discovered. +- **Discussions vs Issues triage**: current convention is unclear. Document on the GitHub Discussions front page whether feature requests should land as Discussions or Issues. -* Add support for default values +## Upstream Contributions (Deferred — Production Stabilization First) -## 6. More flexibility when defining custom build bindings in YAML files +- **Improve upstream OCCT Doxygen comments to enrich generated OCJS JSDoc**: the API-reference JSDoc is derived from OCCT's in-source Doxygen `//!` comments, so classes/methods with sparse, missing, or terse Doxygen upstream produce thin or empty JSDoc (and degraded hover/`LLMs.txt`/docs-site descriptions). Many OCCT symbols carry no `@param`/`@return` prose, undocumented enum values, or single-line summaries. Work: identify the highest-traffic public surfaces with weak Doxygen (the ones consumers actually hit — e.g. `BRep*`, `Geom*`, `STEP*`, `Message_*`), author clear Doxygen comments upstream (params, returns, units, ownership/lifetime, complexity notes), and contribute them to OCCT so the next OCJS regen inherits richer JSDoc. Coordinate with the doc-generation pipeline so markdown in Doxygen (`**bold**`, lists, backticked code) round-trips into the streamdown-rendered descriptions. Defer the upstream PRs behind the same production-stabilization gate as the libembind hunks; meanwhile, OCJS-local JSDoc overrides can patch the most painful gaps without waiting on OCCT review cycles. +- **Contribute `libembind-overloading.patch` hunks upstream to emscripten** once production OCJS use has validated stability. The four canonical hunks already satisfy the upstream-suitability constraint codified in `docs/policy/ocjs-trailing-default-emission-policy.md` rule 10 (each is a self-contained behavioural extension that preserves first-match-wins ordering and can be motivated to an upstream reviewer without invoking OCJS-specific architecture). Defer landing the upstream PR until: (1) OCJS bindgen migration through Phases 1–4 is complete; (2) replicad and other production consumers have run for ≥1 release cycle without dispatcher regressions; (3) the patch has not been modified for ≥3 months. Hunks to contribute: + - Hunk 1 — arity-pad in `$ensureOverloadTable` (widens the resolvable arity set when a call's `args.length` is below the smallest registered overload arity; preserves first-match-wins at the chosen arity). + - Hunk 2 — arity-pad in the constructor dispatcher (same mechanism as Hunk 1, applied to `_embind_register_class`'s `constructor_body[args.length]` table). + - Hunk 3 — optional-wildcard short-circuit in `$getSignature` (resolves `fieldType.optional === true` slots as wildcard; load-bearing for matrix rows {3, 4, 5, 21, 22}). + - Hunk 4 — Path B `cppTypeToJsType` primitive-priority fallback in `$getSignature` (resolves numeric typeIds locally when emcc's `-O3` minifier strips the `cppTypeToJsType` helper's primitive branches; required for `TCollection_ExtendedString(int)` vs `(double)` vs `(char)` dispatch). + - Tracking PR: `emscripten-core/emscripten#TBD` (file once the production-stabilization gate clears). The deferred-contribution decision and constraints are also recorded in `docs/policy/ocjs-trailing-default-emission-policy.md` §Migration Sequencing and rule 10. -* Currently, only "symbol: bla" is supported. -* Add support for regex -* Maybe support for inline python functions?! +--- -## 7. TSDoc comments in typescript definitions - -* Helpful in IDEs that support intellisense - -## 8. Other - -* Experiment with opencascade's built-in visualization and see if it works with Emscripten and if it's any good. Create example. +Patches welcome on any of the above. Open a draft PR if the work might exceed a weekend so the direction can be discussed early. diff --git a/bindgen-filters-no-deprecated.yaml b/bindgen-filters-no-deprecated.yaml new file mode 100644 index 00000000..68a3e65a --- /dev/null +++ b/bindgen-filters-no-deprecated.yaml @@ -0,0 +1,12 @@ +# Overlay: excludes deprecated OCCT symbols from binding generation. +# Use this config instead of the base bindgen-filters.yaml to build without deprecated APIs. +# +# Usage: +# python -m ocjs_bindgen --config bindgen-filters-no-deprecated.yaml +# python -m ocjs_bindgen --no-deprecated (equivalent, uses base config) + +# Import base config +extends: bindgen-filters.yaml + +deprecated: + include: false diff --git a/bindgen-filters.yaml b/bindgen-filters.yaml new file mode 100644 index 00000000..f4f30d41 --- /dev/null +++ b/bindgen-filters.yaml @@ -0,0 +1,811 @@ +# OpenCascade.js Binding Generator Filter Configuration +# This file drives which OCCT symbols are included/excluded during binding generation. +# Semantic rules (abstract classes, deleted constructors, etc.) remain in code. +# +# The bindgen filter config controls which symbols are GENERATED (binding code produced). +# The build YAML config (e.g. custom_build_single_v8.yml) controls which symbols are LINKED. +# A consumer overlay is simply a link-time YAML listing the symbols needed. + +exclude: + classes: + # Platform-specific + - prefix: D3DHost + - prefix: IVtk + - prefix: Cocoa + - prefix: AdvApp2Var + - prefix: BRepMeshData_ + - prefix: BRepTest + - prefix: Media + - prefix: GeomGridEval_ + - prefix: Geom2dGridEval_ + - prefix: ShapePersistent_ + # Visualization deps (AIS_ColoredShape, Graphic3d_Texture2D, TPrsStd_Driver) + - XCAFPrs_AISObject + - XCAFPrs_Driver + - XCAFPrs_Texture + # Visualization stack: classes whose implementations depend on TKOpenGl (not in WASM). + # Package-level exclusion already covers these, but explicit listing documents the + # 17 classes responsible for ~85 undefined linker symbols in full builds. + - AIS_ColoredShape + - AIS_InteractiveObject + - AIS_Shape + - Graphic3d_BSDF + - Graphic3d_PBRMaterial + - Graphic3d_Structure + - Graphic3d_Texture2D + - Graphic3d_TextureRoot + - Image_Texture + - Prs3d_Drawer + - Prs3d_Text + - PrsMgr_PresentableObject + - SelectMgr_SelectableObject + - StdPrs_ShapeTool + - TPrsStd_Driver + - TPrsStd_DriverTable + # Undefined symbols + - GCPnts_DistFunction2d + - GCPnts_DistFunction + - GeomFill_SweepSectionGenerator + - Geom2dGcc_FunctionTanCuCuCu + - CDF_DirectoryIterator + - Geom2dEvaluator + - BRepApprox_Approx + - BRepGProp_VinertGK + - BRepOffset_MakeOffset + - BRepOffsetAPI_FindContigousEdges + - BRepApprox_ResConstraintOfMyGradientbisOfTheComputeLineOfApprox + - BRepApprox_ResConstraintOfMyGradientOfTheComputeLineBezierOfApprox + - BRepFeat_MakeLinearForm + - TopOpeBRepBuild_Builder + - TopOpeBRepBuild_Builder1 + - STEPSelections_Counter + - DrawDim_PlanarDimension + - GeomFill_NSections + - IntPatch_Polyhedron + - IntPatch_RLine + - Xw_Window + - TransferBRep + - HLRBRep_BSurfaceTool + - HLRBRep_TheCurveLocatorOfTheProjPCurOfCInter + - HLRBRep_ThePolyhedronOfInterCSurf + - HLRBRep_Surface + - IntCurveSurface_ThePolyhedronOfHInter + - IntPolyh_MaillageAffinage + - IGESSelect_SelectBasicGeom + - ShapeFix_WireSegment + - StepFEA_SymmetricTensor43d + - IFSelect_EditForm + - IFSelect_IntParam + - IFSelect_ContextModif + - IntTools_PntOnFace + - IntImpParGen_ImpTool + - IGESData_IGESReaderData + - IGESToBRep_TopoSurface + - StepData_FreeFormEntity + - StepData_UndefinedEntity + # Abstract / deleted / private constructors + - PrsDim_Dimension + - FSD_BinaryFile + - FSD_File + - Font_BRepFont + - Message_LazyProgressScope + - Standard_ErrorHandler + - BOPAlgo_PaveFiller + - Graphic3d_CubeMap + - Storage_BaseDriver + - AIS_Dimension + # OCCT V8 MathRoot::Multiple* family — internal functor structs holding + # `const &` fields (e.g. `const math_Vector& mySamples`). The const-ref + # member implicitly deletes the default constructor, and the structs are + # only used as ephemeral curry helpers inside the FindAllRoots template + # pipeline (driven through the public `MathRoot_AllRootsResult` API). + # Embind cannot bind a class with a deleted default ctor without a + # matching `.constructor<…>` declaration, and these have no exposed value + # constructor either. Expose `MathRoot_*` higher-level results only. + - MathRoot_MultipleGetValueFn + # OCCT LDOM (XML DOM) internal allocator-block struct: `LDOM_SBuffer` + # owns a singly-linked list of fixed-size buffer chunks, each chunk + # represented by `LDOM_SBuffer::LDOM_StringElem`. The struct uses + # `DEFINE_NCOLLECTION_ALLOC` which wires an `operator new` overload + # taking a `Handle(NCollection_BaseAllocator)` reference — Embind + # cannot bind a class without a default-constructible value + # constructor matching that signature, and the struct is only used + # internally as a list-node by `LDOM_SBuffer::operator<<`. The + # public LDOM API surface (`LDOM_OSStream`, `LDOM_SBuffer`) is + # already bound directly; the inner allocator block is implementation + # detail and excluded structurally here (the recursive class walker + # discovered it as a nested class once nested JS-public name encoding + # JS-public names instead of dropping them). + - LDOM_SBuffer_LDOM_StringElem + # OCCT V8 BRepGraph::EditorView mutation Ops — every `*Ops` inner + # class on `EditorView` takes a `BRepGraph_MutGuard&` value by + # reference (and several methods consume it by value), but + # `BRepGraph_MutGuard` has an explicitly deleted copy constructor + # (`BRepGraph_MutGuard.hxx` L128) so Embind cannot generate the + # marshalling layer. The mutation API is exposed end-to-end through + # the runtime via `BRepGraph_Editor_*` higher-level helpers; these + # raw-Ops bindings would only surface internal scaffolding even if + # they compiled. The recursive walker discovered them as nested + # classes, so list them here so the YAML link manifest never + # references them and the .cpp generator skips them. + - BRepGraph_EditorView_CoEdgeOps + - BRepGraph_EditorView_CompSolidOps + - BRepGraph_EditorView_CompoundOps + - BRepGraph_EditorView_EdgeOps + - BRepGraph_EditorView_FaceOps + - BRepGraph_EditorView_GenOps + - BRepGraph_EditorView_OccurrenceOps + - BRepGraph_EditorView_ProductOps + - BRepGraph_EditorView_RepOps + - BRepGraph_EditorView_ShellOps + - BRepGraph_EditorView_SolidOps + - BRepGraph_EditorView_VertexOps + - BRepGraph_EditorView_WireOps + # OCCT V8 Message_Messenger::StreamBuffer — RAII wrapper around an + # `std::ostream` reference; deleted copy/assignment, no default + # constructor. Embind cannot bind it. The public messenger API is + # exposed via `Message_Messenger::Send` overloads that take strings, + # not StreamBuffer instances. + - Message_Messenger_StreamBuffer + # OCCT V8 BRepGProp_Gauss::Inertia — internal struct returned by the + # legacy Gauss-quadrature solver; uses a `const&` reference member + # so the implicit default constructor is deleted. The public + # property-of-shape API (`BRepGProp_Vinert`, etc.) does not surface + # `Inertia` directly. + - BRepGProp_Gauss_Inertia + # OCCT V8 internal `Approx_ComputeLine` template instantiations — the + # Walking-Line surface/surface intersection (`GeomInt`) and B-Rep + # approximation (`BRepApprox`) helpers. Every constructor overload takes + # a `const math_Vector&` parameter, whose underlying type is + # `math_VectorBase` (mangled `15math_VectorBaseIdE`). That base + # is NOT bound: template-typedef discovery is gated on the + # `NCOLLECTION_CONTAINERS` allowlist and the generic-discovery follow-up + # never landed, so `math_VectorBase` is never emitted. As a + # result every JS call shape throws `Cannot construct ... due to unbound + # types` — these classes are unreachable from JS and only surface as dead + # `class_<>` registrations. The public capabilities they back are still + # exposed via higher-level APIs (`GeomInt`/`GeomAPI` surface-surface + # intersection; `BRepApprox`/`BRepBuilderAPI` approximation), so no + # modeling surface is lost. Re-include only if direct TKMath vector + # access (generic template-typedef discovery) ever lands. + - BRepApprox_TheComputeLineOfApprox + - BRepApprox_TheComputeLineBezierOfApprox + - GeomInt_TheComputeLineOfWLApprox + - GeomInt_TheComputeLineBezierOfWLApprox + # Misc compilation errors + - DsgPrs_RadiusPresentation + - Standard_Dump + - WNT_HIDSpaceMouse + - gp_VectorWithNullMagnitude + - BRepTest_Objects + - BRepGProp_Gauss + - BRepFeat + - GeomTools_UndefinedTypeHandler + - Interface_Graph + - Interface_FileReaderData + - Interface_GeneralModule + - Interface_HGraph + - RWHeaderSection_GeneralModule + - Prs3d_ToolQuadric + - OSD_FileNode + - OSD_File + - NCollection_ListNode + - NCollection_SeqNode + - RWStepAP214_GeneralModule + - RWStepShape_RWBrepWithVoids + - RWStepShape_RWEdgeCurve + - RWStepShape_RWEdgeLoop + - RWStepShape_RWFaceBound + - LocOpe_Revol + - QANCollection + - MAT2d_CutCurve + - LocOpe_RevolutionForm + - MeshTest_CheckTopology + - QABugs_PresentableObject + - QABugs + - QADraw + - MeshTest + - OSD_Path + - QADNaming + - Geom_HSequenceOfBSplineSurface + - Poly_CoherentTriPtr + - StepData_DefaultGeneral + - TDF_LabelNode + - StepData_GeneralModule + - TopClass_SolidExplorer + - UTL + - VrmlData_IndexedFaceSet + - VrmlData_IndexedLineSet + - VrmlData_Scene + - XBRepMesh + - math_NewtonMinimum + - math_NewtonFunctionSetRoot + # HLRBRep_CLProps removed: in OCCT V8 it is now a `using` alias for + # GeomLProp_CLPropsBase>; + # the F1 template-alias fix in filterTypedefs.py + processTemplate makes + # it bindable. + - HLRBRep_Intersector + - BOPTest_Objects + - BOPTest_DrawableShape + - BOPTest + - Draw_Drawable3D + - DBRep_DrawableShape + - StepKinematics_UnconstrainedPair + - StepKinematics_UnconstrainedPairValue + - StdPersistent_TopLoc + # OCCT V8 specific + - BSplCLib_CacheParams + - LDOM_XmlReader + - TDF_DerivedAttribute + - HLRAlgo_PolyInternalData + - HLRAlgo_Coincidence + - Poly_MakeLoops2D + - Poly_MakeLoops3D + - Handle_math_NotSquare + - Handle_math_SingularMatrix + - BSplCLib + - BRepMesh_Triangle + - BRepMesh_Delaun + - AIS_GraphicTool + - AIS_Manipulator + - BRepApprox_TheFunctionOfTheInt2SOfThePrmPrmSvSurfacesOfApprox + - BRepBlend_Walking + - BRepClass_FaceExplorer + - BRepExtrema_ProximityDistTool + - BRepExtrema_ProximityValueTool + - BRepFeat_MakeRevolutionForm + - BRepFill_TrimSurfaceTool + - BRepGProp_MeshProps + - BRepOffset + - BRepOffset_Tool + - BRepTopAdaptor_FClass2d + - DESTEP_Provider + - DESTL_Provider + - DEVRML_Provider + - DE_Provider + - DE_Wrapper + - GccAna_Circ2d2TanOn + - GccAna_Circ2d2TanRad + - GccAna_Circ2d3Tan + - GccAna_Circ2dTanCen + - GccAna_Circ2dTanOnRad + - GccAna_Lin2d2Tan + - GccAna_Lin2dTanObl + - GccAna_Lin2dTanPar + - GccAna_Lin2dTanPer + - GccEnt + - Geom2dGcc_Circ2d2TanOn + - Geom2dGcc_Circ2d2TanOnGeo + - Geom2dGcc_Circ2d2TanOnIter + - Geom2dGcc_Circ2d2TanRad + - Geom2dGcc_Circ2d2TanRadGeo + - Geom2dGcc_Circ2d3Tan + - Geom2dGcc_Circ2d3TanIter + - Geom2dGcc_Circ2dTanCen + - Geom2dGcc_Circ2dTanCenGeo + - Geom2dGcc_Circ2dTanOnRad + - Geom2dGcc_Circ2dTanOnRadGeo + - Geom2dGcc_Lin2d2Tan + - Geom2dGcc_Lin2d2TanIter + - Geom2dGcc_Lin2dTanObl + - Geom2dGcc_Lin2dTanOblIter + - Geom2dHatch_Elements + - GeomInt_TheFunctionOfTheInt2SOfThePrmPrmSvSurfacesOfWLApprox + - Graphic3d_Layer + - Graphic3d_SequenceOfHClipPlane + - Graphic3d_ShaderObject + - HLRBRep_Data + - HLRBRep_TheCSFunctionOfInterCSurf + - IGESData_FreeFormatEntity + - IGESData_ParamReader + - IntCurveSurface_IntersectionPoint + - IntImpParGen + - IntWalk_PWalking + - IntWalk_TheFunctionOfTheInt2S + - Interface_UndefinedContent + - Intf_SectionPoint + - LocOpe_CSIntersector + - LocOpe_CurveShapeIntersector + - PCDM_ReaderFilter + - Select3D_SensitiveCircle + - SelectMgr_SelectableObjectSet + - StepToTopoDS_TranslateFace + - TColStd_PackedMapOfInteger + - TopOpeBRepBuild_GIter + - TopOpeBRepBuild_GTopo + - TopOpeBRepDS_HDataStructure + - TopOpeBRepDS_Interference + - TopOpeBRepDS_TKI + - TopOpeBRepTool_TOOL + - TopOpeBRepTool_makeTransition + - TopOpeBRep_FacesFiller + - VrmlData_Node + - XSAlgo_ShapeProcessor + - Graphic3d_MaterialAspect + - Message + - Message_Messenger + - OSD_Protection + - PrsDim + - PrsDim_EqualDistanceRelation + - StepData_StepReaderData + - V3d + - STEPCAFControl_GDTProperty + + # WASM-meaningless OSD / Standard / Plugin / Message / Quantity + - prefix: OSD_SIG + - prefix: OSD_Exception_ + - OSD_Signal + - OSD_SignalMode + # NOTE: OSD_Thread, OSD_ThreadPool, OSD_Parallel are intentionally NOT excluded. + # They are reserved for a future THREADING=multi-threaded build per the + # Multi-threading reserve section of + - OSD_SharedLibrary + - OSD_LoadMode + - Plugin + - Plugin_Failure + - OSD_Host + - OSD_Process + - OSD_Disk + - OSD_OEMType + - OSD_SysType + - OSD_WhoAmI + - OSD_Environment + - OSD_PerfMeter + - OSD_MemInfo + - OSD_Chronometer + - OSD_Timer + - OSD_CachedFileSystem + - OSD_Directory + - OSD_DirectoryIterator + - OSD_Error + - OSD_Exception + - OSD_FileIterator + - OSD_FileSystem + - OSD_FileSystemSelector + - OSD_FromWhere + - OSD_KindFile + - OSD_LocalFileSystem + - OSD_LockType + - OSD_OSDError + - OSD_OpenMode + - OSD_SingleProtection + # NOTE: Standard_Mutex (+ nested Sentry/Sentry_1/Sentry_2) and Standard_Condition + # are intentionally NOT excluded — reserved for the multi-threaded build. + - Standard_LicenseError + - Standard_LicenseNotFound + - Standard_AbortiveTransaction + - Standard_ImmutableObject + - Standard_MMgrOpt + - Standard_MMgrRoot + - Message_PrinterSystemLog + - Message_ConsoleColor + - Quantity_Date + - Quantity_DateDefinitionError + - Quantity_Period + - Quantity_PeriodDefinitionError + + # Dead format (VRML) orphan class. Packages handled via exclude.packages. + - DEVRML_ConfigurationNode + + # DE format-config scaffolds (DE_Provider / DE_Wrapper already excluded) + - prefix: DEBREP_ + - prefix: DEGLTF_ + - prefix: DEIGES_ + - prefix: DEOBJ_ + - prefix: DEPLY_ + - prefix: DESTEP_ + - prefix: DEXCAF_ + - DE_ConfigurationContext + - DE_ConfigurationNode + - DE_ShapeFixConfigurationNode + - DE_ShapeFixParameters + - DE_ValidationUtils + + methods: + FairCurve_Batten: [Dump] + FairCurve_MinimalVariation: [Dump] + HelixGeom_BuilderApproxCurve: [ApproxParameters] + AppDef_MultiLine: [SetParameter] + BSplCLib: [DN] + BlendFunc: [Knots, Mults, GetShape] + AppDef_TheResol: [Error] + AppDef_ResConstraintOfTheGradient: [Error] + AppDef_ResConstraintOfMyGradientOfCompute: [Error] + AppDef_ResConstraintOfMyGradientbisOfBSplineCompute: [Error] + BinTools_Curve2dSet: [Dump, ReadCurve2d] + BinObjMgt_Persistent: [Read] + BinTools: [GetReal, GetShortReal, GetInteger, GetBool, GetExtChar] + BinTools_SurfaceSet: [ReadSurface] + BinTools_CurveSet: [ReadCurve] + BinTools_IStream: [Stream] + MeshVS_DataSource: [GetGeom, GetGeomType, GetGroup] + MeshVS_DeformedDataSource: [GetGeom, GetGeomType] + Interface_STAT: [Description, Phase] + VrmlData_Node: [Scene] + Font_FTFont: [GlyphImage] + LDOMString: [getOwnerDocument] + LDOM_MemManager: [Self] + LDOM_Node: [getOwnerDocument] + Aspect_VKeySet: [Mutex] + Image_VideoRecorder: [ChangeFrame] + StdPrs_BRepFont: [Mutex] + AdvApp2Var_Network: [ChangePatch, Patch] + AdvApp2Var_Framework: [IsoU, IsoV] + GeomPlate_PlateG0Criterion: [Value, IsSatisfied] + GeomPlate_PlateG1Criterion: [Value, IsSatisfied] + Resource_Unicode: [] # entire class methods filtered + OSD_Thread: [Wait] + TCollection_ExtendedString: [ToUTF8CString] + Message: [ToOSDMetric, MetricFromString] + OSD: [RealToCString] + XmlObjMgt: [GetInteger, GetReal] + BOPAlgo_Tools: [PerformCommonBlocks] + Transfer_Finder: [GetStringAttribute] + MoniTool_TypedValue: [Internals] + MoniTool_AttrList: [GetStringAttribute] + MoniTool_CaseData: [Text] + StepData_StepReaderData: [ReadEnumParam, ReadTypedParam] + XSControl_Vars: [] # entire class methods filtered + Graphic3d_GraduatedTrihedron: [CubicAxesCallback] + AIS_ViewController: [Keys, ChangeKeys] + Aspect_WindowInputListener: [Keys, ChangeKeys] + BRepClass3d_SolidExplorer: [GetTree, Intersector] + NCollection_Lerp: [Interpolate] + Geom2dHatch_Hatcher: [IsDone] + Geom2dAPI_Interpolate: [ClearTangents] + Geom2dGcc_Lin2dTanObl: [IsParallel2] + Geom2dInt_Geom2dCurveTool: [IsComposite] + Geom2dInt_TheCurveLocatorOfTheProjPCurOfGInter: [Locate] + GeomInt_IntSS: [SetTolFixTangents, TolFixTangents] + GeomAPI_Interpolate: [ClearTangents] + GeomFill_FunctionGuide: [Deriv2T] + GeomFill_SweepSectionGenerator: [Init] + GeomInt_ResConstraintOfMyGradientOfTheComputeLineBezierOfWLApprox: [Error] + GeomInt_ResConstraintOfMyGradientbisOfTheComputeLineOfWLApprox: [Error] + GeomInt_WLApprox: [Perform] + GeomAPI_ExtremaCurveSurface: [Extrema] + GeomAPI_ExtremaCurveCurve: [Extrema] + GeomAPI_ProjectPointOnSurf: [Extrema] + Select3D_SensitiveTriangulation: [LastDetectedTriangle] + IntTools_Context: [FClass2d, ProjPS, SolidClassifier] + Message_AttributeStream: [Stream] + OpenGl_Context: [ChangeClipping, Clipping] + OpenGl_GraphicDriver: [Options, ChangeOptions] + OpenGl_ShaderProgram: [compileShaderVerbose] + OpenGl_View: [SetTextureEnv, SetBackgroundTextureStyle, SetBackgroundGradient, SetBackgroundGradientType] + NCollection_Vec2: [cwiseAbs] + NCollection_Vec3: [cwiseAbs] + NCollection_Vec4: [cwiseAbs] + Graphic3d_CStructure: [IsInfinite, stick, highlight, visible, HLRValidation, IsForHighlight, IsMutable, Is2dText] + gp_Dir: [D] + gp_Dir2d: [D] + SelectMgr_SelectableObjectSet: [BVHSubset] + AIS_Manipulator: [OptionsForAttach] + Graphic3d_ShaderObject: [ShaderVariableList] + Message_ProgressScope: [NullString] + PCDM_ReaderFilter: [AppendMode] + BRepGProp_MeshProps: [BRepGProp_MeshObjType] + ShapeProcess: [OperationsFlags] + XSAlgo_ShapeProcessor: [ParameterMap] + Message_Messenger: [GetTraceLevel, ChangePrinters] + Bnd_Box: [Get, GetGap] + Bnd_Box2d: [Get, GetGap] + CSLib: [Normal, DNNormal] + ChFi3d: [ConcaveSide, NextSide, SameSide] + GeomFill: [GetShape] + PrsDim: [ComputeGeometry, ComputeProjEdgePresentation, ComputeProjVertexPresentation] + PrsDim_EqualDistanceRelation: [ComputeGeometry, ComputeProjEdgePresentation, ComputeProjVertexPresentation] + Quantity_Color: [Values, ColorFromName] + TopAbs: [Compose, Reverse] + V3d: [GetProjAxis] + Graphic3d_MaterialAspect: [MaterialName] + Font_FontMgr: [FindFont] + OSD_Protection: [User, System, Group, World] + TColStd_PackedMapOfInteger: [GetPackedMap] + STEPCAFControl_GDTProperty: [] # entire class methods filtered + NCollection_DataMap: [Find] # non-const lvalue reference output param + NCollection_IndexedDataMap: [FindFromKey] # non-const lvalue reference output param + # OCCT V8 NCollection_DoubleMap exposes Find1/Find2 as a const-return + bool-with-non-const-output-ref overload pair. + # Embind's select_overload cannot dispatch the non-const-output overload (same root cause as DataMap::Find above). + # Excluding both names drops both overloads; consumers should use the const-return form via operator[]/Seek instead. + NCollection_DoubleMap: [Find1, Find2] + + # Methods excluded across ALL classes (any class containing these methods) + global_methods: + - Limits # OCCT V8: deprecated math globals, removed + - ReadStreamList # OCCT V8: removed API + + typedefs: + - SelectMgr_Vec3 + - SelectMgr_Mat4 + - Handle_Cocoa_Window + - Handle_Font_BRepFont + - Handle_PCDM_Reader + - Handle_PCDM_ReadWriter_1 + - TColQuantity_Array1OfLength + - TopoDS_ListOfShape + - Handle_Graphic3d_Structure + - PCDM_BaseDriverPointer + - Handle_Xw_Window + - MoniTool_ValueInterpret + - Interface_ValueInterpret + - TopOpeBRepTool_IndexedDataMapOfSolidClassifier + - NCollection_Utf8Iter + - NCollection_Utf16Iter + - NCollection_Utf32Iter + - NCollection_UtfWideIter + - Extrema_UBTreeFillerOfSphere + - Graphic3d_Mat4 + - Graphic3d_Mat4d + - TObj_TIntSparseArray_VecOfData + - TObj_TIntSparseArray_MapOfData + - XCAFDimTolObjects_DatumModifiersSequence + - BRepBuilderAPI_BndBoxTree + - Extrema_UBTreeOfSphere + - ShapeAnalysis_BoxBndTree + - BRepClass3d_BndBoxTree + - BRepBuilderAPI_CellFilter + - IntSurf_Allocator + - TDF_HAllocator + - Interface_VectorOfFileParameter + - Handle_StepKinematics_UnconstrainedPair + - Handle_StepKinematics_UnconstrainedPairValue + - OpenGl_ListOfStructure + - Graphic3d_Vec2 + - Graphic3d_Vec3 + # OCCT V8 declares `typedef NCollection_DynamicArray VectorOfPoint;` in TWO different headers + # (BRepExtrema_ProximityValueTool.hxx + BRepBuilderAPI_VertexInspector.hxx), causing the bindgen to emit + # two `VectorOfPoint.cpp` files that both register `NCollection_DynamicArray` and produce a + # wasm-ld duplicate-symbol error on the embind `raw_destructor` symbol. The auto-discovery layer in + # ocjs_bindgen/discover.py already binds the same underlying type under the canonical mangled name + # `NCollection_DynamicArray_gp_XYZ`, so excluding the user-named alias loses no surface area. + - VectorOfPoint + + template_typedefs: + # Handle_math_NotSquare / Handle_math_SingularMatrix / Handle_Standard_Type + # were previously listed here. They are now filtered structurally by + # `scripts/enumerate-symbols.py::collect_symbols` — any `Handle_X` + # template typedef whose underlying type is `opencascade::handle` + # where `X` is a bound class is dropped, because the class binding + # for `X` already emits `.smart_ptr>("Handle_X")` + # (in `src/bindings.py:1378`) and a duplicate `class_("Handle_X")` + # registration trips Embind's `BindingError: Cannot register type + # 'Handle_X' twice`. Triggered in OCCT V8 by Standard_Type.hxx's + # `DEFINE_STANDARD_HANDLE(Standard_Type, Standard_Transient)` macro, + # which is now exposed via libclang's `templateTypedefs`. + - TColStd_PackedMapOfInteger + - TColStd_SequenceOfAddress + - TopTools_IndexedDataMapOfShapeAddress + # HLRBRep_CLProps is `using HLRBRep_CLProps = GeomLProp_CLPropsBase<…, + # const HLRBRep_Curve*, …>;` — the `const T*` template argument trips + # the bindings.py constructor codegen which emits `const const T* &`. + # The class is HLR-internal (HLRBRep_Curve is not exposed to JS) so + # excluding it costs no public surface; the codegen fix is tracked in + # template-arg bug, F1 follow-up). + - HLRBRep_CLProps + + headers: + - AIS_DataMapOfSelStat.hxx + - AIS_DataMapIteratorOfDataMapOfSelStat.hxx + - InterfaceGraphic.hxx + - Aspect_XWD.hxx + - IVtkDraw_Interactor.hxx + - BVH_IndexedBoxSet.hxx + - BOPDS_Iterator.hxx + - BOPDS_IteratorSI.hxx + - BOPTools_BoxTree + - BOPTools_BoxTree.hxx + - BVH_LinearBuilder.hxx + - BVH_RadixSorter.hxx + - OSD_Parallel.hxx + - OSD_ThreadPool.hxx + - Standard_Atomic.hxx + - MathLin_Jacobi.hxx + - BOPTools_Parallel.hxx + - BVH_DistanceField.hxx + - IVtk_Types.hxx + - IVtk_IShape.hxx + - IVtk_IShapeData.hxx + - IVtk_IShapeMesher.hxx + - IVtk_IShapePickerAlgo.hxx + - IVtkOCC_SelectableObject.hxx + - IVtkOCC_Shape.hxx + - IVtkOCC_ShapeMesher.hxx + - IVtkOCC_ShapePickerAlgo.hxx + - IVtkTools.hxx + - IVtkTools_DisplayModeFilter.hxx + - IVtkTools_ShapeDataSource.hxx + - IVtkTools_ShapeObject.hxx + - IVtkTools_ShapePicker.hxx + - IVtkTools_SubPolyDataFilter.hxx + - IVtkVTK_ShapeData.hxx + - IVtkVTK_View.hxx + - OSD_WNT.hxx + - WNT_Dword.hxx + - IVtkDraw_HighlightAndSelectionPipeline.hxx + - math_Householder.hxx + + packages: + ## Module Draw (interactive testing tools, not needed in WASM) + - Draw + - TKDraw + - DBRep + - DrawTrSurf + - TKD3DHostTest + - D3DHostTest + - TKIVtkDraw + - IVtkDraw + - TKTopTest + - BOPTest + - BRepTest + - DrawFairCurve + - GeometryTest + - GeomliteTest + - HLRTest + - MeshTest + - SWDRAW + - TKViewerTest + - ViewerTest + - TKOpenGlTest + - OpenGlTest + - TKOpenGlesTest + - TKDCAF + - DDF + - DDataStd + - DDocStd + - DNaming + - DPrsStd + - DrawDim + - TKTObjDRAW + - TObjDRAW + - TKXSDRAW + - TKXSDRAWDE + - TKXSDRAWGLTF + - TKXSDRAWIGES + - TKXSDRAWOBJ + - TKXSDRAWPLY + - TKXSDRAWSTEP + - TKXSDRAWSTL + - TKXSDRAWVRML + - XSDRAW + - XSDRAWIGES + - XSDRAWSTEP + - XSDRAWSTLVRML + - TKQADraw + - QABugs + - QADNaming + - QADraw + - QANCollection + - TKXDEDRAW + - XDEDRAW + - DRAWEXE + + ## Module Visualization (rendering is done in Three.js) + - TKD3DHost + - D3DHost + - TKIVtk + - IVtk + - IVtkOCC + - IVtkTools + - IVtkVTK + - TKMeshVS + - MeshVS + - TKOpenGl + - OpenGl + - TKOpenGles + - TKService + - Aspect + - Cocoa + - Font + - Graphic3d + - Image + - Media + - WNT + - Wasm + - Xw + - Shaders + - TKV3d + - AIS + - DsgPrs + - Prs3d + - PrsDim + - PrsMgr + - Select3D + - SelectBasics + - SelectMgr + - StdPrs + - StdSelect + - V3d + - TKVCAF + - TPrsStd + + ## Data Exchange — STEP, STL, IGES, GLTF, OBJ, PLY, VRML all included + ## Individual problematic classes are excluded above in the classes section + + ## Persistence/serialization drivers (not needed in WASM) + - TKBin + - BinDrivers + - BinMDataXtd + - BinMNaming + - TKBinL + - BinMDF + - BinMDataStd + - BinMFunction + - BinMDocStd + - BinObjMgt + - BinLDrivers + - TKBinTObj + - BinTObjDrivers + - TKBinXCAF + - BinXCAFDrivers + - BinMXCAFDoc + - TKStd + - StdDrivers + - StdObject + - StdPersistent + - StdStorage + - ShapePersistent + - TKStdL + - StdLDrivers + - StdLPersistent + - StdObjMgt + - TKTObj + - TObj + - TKXml + - XmlDrivers + - XmlMDataXtd + - XmlMNaming + - TKXmlL + - XmlLDrivers + - XmlMDF + - XmlMDataStd + - XmlMDocStd + - XmlMFunction + - XmlObjMgt + - TKXmlTObj + - XmlTObjDrivers + - TKXmlXCAF + - XmlXCAFDrivers + - XmlMXCAFDoc + + ## Naming clash with BRepMesh + - XBRepMesh + + ## Deprecated in OCCT 8 (TopOpe*), STEP header internals, approximation / plate / projection + ## packages pulled in transitively — excluded for WASM binary size reduction. + - TopOpeBRepBuild + - TopOpeBRepDS + - TopOpeBRepTool + - TopOpeBRep + - HeaderSection + - AppDef + - GeomPlate + - ProjLib + + ## Dead format (VRML — superseded by glTF / no consumer) + - Vrml + - VrmlAPI + - VrmlConverter + - VrmlData + + # Semantic rules that remain in code (not configurable): + # - Methods with void*, istream/ostream params (type-based) + # - Methods with non-const lvalue enum ref params (OCCT V8) + # - Copy/move constructors for classes with deleted copy/move + # - Using declarations (AST-based) + # - Bit-field properties + # - Unbindable nested container types (iterator, size_type, etc.) + # - Template arguments with empty type spelling + # - ::Iterator typedef patterns (memory growth issue) + +# ── Deprecation layer ───────────────────────────────────────────────────── +# Symbols marked deprecated in OCCT. When deprecated.include is true (default), +# these symbols are left alone (they may still be excluded by rules above). +# When deprecated.include is false (or --no-deprecated is passed), every symbol +# listed here is added to the class and global-method exclusion sets. +deprecated: + include: true + symbols: + - Limits # OCCT V8: removed deprecated math globals + - ReadStreamList # OCCT V8: removed deprecated API + - OSD_Protection # OCCT V8: deprecated protection class diff --git a/build-configs/configurations.json b/build-configs/configurations.json new file mode 100644 index 00000000..521f23d0 --- /dev/null +++ b/build-configs/configurations.json @@ -0,0 +1,88 @@ +{ + "single-threaded": { + "OCJS_OPT": "-O3", + "OCJS_LTO": "0", + "OCJS_EXCEPTIONS": "1", + "OCJS_EH_MODE": "wasm", + "OCJS_SIMD": "1", + "THREADING": "single-threaded", + "OCJS_DEFINES": "OCCT_NO_DUMP", + "OCJS_UNDEFINES": "OCC_CONVERT_SIGNALS", + "OCJS_WASM_OPT_LEVEL": "-O4", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_EVAL_CTORS_LEVEL": "2", + "OCJS_CONVERGE": "true", + "OCJS_BIGINT": "1", + "OCJS_MALLOC": "mimalloc", + "BINARYEN_EXTRA_PASSES": "" + }, + "single-threaded-smallest": { + "OCJS_OPT": "-Os", + "OCJS_LTO": "0", + "OCJS_EXCEPTIONS": "1", + "OCJS_EH_MODE": "wasm", + "OCJS_SIMD": "1", + "THREADING": "single-threaded", + "OCJS_DEFINES": "OCCT_NO_DUMP", + "OCJS_UNDEFINES": "OCC_CONVERT_SIGNALS", + "OCJS_WASM_OPT_LEVEL": "-O3", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_EVAL_CTORS_LEVEL": "2", + "OCJS_CONVERGE": "true", + "OCJS_BIGINT": "1", + "OCJS_MALLOC": "mimalloc", + "BINARYEN_EXTRA_PASSES": "" + }, + "multi-threaded": { + "OCJS_OPT": "-O3", + "OCJS_LTO": "0", + "OCJS_EXCEPTIONS": "1", + "OCJS_EH_MODE": "wasm", + "OCJS_SIMD": "1", + "THREADING": "multi-threaded", + "OCJS_DEFINES": "OCCT_NO_DUMP", + "OCJS_UNDEFINES": "OCC_CONVERT_SIGNALS", + "OCJS_WASM_OPT_LEVEL": "-O4", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_EVAL_CTORS_LEVEL": "2", + "OCJS_CONVERGE": "true", + "OCJS_BIGINT": "1", + "OCJS_MALLOC": "mimalloc", + "BINARYEN_EXTRA_PASSES": "" + }, + "multi-threaded-browser": { + "OCJS_OPT": "-O3", + "OCJS_LTO": "0", + "OCJS_EXCEPTIONS": "1", + "OCJS_EH_MODE": "wasm", + "OCJS_SIMD": "1", + "THREADING": "multi-threaded", + "OCJS_DEFINES": "OCCT_NO_DUMP", + "OCJS_UNDEFINES": "OCC_CONVERT_SIGNALS", + "OCJS_WASM_OPT_LEVEL": "-O4", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_EVAL_CTORS_LEVEL": "2", + "OCJS_CONVERGE": "true", + "OCJS_BIGINT": "1", + "OCJS_MALLOC": "mimalloc", + "BINARYEN_EXTRA_PASSES": "" + }, + "debug": { + "OCJS_OPT": "-O0", + "OCJS_LTO": "0", + "OCJS_EXCEPTIONS": "1", + "OCJS_EH_MODE": "wasm", + "OCJS_SIMD": "0", + "THREADING": "single-threaded", + "OCJS_WASM_OPT_LEVEL": "-O0", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_EVAL_CTORS_LEVEL": "2", + "OCJS_CONVERGE": "false", + "BINARYEN_EXTRA_PASSES": "" + } +} diff --git a/build-configs/full.yml b/build-configs/full.yml new file mode 100644 index 00000000..4ccff403 --- /dev/null +++ b/build-configs/full.yml @@ -0,0 +1,4489 @@ +mainBuild: + name: opencascade_full.js + bindings: + - symbol: APIHeaderSection_EditHeader + - symbol: APIHeaderSection_MakeHeader + - symbol: Adaptor2d_Curve2d + - symbol: Adaptor2d_Line2d + - symbol: Adaptor2d_OffsetCurve + - symbol: Adaptor3d_Curve + - symbol: Adaptor3d_CurveOnSurface + - symbol: Adaptor3d_HSurfaceTool + - symbol: Adaptor3d_HVertex + - symbol: Adaptor3d_InterFunc + - symbol: Adaptor3d_IsoCurve + - symbol: Adaptor3d_Surface + - symbol: Adaptor3d_TopolTool + - symbol: AdvApprox_ApproxAFunction + - symbol: AdvApprox_Cutting + - symbol: AdvApprox_DichoCutting + - symbol: AdvApprox_EvaluatorFunction + - symbol: AdvApprox_PrefAndRec + - symbol: AdvApprox_PrefCutting + - symbol: AdvApprox_SimpleApprox + - symbol: AppBlend_Approx + - symbol: AppCont_Function + - symbol: AppCont_LeastSquare + - symbol: AppParCurves + - symbol: AppParCurves_Constraint + - symbol: AppParCurves_ConstraintCouple + - symbol: AppParCurves_MultiBSpCurve + - symbol: AppParCurves_MultiCurve + - symbol: AppParCurves_MultiPoint + - symbol: AppStdL_Application + - symbol: AppStd_Application + - symbol: ApproxInt_KnotTools + - symbol: ApproxInt_SvSurfaces + - symbol: Approx_BSplineApproxInterp + - symbol: Approx_Curve2d + - symbol: Approx_Curve3d + - symbol: Approx_CurveOnSurface + - symbol: Approx_CurvilinearParameter + - symbol: Approx_CurvlinFunc + - symbol: Approx_FitAndDivide + - symbol: Approx_FitAndDivide2d + - symbol: Approx_MCurvesToBSpCurve + - symbol: Approx_ParametrizationType + - symbol: Approx_SameParameter + - symbol: Approx_Status + - symbol: Approx_SweepApproximation + - symbol: Approx_SweepFunction + - symbol: BOPAlgo_AlertAcquiredSelfIntersection + - symbol: BOPAlgo_AlertBOPNotAllowed + - symbol: BOPAlgo_AlertBOPNotSet + - symbol: BOPAlgo_AlertBadPositioning + - symbol: BOPAlgo_AlertBuilderFailed + - symbol: BOPAlgo_AlertBuildingPCurveFailed + - symbol: BOPAlgo_AlertEmptyShape + - symbol: BOPAlgo_AlertFaceBuilderUnusedEdges + - symbol: BOPAlgo_AlertIntersectionFailed + - symbol: BOPAlgo_AlertIntersectionOfPairOfShapesFailed + - symbol: BOPAlgo_AlertMultiDimensionalArguments + - symbol: BOPAlgo_AlertMultipleArguments + - symbol: BOPAlgo_AlertNoFacesToRemove + - symbol: BOPAlgo_AlertNoFiller + - symbol: BOPAlgo_AlertNoPeriodicityRequired + - symbol: BOPAlgo_AlertNotSplittableEdge + - symbol: BOPAlgo_AlertNullInputShapes + - symbol: BOPAlgo_AlertPostTreatFF + - symbol: BOPAlgo_AlertRemovalOfIBForEdgesFailed + - symbol: BOPAlgo_AlertRemovalOfIBForFacesFailed + - symbol: BOPAlgo_AlertRemovalOfIBForMDimShapes + - symbol: BOPAlgo_AlertRemovalOfIBForSolidsFailed + - symbol: BOPAlgo_AlertRemoveFeaturesFailed + - symbol: BOPAlgo_AlertSelfInterferingShape + - symbol: BOPAlgo_AlertShapeIsNotPeriodic + - symbol: BOPAlgo_AlertShellSplitterFailed + - symbol: BOPAlgo_AlertSolidBuilderFailed + - symbol: BOPAlgo_AlertSolidBuilderUnusedFaces + - symbol: BOPAlgo_AlertTooFewArguments + - symbol: BOPAlgo_AlertTooSmallEdge + - symbol: BOPAlgo_AlertUnableToGlue + - symbol: BOPAlgo_AlertUnableToMakeClosedEdgeOnFace + - symbol: BOPAlgo_AlertUnableToMakeIdentical + - symbol: BOPAlgo_AlertUnableToMakePeriodic + - symbol: BOPAlgo_AlertUnableToOrientTheShape + - symbol: BOPAlgo_AlertUnableToRemoveTheFeature + - symbol: BOPAlgo_AlertUnableToRepeat + - symbol: BOPAlgo_AlertUnableToTrim + - symbol: BOPAlgo_AlertUnknownShape + - symbol: BOPAlgo_AlertUnsupportedType + - symbol: BOPAlgo_AlertUserBreak + - symbol: BOPAlgo_Algo + - symbol: BOPAlgo_ArgumentAnalyzer + - symbol: BOPAlgo_BOP + - symbol: BOPAlgo_Builder + - symbol: BOPAlgo_BuilderArea + - symbol: BOPAlgo_BuilderFace + - symbol: BOPAlgo_BuilderShape + - symbol: BOPAlgo_BuilderSolid + - symbol: BOPAlgo_CellsBuilder + - symbol: BOPAlgo_CheckResult + - symbol: BOPAlgo_CheckStatus + - symbol: BOPAlgo_CheckerSI + - symbol: BOPAlgo_EdgeInfo + - symbol: BOPAlgo_GlueEnum + - symbol: BOPAlgo_MakeConnected + - symbol: BOPAlgo_MakePeriodic + - symbol: BOPAlgo_MakePeriodic_PeriodicityParams + - symbol: BOPAlgo_MakerVolume + - symbol: BOPAlgo_Operation + - symbol: BOPAlgo_Options + - symbol: BOPAlgo_PISteps + - symbol: BOPAlgo_ParallelAlgo + - symbol: BOPAlgo_RemoveFeatures + - symbol: BOPAlgo_Section + - symbol: BOPAlgo_SectionAttribute + - symbol: BOPAlgo_ShellSplitter + - symbol: BOPAlgo_Splitter + - symbol: BOPAlgo_Tools + - symbol: BOPAlgo_ToolsProvider + - symbol: BOPAlgo_WireEdgeSet + - symbol: BOPAlgo_WireSplitter + - symbol: BOPDS_CommonBlock + - symbol: BOPDS_CoupleOfPaveBlocks + - symbol: BOPDS_Curve + - symbol: BOPDS_DS + - symbol: BOPDS_FaceInfo + - symbol: BOPDS_IndexRange + - symbol: BOPDS_Interf + - symbol: BOPDS_InterfEE + - symbol: BOPDS_InterfEF + - symbol: BOPDS_InterfEZ + - symbol: BOPDS_InterfFF + - symbol: BOPDS_InterfFZ + - symbol: BOPDS_InterfVE + - symbol: BOPDS_InterfVF + - symbol: BOPDS_InterfVV + - symbol: BOPDS_InterfVZ + - symbol: BOPDS_InterfZZ + - symbol: BOPDS_Pair + - symbol: BOPDS_Pave + - symbol: BOPDS_PaveBlock + - symbol: BOPDS_Point + - symbol: BOPDS_ShapeInfo + - symbol: BOPDS_SubIterator + - symbol: BOPDS_Tools + - symbol: BOPTools_AlgoTools + - symbol: BOPTools_AlgoTools2D + - symbol: BOPTools_AlgoTools3D + - symbol: BOPTools_ConnexityBlock + - symbol: BOPTools_CoupleOfShape + - symbol: BOPTools_Set + - symbol: BRepAdaptor_CompCurve + - symbol: BRepAdaptor_Curve + - symbol: BRepAdaptor_Curve2d + - symbol: BRepAdaptor_Surface + - symbol: BRepAlgo + - symbol: BRepAlgoAPI_Algo + - symbol: BRepAlgoAPI_BooleanOperation + - symbol: BRepAlgoAPI_BuilderAlgo + - symbol: BRepAlgoAPI_Check + - symbol: BRepAlgoAPI_Common + - symbol: BRepAlgoAPI_Cut + - symbol: BRepAlgoAPI_Defeaturing + - symbol: BRepAlgoAPI_Fuse + - symbol: BRepAlgoAPI_Section + - symbol: BRepAlgoAPI_Splitter + - symbol: BRepAlgo_AsDes + - symbol: BRepAlgo_FaceRestrictor + - symbol: BRepAlgo_Image + - symbol: BRepAlgo_Loop + - symbol: BRepAlgo_NormalProjection + - symbol: BRepApprox_ApproxLine + - symbol: BRepApprox_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_MyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_MyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_MyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_ParFunctionOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_ParFunctionOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_ParLeastSquareOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_SurfaceTool + - symbol: BRepApprox_TheImpPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheInt2SOfThePrmPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheMultiLineOfApprox + - symbol: BRepApprox_TheMultiLineToolOfApprox + - symbol: BRepApprox_ThePrmPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheZerImpFuncOfTheImpPrmSvSurfacesOfApprox + - symbol: BRepBlend_AppFunc + - symbol: BRepBlend_AppFuncRoot + - symbol: BRepBlend_AppFuncRst + - symbol: BRepBlend_AppFuncRstRst + - symbol: BRepBlend_AppSurf + - symbol: BRepBlend_AppSurface + - symbol: BRepBlend_BlendTool + - symbol: BRepBlend_CSWalking + - symbol: BRepBlend_CurvPointRadInv + - symbol: BRepBlend_Extremity + - symbol: BRepBlend_HCurve2dTool + - symbol: BRepBlend_HCurveTool + - symbol: BRepBlend_Line + - symbol: BRepBlend_PointOnRst + - symbol: BRepBlend_RstRstConstRad + - symbol: BRepBlend_RstRstEvolRad + - symbol: BRepBlend_RstRstLineBuilder + - symbol: BRepBlend_SurfCurvConstRadInv + - symbol: BRepBlend_SurfCurvEvolRadInv + - symbol: BRepBlend_SurfPointConstRadInv + - symbol: BRepBlend_SurfPointEvolRadInv + - symbol: BRepBlend_SurfRstConstRad + - symbol: BRepBlend_SurfRstEvolRad + - symbol: BRepBlend_SurfRstLineBuilder + - symbol: BRepBndLib + - symbol: BRepBuilderAPI + - symbol: BRepBuilderAPI_BndBoxTreeSelector + - symbol: BRepBuilderAPI_Collect + - symbol: BRepBuilderAPI_Command + - symbol: BRepBuilderAPI_Copy + - symbol: BRepBuilderAPI_EdgeError + - symbol: BRepBuilderAPI_FaceError + - symbol: BRepBuilderAPI_FastSewing + - symbol: BRepBuilderAPI_FindPlane + - symbol: BRepBuilderAPI_GTransform + - symbol: BRepBuilderAPI_MakeEdge + - symbol: BRepBuilderAPI_MakeEdge2d + - symbol: BRepBuilderAPI_MakeFace + - symbol: BRepBuilderAPI_MakePolygon + - symbol: BRepBuilderAPI_MakeShape + - symbol: BRepBuilderAPI_MakeShapeOnMesh + - symbol: BRepBuilderAPI_MakeShell + - symbol: BRepBuilderAPI_MakeSolid + - symbol: BRepBuilderAPI_MakeVertex + - symbol: BRepBuilderAPI_MakeWire + - symbol: BRepBuilderAPI_ModifyShape + - symbol: BRepBuilderAPI_NurbsConvert + - symbol: BRepBuilderAPI_PipeError + - symbol: BRepBuilderAPI_Sewing + - symbol: BRepBuilderAPI_ShapeModification + - symbol: BRepBuilderAPI_ShellError + - symbol: BRepBuilderAPI_Transform + - symbol: BRepBuilderAPI_TransitionMode + - symbol: BRepBuilderAPI_VertexInspector + - symbol: BRepBuilderAPI_WireError + - symbol: BRepCheck + - symbol: BRepCheck_Analyzer + - symbol: BRepCheck_Edge + - symbol: BRepCheck_Face + - symbol: BRepCheck_Result + - symbol: BRepCheck_Shell + - symbol: BRepCheck_Solid + - symbol: BRepCheck_Status + - symbol: BRepCheck_Vertex + - symbol: BRepCheck_Wire + - symbol: BRepClass3d + - symbol: BRepClass3d_BndBoxTreeSelectorLine + - symbol: BRepClass3d_BndBoxTreeSelectorPoint + - symbol: BRepClass3d_Intersector3d + - symbol: BRepClass3d_SClassifier + - symbol: BRepClass3d_SolidClassifier + - symbol: BRepClass3d_SolidExplorer + - symbol: BRepClass3d_SolidPassiveClassifier + - symbol: BRepClass_Edge + - symbol: BRepClass_FClass2dOfFClassifier + - symbol: BRepClass_FClassifier + - symbol: BRepClass_FaceClassifier + - symbol: BRepClass_FacePassiveClassifier + - symbol: BRepClass_Intersector + - symbol: BRepExtrema_DistShapeShape + - symbol: BRepExtrema_DistanceSS + - symbol: BRepExtrema_ElementFilter + - symbol: BRepExtrema_ExtCC + - symbol: BRepExtrema_ExtCF + - symbol: BRepExtrema_ExtFF + - symbol: BRepExtrema_ExtPC + - symbol: BRepExtrema_ExtPF + - symbol: BRepExtrema_OverlapTool + - symbol: BRepExtrema_Poly + - symbol: BRepExtrema_ProximityDistTool_PrjState + - symbol: BRepExtrema_SelfIntersection + - symbol: BRepExtrema_ShapeProximity + - symbol: BRepExtrema_SolutionElem + - symbol: BRepExtrema_SupportType + - symbol: BRepExtrema_TriangleSet + - symbol: BRepExtrema_UnCompatibleShape + - symbol: BRepExtrema_VertexInspector + - symbol: BRepFeat_Builder + - symbol: BRepFeat_Form + - symbol: BRepFeat_Gluer + - symbol: BRepFeat_MakeCylindricalHole + - symbol: BRepFeat_MakeDPrism + - symbol: BRepFeat_MakePipe + - symbol: BRepFeat_MakePrism + - symbol: BRepFeat_MakeRevol + - symbol: BRepFeat_PerfSelection + - symbol: BRepFeat_RibSlot + - symbol: BRepFeat_SplitShape + - symbol: BRepFeat_Status + - symbol: BRepFeat_StatusError + - symbol: BRepFill + - symbol: BRepFill_ACRLaw + - symbol: BRepFill_AdvancedEvolved + - symbol: BRepFill_ApproxSeewing + - symbol: BRepFill_CompatibleWires + - symbol: BRepFill_ComputeCLine + - symbol: BRepFill_CurveConstraint + - symbol: BRepFill_Draft + - symbol: BRepFill_DraftLaw + - symbol: BRepFill_Edge3DLaw + - symbol: BRepFill_EdgeFaceAndOrder + - symbol: BRepFill_EdgeOnSurfLaw + - symbol: BRepFill_Evolved + - symbol: BRepFill_FaceAndOrder + - symbol: BRepFill_Filling + - symbol: BRepFill_Generator + - symbol: BRepFill_LocationLaw + - symbol: BRepFill_MultiLine + - symbol: BRepFill_NSections + - symbol: BRepFill_OffsetAncestors + - symbol: BRepFill_OffsetWire + - symbol: BRepFill_Pipe + - symbol: BRepFill_PipeShell + - symbol: BRepFill_Section + - symbol: BRepFill_SectionLaw + - symbol: BRepFill_SectionPlacement + - symbol: BRepFill_ShapeLaw + - symbol: BRepFill_Sweep + - symbol: BRepFill_ThruSectionErrorStatus + - symbol: BRepFill_TransitionStyle + - symbol: BRepFill_TrimEdgeTool + - symbol: BRepFill_TrimShellCorner + - symbol: BRepFill_TypeOfContact + - symbol: BRepFilletAPI_LocalOperation + - symbol: BRepFilletAPI_MakeChamfer + - symbol: BRepFilletAPI_MakeFillet + - symbol: BRepFilletAPI_MakeFillet2d + - symbol: BRepGProp + - symbol: BRepGProp_Cinert + - symbol: BRepGProp_Domain + - symbol: BRepGProp_EdgeTool + - symbol: BRepGProp_Face + - symbol: BRepGProp_MeshCinert + - symbol: BRepGProp_Sinert + - symbol: BRepGProp_TFunction + - symbol: BRepGProp_UFunction + - symbol: BRepGProp_Vinert + - symbol: BRepGraph + - symbol: BRepGraphInc_BaseDef + - symbol: BRepGraphInc_BaseRef + - symbol: BRepGraphInc_BaseRep + - symbol: BRepGraphInc_ChildRef + - symbol: BRepGraphInc_CoEdgeDef + - symbol: BRepGraphInc_CoEdgeRef + - symbol: BRepGraphInc_CompSolidDef + - symbol: BRepGraphInc_CompoundDef + - symbol: BRepGraphInc_Curve2DRep + - symbol: BRepGraphInc_Curve3DRep + - symbol: BRepGraphInc_EdgeDef + - symbol: BRepGraphInc_FaceDef + - symbol: BRepGraphInc_FaceRef + - symbol: BRepGraphInc_OccurrenceDef + - symbol: BRepGraphInc_OccurrenceRef + - symbol: BRepGraphInc_Polygon2DRep + - symbol: BRepGraphInc_Polygon3DRep + - symbol: BRepGraphInc_PolygonOnTriRep + - symbol: BRepGraphInc_Populate + - symbol: BRepGraphInc_ProductDef + - symbol: BRepGraphInc_Reconstruct + - symbol: BRepGraphInc_Reconstruct_Cache + - symbol: BRepGraphInc_Reconstruct_Cache_TempScope + - symbol: BRepGraphInc_ReverseIndex + - symbol: BRepGraphInc_ShellDef + - symbol: BRepGraphInc_ShellRef + - symbol: BRepGraphInc_SolidDef + - symbol: BRepGraphInc_SolidRef + - symbol: BRepGraphInc_Storage + - symbol: BRepGraphInc_SurfaceRep + - symbol: BRepGraphInc_TriangulationRep + - symbol: BRepGraphInc_VertexDef + - symbol: BRepGraphInc_VertexRef + - symbol: BRepGraphInc_WireDef + - symbol: BRepGraphInc_WireInstance + - symbol: BRepGraphInc_WireRef + - symbol: BRepGraph_Builder + - symbol: BRepGraph_CacheKind + - symbol: BRepGraph_CacheKindRegistry + - symbol: BRepGraph_CacheValue + - symbol: BRepGraph_CacheView + - symbol: BRepGraph_ChildExplorer + - symbol: BRepGraph_ChildRefId + - symbol: BRepGraph_CoEdgeId + - symbol: BRepGraph_CoEdgeRefId + - symbol: BRepGraph_CoEdgesOfEdge + - symbol: BRepGraph_CompSolidId + - symbol: BRepGraph_CompSolidsOfSolid + - symbol: BRepGraph_Compact + - symbol: BRepGraph_CompoundId + - symbol: BRepGraph_CompoundsOfCompSolid + - symbol: BRepGraph_Copy + - symbol: BRepGraph_Curve2DRepId + - symbol: BRepGraph_Curve3DRepId + - symbol: BRepGraph_Data + - symbol: BRepGraph_Deduplicate + - symbol: BRepGraph_DeferredScope + - symbol: BRepGraph_DefsChildOfCompound + - symbol: BRepGraph_DefsChildOfShell + - symbol: BRepGraph_DefsChildOfSolid + - symbol: BRepGraph_DefsCoEdgeOfWire + - symbol: BRepGraph_DefsEdgeOfWire + - symbol: BRepGraph_DefsFaceOfShell + - symbol: BRepGraph_DefsIterator_ChildOfCompoundTraits + - symbol: BRepGraph_DefsIterator_ChildOfShellTraits + - symbol: BRepGraph_DefsIterator_ChildOfSolidTraits + - symbol: BRepGraph_DefsIterator_CoEdgeOfWireTraits + - symbol: BRepGraph_DefsIterator_DefsVertexOfEdge + - symbol: BRepGraph_DefsIterator_EdgeOfWireTraits + - symbol: BRepGraph_DefsIterator_FaceOfShellTraits + - symbol: BRepGraph_DefsIterator_OccurrenceOfProductTraits + - symbol: BRepGraph_DefsIterator_ShellOfSolidTraits + - symbol: BRepGraph_DefsIterator_SolidOfCompSolidTraits + - symbol: BRepGraph_DefsIterator_VertexOfFaceTraits + - symbol: BRepGraph_DefsIterator_WireOfFaceTraits + - symbol: BRepGraph_DefsOccurrenceOfProduct + - symbol: BRepGraph_DefsShellOfSolid + - symbol: BRepGraph_DefsSolidOfCompSolid + - symbol: BRepGraph_DefsVertexOfFace + - symbol: BRepGraph_DefsWireOfFace + - symbol: BRepGraph_EdgeId + - symbol: BRepGraph_EdgesOfVertex + - symbol: BRepGraph_EditorView + - symbol: BRepGraph_FaceId + - symbol: BRepGraph_FaceRefId + - symbol: BRepGraph_FacesOfEdge + - symbol: BRepGraph_FullChildRefIterator + - symbol: BRepGraph_FullCoEdgeRefIterator + - symbol: BRepGraph_FullFaceRefIterator + - symbol: BRepGraph_FullOccurrenceRefIterator + - symbol: BRepGraph_FullShellRefIterator + - symbol: BRepGraph_FullSolidRefIterator + - symbol: BRepGraph_FullVertexRefIterator + - symbol: BRepGraph_FullWireRefIterator + - symbol: BRepGraph_History + - symbol: BRepGraph_HistoryRecord + - symbol: BRepGraph_Layer + - symbol: BRepGraph_LayerIterator + - symbol: BRepGraph_LayerParam + - symbol: BRepGraph_LayerParam_VertexParams + - symbol: BRepGraph_LayerRegistry + - symbol: BRepGraph_LayerRegularity + - symbol: BRepGraph_LayerRegularity_EdgeRegularities + - symbol: BRepGraph_MeshCacheStorage + - symbol: BRepGraph_MeshCache_CoEdgeMeshEntry + - symbol: BRepGraph_MeshCache_EdgeMeshEntry + - symbol: BRepGraph_MeshCache_FaceMeshEntry + - symbol: BRepGraph_MeshView + - symbol: BRepGraph_MeshView_CoEdgeOps + - symbol: BRepGraph_MeshView_EdgeOps + - symbol: BRepGraph_MeshView_FaceOps + - symbol: BRepGraph_MeshView_PolyOps + - symbol: BRepGraph_NodeId + - symbol: BRepGraph_OccurrenceId + - symbol: BRepGraph_OccurrenceRefId + - symbol: BRepGraph_OccurrencesOfProduct + - symbol: BRepGraph_ParallelPolicy + - symbol: BRepGraph_ParentExplorer + - symbol: BRepGraph_Polygon2DRepId + - symbol: BRepGraph_Polygon3DRepId + - symbol: BRepGraph_PolygonOnTriRepId + - symbol: BRepGraph_ProductId + - symbol: BRepGraph_RefId + - symbol: BRepGraph_RefTransientCache + - symbol: BRepGraph_RefUID + - symbol: BRepGraph_RefsChildOfCompound + - symbol: BRepGraph_RefsChildOfShell + - symbol: BRepGraph_RefsChildOfSolid + - symbol: BRepGraph_RefsCoEdgeOfWire + - symbol: BRepGraph_RefsCompSolidsOfSolid + - symbol: BRepGraph_RefsCompoundsOfChild + - symbol: BRepGraph_RefsEdgesOfVertex + - symbol: BRepGraph_RefsFaceOfShell + - symbol: BRepGraph_RefsFacesOfWire + - symbol: BRepGraph_RefsIterator_ChildOfCompoundTraits + - symbol: BRepGraph_RefsIterator_ChildOfShellTraits + - symbol: BRepGraph_RefsIterator_ChildOfSolidTraits + - symbol: BRepGraph_RefsIterator_CoEdgeOfWireTraits + - symbol: BRepGraph_RefsIterator_FaceOfShellTraits + - symbol: BRepGraph_RefsIterator_OccurrenceOfProductTraits + - symbol: BRepGraph_RefsIterator_RefsVertexOfEdge + - symbol: BRepGraph_RefsIterator_ShellOfSolidTraits + - symbol: BRepGraph_RefsIterator_SolidOfCompSolidTraits + - symbol: BRepGraph_RefsIterator_VertexOfFaceTraits + - symbol: BRepGraph_RefsIterator_WireOfFaceTraits + - symbol: BRepGraph_RefsOccurrenceOfProduct + - symbol: BRepGraph_RefsProductsOfOccurrence + - symbol: BRepGraph_RefsShellOfSolid + - symbol: BRepGraph_RefsShellsOfFace + - symbol: BRepGraph_RefsSolidOfCompSolid + - symbol: BRepGraph_RefsSolidsOfShell + - symbol: BRepGraph_RefsVertexOfFace + - symbol: BRepGraph_RefsView + - symbol: BRepGraph_RefsView_ChildOps + - symbol: BRepGraph_RefsView_CoEdgeOps + - symbol: BRepGraph_RefsView_FaceOps + - symbol: BRepGraph_RefsView_OccurrenceOps + - symbol: BRepGraph_RefsView_ShellOps + - symbol: BRepGraph_RefsView_SolidOps + - symbol: BRepGraph_RefsView_VertexOps + - symbol: BRepGraph_RefsView_WireOps + - symbol: BRepGraph_RefsWireOfFace + - symbol: BRepGraph_RefsWiresOfCoEdge + - symbol: BRepGraph_RelatedIterator + - symbol: BRepGraph_RepId + - symbol: BRepGraph_ReverseIterator_CompSolidOfSolidRefTraits + - symbol: BRepGraph_ReverseIterator_CompoundOfChildRefTraits + - symbol: BRepGraph_ReverseIterator_EdgeOfVertexRefTraits + - symbol: BRepGraph_ReverseIterator_FaceOfWireRefTraits + - symbol: BRepGraph_ReverseIterator_ProductOfOccurrenceRefTraits + - symbol: BRepGraph_ReverseIterator_ShellOfFaceRefTraits + - symbol: BRepGraph_ReverseIterator_SolidOfShellRefTraits + - symbol: BRepGraph_ReverseIterator_WireOfCoEdgeRefTraits + - symbol: BRepGraph_RootProductIterator + - symbol: BRepGraph_ShapesView + - symbol: BRepGraph_ShellId + - symbol: BRepGraph_ShellRefId + - symbol: BRepGraph_ShellsOfFace + - symbol: BRepGraph_SolidId + - symbol: BRepGraph_SolidRefId + - symbol: BRepGraph_SolidsOfShell + - symbol: BRepGraph_SurfaceRepId + - symbol: BRepGraph_Tool + - symbol: BRepGraph_Tool_CoEdge + - symbol: BRepGraph_Tool_Edge + - symbol: BRepGraph_Tool_Face + - symbol: BRepGraph_Tool_Mesh + - symbol: BRepGraph_Tool_Shell + - symbol: BRepGraph_Tool_Vertex + - symbol: BRepGraph_Tool_Wire + - symbol: BRepGraph_TopoView + - symbol: BRepGraph_TopoView_CoEdgeOps + - symbol: BRepGraph_TopoView_CompSolidOps + - symbol: BRepGraph_TopoView_CompoundOps + - symbol: BRepGraph_TopoView_EdgeOps + - symbol: BRepGraph_TopoView_FaceOps + - symbol: BRepGraph_TopoView_GenOps + - symbol: BRepGraph_TopoView_GeometryOps + - symbol: BRepGraph_TopoView_OccurrenceOps + - symbol: BRepGraph_TopoView_ProductOps + - symbol: BRepGraph_TopoView_ShellOps + - symbol: BRepGraph_TopoView_SolidOps + - symbol: BRepGraph_TopoView_VertexOps + - symbol: BRepGraph_TopoView_WireOps + - symbol: BRepGraph_Transform + - symbol: BRepGraph_TransientCache + - symbol: BRepGraph_TriangulationRepId + - symbol: BRepGraph_UID + - symbol: BRepGraph_UIDsView + - symbol: BRepGraph_Validate + - symbol: BRepGraph_Validate_Options + - symbol: BRepGraph_Validate_Result + - symbol: BRepGraph_VersionStamp + - symbol: BRepGraph_VertexId + - symbol: BRepGraph_VertexRefId + - symbol: BRepGraph_WireExplorer + - symbol: BRepGraph_WireId + - symbol: BRepGraph_WireRefId + - symbol: BRepGraph_WiresOfCoEdge + - symbol: BRepIntCurveSurface_Inter + - symbol: BRepLProp + - symbol: BRepLProp_CLProps + - symbol: BRepLProp_SLProps + - symbol: BRepLProp_SurfaceTool + - symbol: BRepLib + - symbol: BRepLib_CheckCurveOnSurface + - symbol: BRepLib_Command + - symbol: BRepLib_EdgeError + - symbol: BRepLib_FaceError + - symbol: BRepLib_FindSurface + - symbol: BRepLib_FuseEdges + - symbol: BRepLib_MakeEdge + - symbol: BRepLib_MakeEdge2d + - symbol: BRepLib_MakeFace + - symbol: BRepLib_MakePolygon + - symbol: BRepLib_MakeShape + - symbol: BRepLib_MakeShell + - symbol: BRepLib_MakeSolid + - symbol: BRepLib_MakeVertex + - symbol: BRepLib_MakeWire + - symbol: BRepLib_PointCloudShape + - symbol: BRepLib_ShapeModification + - symbol: BRepLib_ShellError + - symbol: BRepLib_ToolTriangulatedShape + - symbol: BRepLib_ValidateEdge + - symbol: BRepLib_WireError + - symbol: BRepMAT2d_BisectingLocus + - symbol: BRepMAT2d_Explorer + - symbol: BRepMAT2d_LinkTopoBilo + - symbol: BRepMesh_BaseMeshAlgo + - symbol: BRepMesh_BoundaryParamsRangeSplitter + - symbol: BRepMesh_Circle + - symbol: BRepMesh_CircleInspector + - symbol: BRepMesh_CircleTool + - symbol: BRepMesh_Classifier + - symbol: BRepMesh_ConeRangeSplitter + - symbol: BRepMesh_ConstrainedBaseMeshAlgo + - symbol: BRepMesh_Context + - symbol: BRepMesh_CurveTessellator + - symbol: BRepMesh_CustomBaseMeshAlgo + - symbol: BRepMesh_CylinderRangeSplitter + - symbol: BRepMesh_DataStructureOfDelaun + - symbol: BRepMesh_DefaultRangeSplitter + - symbol: BRepMesh_Deflection + - symbol: BRepMesh_DegreeOfFreedom + - symbol: BRepMesh_DelabellaBaseMeshAlgo + - symbol: BRepMesh_DelabellaMeshAlgoFactory + - symbol: BRepMesh_DelaunayBaseMeshAlgo + - symbol: BRepMesh_DiscretAlgoFactory + - symbol: BRepMesh_DiscretFactory + - symbol: BRepMesh_DiscretRoot + - symbol: BRepMesh_Edge + - symbol: BRepMesh_EdgeDiscret + - symbol: BRepMesh_EdgeTessellationExtractor + - symbol: BRepMesh_ExtrusionRangeSplitter + - symbol: BRepMesh_FaceChecker + - symbol: BRepMesh_FaceDiscret + - symbol: BRepMesh_FastDiscret + - symbol: BRepMesh_GeomTool + - symbol: BRepMesh_IncrementalMesh + - symbol: BRepMesh_IncrementalMeshFactory + - symbol: BRepMesh_MeshAlgoFactory + - symbol: BRepMesh_MeshTool + - symbol: BRepMesh_MeshTool_NodeClassifier + - symbol: BRepMesh_ModelBuilder + - symbol: BRepMesh_ModelHealer + - symbol: BRepMesh_ModelPostProcessor + - symbol: BRepMesh_ModelPreProcessor + - symbol: BRepMesh_NURBSRangeSplitter + - symbol: BRepMesh_OrientedEdge + - symbol: BRepMesh_PairOfIndex + - symbol: BRepMesh_SelectorOfDataStructureOfDelaun + - symbol: BRepMesh_ShapeTool + - symbol: BRepMesh_ShapeVisitor + - symbol: BRepMesh_SphereRangeSplitter + - symbol: BRepMesh_TorusRangeSplitter + - symbol: BRepMesh_Triangulator + - symbol: BRepMesh_UVParamRangeSplitter + - symbol: BRepMesh_UndefinedRangeSplitter + - symbol: BRepMesh_Vertex + - symbol: BRepMesh_VertexInspector + - symbol: BRepMesh_VertexTool + - symbol: BRepOffsetAPI_DraftAngle + - symbol: BRepOffsetAPI_MakeDraft + - symbol: BRepOffsetAPI_MakeEvolved + - symbol: BRepOffsetAPI_MakeFilling + - symbol: BRepOffsetAPI_MakeOffset + - symbol: BRepOffsetAPI_MakeOffsetShape + - symbol: BRepOffsetAPI_MakePipe + - symbol: BRepOffsetAPI_MakePipeShell + - symbol: BRepOffsetAPI_MakeThickSolid + - symbol: BRepOffsetAPI_MiddlePath + - symbol: BRepOffsetAPI_NormalProjection + - symbol: BRepOffsetAPI_ThruSections + - symbol: BRepOffsetSimple_Status + - symbol: BRepOffset_Analyse + - symbol: BRepOffset_Error + - symbol: BRepOffset_Inter2d + - symbol: BRepOffset_Inter3d + - symbol: BRepOffset_Interval + - symbol: BRepOffset_MakeLoops + - symbol: BRepOffset_MakeSimpleOffset + - symbol: BRepOffset_Mode + - symbol: BRepOffset_Offset + - symbol: BRepOffset_SimpleOffset + - symbol: BRepOffset_Status + - symbol: BRepPreviewAPI_MakeBox + - symbol: BRepPrimAPI_MakeBox + - symbol: BRepPrimAPI_MakeCone + - symbol: BRepPrimAPI_MakeCylinder + - symbol: BRepPrimAPI_MakeHalfSpace + - symbol: BRepPrimAPI_MakeOneAxis + - symbol: BRepPrimAPI_MakePrism + - symbol: BRepPrimAPI_MakeRevol + - symbol: BRepPrimAPI_MakeRevolution + - symbol: BRepPrimAPI_MakeSphere + - symbol: BRepPrimAPI_MakeSweep + - symbol: BRepPrimAPI_MakeTorus + - symbol: BRepPrimAPI_MakeWedge + - symbol: BRepPrim_Builder + - symbol: BRepPrim_Cone + - symbol: BRepPrim_Cylinder + - symbol: BRepPrim_Direction + - symbol: BRepPrim_FaceBuilder + - symbol: BRepPrim_GWedge + - symbol: BRepPrim_OneAxis + - symbol: BRepPrim_Revolution + - symbol: BRepPrim_Sphere + - symbol: BRepPrim_Torus + - symbol: BRepPrim_Wedge + - symbol: BRepProj_Projection + - symbol: BRepSweep_Builder + - symbol: BRepSweep_Iterator + - symbol: BRepSweep_NumLinearRegularSweep + - symbol: BRepSweep_Prism + - symbol: BRepSweep_Revol + - symbol: BRepSweep_Rotation + - symbol: BRepSweep_Tool + - symbol: BRepSweep_Translation + - symbol: BRepSweep_Trsf + - symbol: BRepToIGESBRep_Entity + - symbol: BRepToIGES_BREntity + - symbol: BRepToIGES_BRShell + - symbol: BRepToIGES_BRSolid + - symbol: BRepToIGES_BRWire + - symbol: BRepTools + - symbol: BRepTools_CopyModification + - symbol: BRepTools_GTrsfModification + - symbol: BRepTools_History + - symbol: BRepTools_Modification + - symbol: BRepTools_Modifier + - symbol: BRepTools_NurbsConvertModification + - symbol: BRepTools_PurgeLocations + - symbol: BRepTools_Quilt + - symbol: BRepTools_ReShape + - symbol: BRepTools_ShapeSet + - symbol: BRepTools_Substitution + - symbol: BRepTools_TrsfModification + - symbol: BRepTools_WireExplorer + - symbol: BRepTopAdaptor_HVertex + - symbol: BRepTopAdaptor_Tool + - symbol: BRepTopAdaptor_TopolTool + - symbol: BRep_Builder + - symbol: BRep_Curve3D + - symbol: BRep_CurveOn2Surfaces + - symbol: BRep_CurveOnClosedSurface + - symbol: BRep_CurveOnSurface + - symbol: BRep_CurveRepresentation + - symbol: BRep_GCurve + - symbol: BRep_PointOnCurve + - symbol: BRep_PointOnCurveOnSurface + - symbol: BRep_PointOnSurface + - symbol: BRep_PointRepresentation + - symbol: BRep_PointsOnSurface + - symbol: BRep_Polygon3D + - symbol: BRep_PolygonOnClosedSurface + - symbol: BRep_PolygonOnClosedTriangulation + - symbol: BRep_PolygonOnSurface + - symbol: BRep_PolygonOnTriangulation + - symbol: BRep_TEdge + - symbol: BRep_TFace + - symbol: BRep_TVertex + - symbol: BRep_Tool + - symbol: BSplCLib_Cache + - symbol: BSplCLib_EvaluatorFunction + - symbol: BSplCLib_KnotDistribution + - symbol: BSplCLib_MultDistribution + - symbol: BSplSLib + - symbol: BSplSLib_Cache + - symbol: BSplSLib_EvaluatorFunction + - symbol: BVH_Array2d + - symbol: BVH_Array2f + - symbol: BVH_Array2i + - symbol: BVH_Array3d + - symbol: BVH_Array3f + - symbol: BVH_Array3i + - symbol: BVH_Array4d + - symbol: BVH_Array4f + - symbol: BVH_Array4i + - symbol: BVH_BinaryTree + - symbol: BVH_BitComparator + - symbol: BVH_BitPredicate + - symbol: BVH_BuildQueue + - symbol: BVH_BuildThread + - symbol: BVH_BuildTool + - symbol: BVH_BuilderTransient + - symbol: BVH_Mat4d + - symbol: BVH_Mat4f + - symbol: BVH_ObjectTransient + - symbol: BVH_Properties + - symbol: BVH_QuadTree + - symbol: BVH_RadixSorter + - symbol: BVH_TreeBaseTransient + - symbol: BVH_Vec2d + - symbol: BVH_Vec2f + - symbol: BVH_Vec2i + - symbol: BVH_Vec3d + - symbol: BVH_Vec3f + - symbol: BVH_Vec3i + - symbol: BVH_Vec4d + - symbol: BVH_Vec4f + - symbol: BVH_Vec4i + - symbol: BiTgte_Blend + - symbol: BiTgte_ContactType + - symbol: BiTgte_CurveOnEdge + - symbol: BiTgte_CurveOnVertex + - symbol: BinTools + - symbol: BinTools_Curve2dSet + - symbol: BinTools_CurveSet + - symbol: BinTools_FormatVersion + - symbol: BinTools_IStream + - symbol: BinTools_LocationSet + - symbol: BinTools_OStream + - symbol: BinTools_ObjectType + - symbol: BinTools_ShapeReader + - symbol: BinTools_ShapeSet + - symbol: BinTools_ShapeSetBase + - symbol: BinTools_ShapeWriter + - symbol: BinTools_SurfaceSet + - symbol: Bisector + - symbol: Bisector_Bisec + - symbol: Bisector_BisecAna + - symbol: Bisector_BisecCC + - symbol: Bisector_BisecPC + - symbol: Bisector_Curve + - symbol: Bisector_FunctionH + - symbol: Bisector_FunctionInter + - symbol: Bisector_Inter + - symbol: Bisector_PointOnBis + - symbol: Bisector_PolyBis + - symbol: BlendFunc + - symbol: BlendFunc_CSCircular + - symbol: BlendFunc_CSConstRad + - symbol: BlendFunc_ChAsym + - symbol: BlendFunc_ChAsymInv + - symbol: BlendFunc_ChamfInv + - symbol: BlendFunc_Chamfer + - symbol: BlendFunc_ConstRad + - symbol: BlendFunc_ConstRadInv + - symbol: BlendFunc_ConstThroat + - symbol: BlendFunc_ConstThroatInv + - symbol: BlendFunc_ConstThroatWithPenetration + - symbol: BlendFunc_ConstThroatWithPenetrationInv + - symbol: BlendFunc_Corde + - symbol: BlendFunc_EvolRad + - symbol: BlendFunc_EvolRadInv + - symbol: BlendFunc_GenChamfInv + - symbol: BlendFunc_GenChamfer + - symbol: BlendFunc_Ruled + - symbol: BlendFunc_RuledInv + - symbol: BlendFunc_SectionShape + - symbol: BlendFunc_Tensor + - symbol: Blend_AppFunction + - symbol: Blend_CSFunction + - symbol: Blend_CurvPointFuncInv + - symbol: Blend_DecrochStatus + - symbol: Blend_FuncInv + - symbol: Blend_Function + - symbol: Blend_Point + - symbol: Blend_RstRstFunction + - symbol: Blend_Status + - symbol: Blend_SurfCurvFuncInv + - symbol: Blend_SurfPointFuncInv + - symbol: Blend_SurfRstFunction + - symbol: BndLib + - symbol: BndLib_Add2dCurve + - symbol: BndLib_Add3dCurve + - symbol: BndLib_AddSurface + - symbol: Bnd_BoundSortBox + - symbol: Bnd_Box + - symbol: Bnd_Box2d + - symbol: Bnd_OBB + - symbol: Bnd_Range + - symbol: Bnd_Sphere + - symbol: Bnd_Tools + - symbol: CDF_Application + - symbol: CDF_Directory + - symbol: CDF_FWOSDriver + - symbol: CDF_MetaDataDriver + - symbol: CDF_MetaDataDriverFactory + - symbol: CDF_Store + - symbol: CDF_StoreList + - symbol: CDF_StoreSetNameStatus + - symbol: CDF_SubComponentStatus + - symbol: CDF_TryStoreStatus + - symbol: CDF_TypeOfActivation + - symbol: CDM_Application + - symbol: CDM_CanCloseStatus + - symbol: CDM_Document + - symbol: CDM_MetaData + - symbol: CDM_Reference + - symbol: CDM_ReferenceIterator + - symbol: CPnts_AbscissaPoint + - symbol: CPnts_MyGaussFunction + - symbol: CPnts_MyRootFunction + - symbol: CPnts_UniformDeflection + - symbol: CSLib + - symbol: CSLib_Class2d + - symbol: CSLib_DerivativeStatus + - symbol: CSLib_NormalPolyDef + - symbol: CSLib_NormalStatus + - symbol: ChFi2d + - symbol: ChFi2d_AnaFilletAlgo + - symbol: ChFi2d_Builder + - symbol: ChFi2d_ChamferAPI + - symbol: ChFi2d_ConstructionError + - symbol: ChFi2d_FilletAPI + - symbol: ChFi2d_FilletAlgo + - symbol: ChFi3d + - symbol: ChFi3d_Builder + - symbol: ChFi3d_ChBuilder + - symbol: ChFi3d_FilBuilder + - symbol: ChFi3d_FilletShape + - symbol: ChFi3d_SearchSing + - symbol: ChFiDS_ChamfMethod + - symbol: ChFiDS_ChamfMode + - symbol: ChFiDS_ChamfSpine + - symbol: ChFiDS_CircSection + - symbol: ChFiDS_CommonPoint + - symbol: ChFiDS_ElSpine + - symbol: ChFiDS_ErrorStatus + - symbol: ChFiDS_FaceInterference + - symbol: ChFiDS_FilSpine + - symbol: ChFiDS_Map + - symbol: ChFiDS_Regul + - symbol: ChFiDS_Spine + - symbol: ChFiDS_State + - symbol: ChFiDS_Stripe + - symbol: ChFiDS_StripeMap + - symbol: ChFiDS_SurfData + - symbol: ChFiDS_TypeOfConcavity + - symbol: ChFiKPart_ComputeData + - symbol: Contap_ArcFunction + - symbol: Contap_ContAna + - symbol: Contap_Contour + - symbol: Contap_HContTool + - symbol: Contap_HCurve2dTool + - symbol: Contap_IType + - symbol: Contap_Line + - symbol: Contap_Point + - symbol: Contap_SurfFunction + - symbol: Contap_SurfProps + - symbol: Contap_TFunction + - symbol: Contap_TheIWLineOfTheIWalking + - symbol: Contap_TheIWalking + - symbol: Contap_ThePathPointOfTheSearch + - symbol: Contap_TheSearch + - symbol: Contap_TheSearchInside + - symbol: Contap_TheSegmentOfTheSearch + - symbol: Convert_CircleToBSplineCurve + - symbol: Convert_CompBezierCurves2dToBSplineCurve2d + - symbol: Convert_CompBezierCurvesToBSplineCurve + - symbol: Convert_CompPolynomialToPoles + - symbol: Convert_ConeToBSplineSurface + - symbol: Convert_ConicToBSplineCurve + - symbol: Convert_CylinderToBSplineSurface + - symbol: Convert_ElementarySurfaceToBSplineSurface + - symbol: Convert_EllipseToBSplineCurve + - symbol: Convert_GridPolynomialToPoles + - symbol: Convert_HyperbolaToBSplineCurve + - symbol: Convert_ParabolaToBSplineCurve + - symbol: Convert_ParameterisationType + - symbol: Convert_SphereToBSplineSurface + - symbol: Convert_TorusToBSplineSurface + - symbol: DESTL_ConfigurationNode + - symbol: DE_Provider_ReadStreamNode + - symbol: DE_Provider_WriteStreamNode + - symbol: Draft + - symbol: Draft_EdgeInfo + - symbol: Draft_ErrorStatus + - symbol: Draft_FaceInfo + - symbol: Draft_Modification + - symbol: Draft_VertexInfo + - symbol: ElCLib + - symbol: ElSLib + - symbol: Expr + - symbol: ExprIntrp + - symbol: ExprIntrp_Analysis + - symbol: ExprIntrp_GenExp + - symbol: ExprIntrp_GenFct + - symbol: ExprIntrp_GenRel + - symbol: ExprIntrp_Generator + - symbol: ExprIntrp_SyntaxError + - symbol: Expr_Absolute + - symbol: Expr_ArcCosine + - symbol: Expr_ArcSine + - symbol: Expr_ArcTangent + - symbol: Expr_ArgCosh + - symbol: Expr_ArgSinh + - symbol: Expr_ArgTanh + - symbol: Expr_BinaryExpression + - symbol: Expr_BinaryFunction + - symbol: Expr_Cosh + - symbol: Expr_Cosine + - symbol: Expr_Difference + - symbol: Expr_Different + - symbol: Expr_Division + - symbol: Expr_Equal + - symbol: Expr_Exponential + - symbol: Expr_Exponentiate + - symbol: Expr_ExprFailure + - symbol: Expr_FunctionDerivative + - symbol: Expr_GeneralExpression + - symbol: Expr_GeneralFunction + - symbol: Expr_GeneralRelation + - symbol: Expr_GreaterThan + - symbol: Expr_GreaterThanOrEqual + - symbol: Expr_InvalidAssignment + - symbol: Expr_InvalidFunction + - symbol: Expr_InvalidOperand + - symbol: Expr_LessThan + - symbol: Expr_LessThanOrEqual + - symbol: Expr_LogOf10 + - symbol: Expr_LogOfe + - symbol: Expr_NamedConstant + - symbol: Expr_NamedExpression + - symbol: Expr_NamedFunction + - symbol: Expr_NamedUnknown + - symbol: Expr_NotAssigned + - symbol: Expr_NotEvaluable + - symbol: Expr_NumericValue + - symbol: Expr_PolyExpression + - symbol: Expr_PolyFunction + - symbol: Expr_Product + - symbol: Expr_RUIterator + - symbol: Expr_RelationIterator + - symbol: Expr_Sign + - symbol: Expr_Sine + - symbol: Expr_SingleRelation + - symbol: Expr_Sinh + - symbol: Expr_Square + - symbol: Expr_SquareRoot + - symbol: Expr_Sum + - symbol: Expr_SystemRelation + - symbol: Expr_Tangent + - symbol: Expr_Tanh + - symbol: Expr_UnaryExpression + - symbol: Expr_UnaryFunction + - symbol: Expr_UnaryMinus + - symbol: Expr_UnknownIterator + - symbol: ExtremaPC_BSplineCurve + - symbol: ExtremaPC_BezierCurve + - symbol: ExtremaPC_Circle + - symbol: ExtremaPC_Config + - symbol: ExtremaPC_Curve + - symbol: ExtremaPC_DistanceFunction + - symbol: ExtremaPC_Ellipse + - symbol: ExtremaPC_ExtremumResult + - symbol: ExtremaPC_GridEvaluator + - symbol: ExtremaPC_Hyperbola + - symbol: ExtremaPC_Line + - symbol: ExtremaPC_OffsetCurve + - symbol: ExtremaPC_OtherCurve + - symbol: ExtremaPC_Parabola + - symbol: ExtremaPC_Result + - symbol: ExtremaPC_SearchMode + - symbol: ExtremaPC_Status + - symbol: Extrema_Curve2dTool + - symbol: Extrema_CurveTool + - symbol: Extrema_ElementType + - symbol: Extrema_ExtAlgo + - symbol: Extrema_ExtCC + - symbol: Extrema_ExtCC2d + - symbol: Extrema_ExtCS + - symbol: Extrema_ExtElC + - symbol: Extrema_ExtElC2d + - symbol: Extrema_ExtElCS + - symbol: Extrema_ExtElSS + - symbol: Extrema_ExtFlag + - symbol: Extrema_ExtPElC + - symbol: Extrema_ExtPElC2d + - symbol: Extrema_ExtPElS + - symbol: Extrema_ExtPExtS + - symbol: Extrema_ExtPRevS + - symbol: Extrema_ExtPS + - symbol: Extrema_ExtSS + - symbol: Extrema_FuncExtCS + - symbol: Extrema_FuncExtSS + - symbol: Extrema_FuncPSDist + - symbol: Extrema_FuncPSNorm + - symbol: Extrema_GenExtCS + - symbol: Extrema_GenExtPS + - symbol: Extrema_GenExtSS + - symbol: Extrema_GenLocateExtCS + - symbol: Extrema_GenLocateExtPS + - symbol: Extrema_GenLocateExtSS + - symbol: Extrema_GlobOptFuncCCC0 + - symbol: Extrema_GlobOptFuncCCC1 + - symbol: Extrema_GlobOptFuncCCC2 + - symbol: Extrema_GlobOptFuncCQuadric + - symbol: Extrema_GlobOptFuncCS + - symbol: Extrema_GlobOptFuncConicS + - symbol: Extrema_LocateExtCC + - symbol: Extrema_LocateExtCC2d + - symbol: Extrema_POnCurv + - symbol: Extrema_POnCurv2d + - symbol: Extrema_POnSurf + - symbol: Extrema_POnSurfParams + - symbol: FEmTool_Assembly + - symbol: FEmTool_Curve + - symbol: FEmTool_ElementaryCriterion + - symbol: FEmTool_ElementsOfRefMatrix + - symbol: FEmTool_LinearFlexion + - symbol: FEmTool_LinearJerk + - symbol: FEmTool_LinearTension + - symbol: FEmTool_ProfileMatrix + - symbol: FEmTool_SparseMatrix + - symbol: FSD_Base64 + - symbol: FSD_CmpFile + - symbol: FSD_FileHeader + - symbol: FairCurve_AnalysisCode + - symbol: FairCurve_Batten + - symbol: FairCurve_BattenLaw + - symbol: FairCurve_DistributionOfEnergy + - symbol: FairCurve_DistributionOfJerk + - symbol: FairCurve_DistributionOfSagging + - symbol: FairCurve_DistributionOfTension + - symbol: FairCurve_Energy + - symbol: FairCurve_EnergyOfBatten + - symbol: FairCurve_EnergyOfMVC + - symbol: FairCurve_MinimalVariation + - symbol: FairCurve_Newton + - symbol: FilletPoint + - symbol: FilletSurf_Builder + - symbol: FilletSurf_ErrorTypeStatus + - symbol: FilletSurf_InternalBuilder + - symbol: FilletSurf_StatusDone + - symbol: FilletSurf_StatusType + - symbol: GCPnts_AbscissaPoint + - symbol: GCPnts_AbscissaType + - symbol: GCPnts_DeflectionType + - symbol: GCPnts_DistFunction2dMV + - symbol: GCPnts_DistFunctionMV + - symbol: GCPnts_QuasiUniformAbscissa + - symbol: GCPnts_QuasiUniformDeflection + - symbol: GCPnts_TangentialDeflection + - symbol: GCPnts_UniformAbscissa + - symbol: GCPnts_UniformDeflection + - symbol: GC_MakeArcOfCircle + - symbol: GC_MakeArcOfCircle2d + - symbol: GC_MakeArcOfEllipse + - symbol: GC_MakeArcOfEllipse2d + - symbol: GC_MakeArcOfHyperbola + - symbol: GC_MakeArcOfHyperbola2d + - symbol: GC_MakeArcOfParabola + - symbol: GC_MakeArcOfParabola2d + - symbol: GC_MakeCircle + - symbol: GC_MakeCircle2d + - symbol: GC_MakeConicalSurface + - symbol: GC_MakeCylindricalSurface + - symbol: GC_MakeEllipse + - symbol: GC_MakeEllipse2d + - symbol: GC_MakeHyperbola + - symbol: GC_MakeHyperbola2d + - symbol: GC_MakeLine + - symbol: GC_MakeLine2d + - symbol: GC_MakeMirror + - symbol: GC_MakeMirror2d + - symbol: GC_MakeParabola2d + - symbol: GC_MakePlane + - symbol: GC_MakeRotation + - symbol: GC_MakeRotation2d + - symbol: GC_MakeScale + - symbol: GC_MakeScale2d + - symbol: GC_MakeSegment + - symbol: GC_MakeSegment2d + - symbol: GC_MakeTranslation + - symbol: GC_MakeTranslation2d + - symbol: GC_MakeTrimmedCone + - symbol: GC_MakeTrimmedCylinder + - symbol: GC_Root + - symbol: GProp + - symbol: GProp_CelGProps + - symbol: GProp_GProps + - symbol: GProp_PEquation + - symbol: GProp_PGProps + - symbol: GProp_PrincipalProps + - symbol: GProp_SelGProps + - symbol: GProp_UndefinedAxis + - symbol: GProp_ValueType + - symbol: GProp_VelGProps + - symbol: GccAna_Circ2dBisec + - symbol: GccAna_CircLin2dBisec + - symbol: GccAna_CircPnt2dBisec + - symbol: GccAna_Lin2dBisec + - symbol: GccAna_LinPnt2dBisec + - symbol: GccAna_NoSolution + - symbol: GccAna_Pnt2dBisec + - symbol: GccEnt_BadQualifier + - symbol: GccEnt_Position + - symbol: GccEnt_QualifiedCirc + - symbol: GccEnt_QualifiedLin + - symbol: GccInt_BCirc + - symbol: GccInt_BElips + - symbol: GccInt_BHyper + - symbol: GccInt_BLine + - symbol: GccInt_BParab + - symbol: GccInt_BPoint + - symbol: GccInt_Bisec + - symbol: GccInt_IType + - symbol: Geom2dAPI_ExtremaCurveCurve + - symbol: Geom2dAPI_InterCurveCurve + - symbol: Geom2dAPI_Interpolate + - symbol: Geom2dAPI_PointsToBSpline + - symbol: Geom2dAPI_ProjectPointOnCurve + - symbol: Geom2dAdaptor + - symbol: Geom2dAdaptor_Curve + - symbol: Geom2dConvert + - symbol: Geom2dConvert_ApproxArcsSegments + - symbol: Geom2dConvert_ApproxCurve + - symbol: Geom2dConvert_BSplineCurveKnotSplitting + - symbol: Geom2dConvert_BSplineCurveToBezierCurve + - symbol: Geom2dConvert_CompCurveToBSplineCurve + - symbol: Geom2dConvert_PPoint + - symbol: Geom2dEval_AHTBezierCurve + - symbol: Geom2dEval_ArchimedeanSpiralCurve + - symbol: Geom2dEval_CircleInvoluteCurve + - symbol: Geom2dEval_LogarithmicSpiralCurve + - symbol: Geom2dEval_RepCurveDesc_Base + - symbol: Geom2dEval_RepCurveDesc_DerivBounded + - symbol: Geom2dEval_RepCurveDesc_Domain1d + - symbol: Geom2dEval_RepCurveDesc_Full + - symbol: Geom2dEval_RepCurveDesc_Map1d + - symbol: Geom2dEval_RepCurveDesc_Mapped + - symbol: Geom2dEval_SineWaveCurve + - symbol: Geom2dEval_TBezierCurve + - symbol: Geom2dGcc + - symbol: Geom2dGcc_CurveTool + - symbol: Geom2dGcc_FunctionTanCirCu + - symbol: Geom2dGcc_FunctionTanCuCu + - symbol: Geom2dGcc_FunctionTanCuCuOnCu + - symbol: Geom2dGcc_FunctionTanCuPnt + - symbol: Geom2dGcc_FunctionTanObl + - symbol: Geom2dGcc_IsParallel + - symbol: Geom2dGcc_QCurve + - symbol: Geom2dGcc_QualifiedCurve + - symbol: Geom2dGcc_Type1 + - symbol: Geom2dGcc_Type2 + - symbol: Geom2dGcc_Type3 + - symbol: Geom2dHash_CurveHasher + - symbol: Geom2dHatch_Classifier + - symbol: Geom2dHatch_Element + - symbol: Geom2dHatch_FClass2dOfClassifier + - symbol: Geom2dHatch_Hatcher + - symbol: Geom2dHatch_Hatching + - symbol: Geom2dHatch_Intersector + - symbol: Geom2dInt_ExactIntersectionPointOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_GInter + - symbol: Geom2dInt_Geom2dCurveTool + - symbol: Geom2dInt_IntConicCurveOfGInter + - symbol: Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter + - symbol: Geom2dInt_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheIntConicCurveOfGInter + - symbol: Geom2dInt_TheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheIntersectorOfTheIntConicCurveOfGInter + - symbol: Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheProjPCurOfGInter + - symbol: Geom2dToIGES_Geom2dCurve + - symbol: Geom2dToIGES_Geom2dEntity + - symbol: Geom2dToIGES_Geom2dPoint + - symbol: Geom2dToIGES_Geom2dVector + - symbol: Geom2d_AxisPlacement + - symbol: Geom2d_BSplineCurve + - symbol: Geom2d_BezierCurve + - symbol: Geom2d_BoundedCurve + - symbol: Geom2d_CartesianPoint + - symbol: Geom2d_Circle + - symbol: Geom2d_Conic + - symbol: Geom2d_Curve + - symbol: Geom2d_Direction + - symbol: Geom2d_Ellipse + - symbol: Geom2d_Geometry + - symbol: Geom2d_Hyperbola + - symbol: Geom2d_Line + - symbol: Geom2d_OffsetCurve + - symbol: Geom2d_Parabola + - symbol: Geom2d_Point + - symbol: Geom2d_Transformation + - symbol: Geom2d_TrimmedCurve + - symbol: Geom2d_UndefinedDerivative + - symbol: Geom2d_UndefinedValue + - symbol: Geom2d_Vector + - symbol: Geom2d_VectorWithMagnitude + - symbol: GeomAPI + - symbol: GeomAPI_ExtremaCurveCurve + - symbol: GeomAPI_ExtremaCurveSurface + - symbol: GeomAPI_ExtremaSurfaceSurface + - symbol: GeomAPI_IntCS + - symbol: GeomAPI_IntSS + - symbol: GeomAPI_Interpolate + - symbol: GeomAPI_PointsToBSpline + - symbol: GeomAPI_PointsToBSplineSurface + - symbol: GeomAPI_ProjectPointOnCurve + - symbol: GeomAPI_ProjectPointOnSurf + - symbol: GeomAbs_BSplKnotDistribution + - symbol: GeomAbs_CurveType + - symbol: GeomAbs_IsoType + - symbol: GeomAbs_JoinType + - symbol: GeomAbs_Shape + - symbol: GeomAbs_SurfaceType + - symbol: GeomAdaptor + - symbol: GeomAdaptor_Curve + - symbol: GeomAdaptor_Surface + - symbol: GeomAdaptor_SurfaceOfLinearExtrusion + - symbol: GeomAdaptor_SurfaceOfRevolution + - symbol: GeomAdaptor_TransformedCurve + - symbol: GeomAdaptor_TransformedSurface + - symbol: GeomBndLib_BSplineCurve + - symbol: GeomBndLib_BSplineCurve2d + - symbol: GeomBndLib_BSplineSurface + - symbol: GeomBndLib_BezierCurve + - symbol: GeomBndLib_BezierCurve2d + - symbol: GeomBndLib_BezierSurface + - symbol: GeomBndLib_Circle + - symbol: GeomBndLib_Circle2d + - symbol: GeomBndLib_Cone + - symbol: GeomBndLib_Curve + - symbol: GeomBndLib_Curve2d + - symbol: GeomBndLib_Cylinder + - symbol: GeomBndLib_Ellipse + - symbol: GeomBndLib_Ellipse2d + - symbol: GeomBndLib_Hyperbola + - symbol: GeomBndLib_Hyperbola2d + - symbol: GeomBndLib_Line + - symbol: GeomBndLib_Line2d + - symbol: GeomBndLib_OffsetCurve + - symbol: GeomBndLib_OffsetCurve2d + - symbol: GeomBndLib_OffsetSurface + - symbol: GeomBndLib_OtherCurve + - symbol: GeomBndLib_OtherCurve2d + - symbol: GeomBndLib_OtherSurface + - symbol: GeomBndLib_Parabola + - symbol: GeomBndLib_Parabola2d + - symbol: GeomBndLib_Plane + - symbol: GeomBndLib_Sphere + - symbol: GeomBndLib_Surface + - symbol: GeomBndLib_SurfaceOfExtrusion + - symbol: GeomBndLib_SurfaceOfRevolution + - symbol: GeomBndLib_Torus + - symbol: GeomConvert + - symbol: GeomConvert_ApproxCurve + - symbol: GeomConvert_ApproxSurface + - symbol: GeomConvert_BSplineCurveKnotSplitting + - symbol: GeomConvert_BSplineCurveToBezierCurve + - symbol: GeomConvert_BSplineSurfaceKnotSplitting + - symbol: GeomConvert_BSplineSurfaceToBezierSurface + - symbol: GeomConvert_CompBezierSurfacesToBSplineSurface + - symbol: GeomConvert_CompCurveToBSplineCurve + - symbol: GeomConvert_ConvType + - symbol: GeomConvert_CurveToAnaCurve + - symbol: GeomConvert_FuncConeLSDist + - symbol: GeomConvert_FuncCylinderLSDist + - symbol: GeomConvert_FuncSphereLSDist + - symbol: GeomConvert_SurfToAnaSurf + - symbol: GeomConvert_Units + - symbol: GeomEval_AHTBezierCurve + - symbol: GeomEval_AHTBezierSurface + - symbol: GeomEval_CircularHelicoidSurface + - symbol: GeomEval_CircularHelixCurve + - symbol: GeomEval_EllipsoidSurface + - symbol: GeomEval_HypParaboloidSurface + - symbol: GeomEval_HyperboloidSurface + - symbol: GeomEval_ParaboloidSurface + - symbol: GeomEval_RepCurveDesc_Base + - symbol: GeomEval_RepCurveDesc_DerivBounded + - symbol: GeomEval_RepCurveDesc_Domain1d + - symbol: GeomEval_RepCurveDesc_Full + - symbol: GeomEval_RepCurveDesc_Map1d + - symbol: GeomEval_RepCurveDesc_Mapped + - symbol: GeomEval_RepSurfaceDesc_Base + - symbol: GeomEval_RepSurfaceDesc_DerivBounded + - symbol: GeomEval_RepSurfaceDesc_Domain2d + - symbol: GeomEval_RepSurfaceDesc_Full + - symbol: GeomEval_RepSurfaceDesc_Map2d + - symbol: GeomEval_RepSurfaceDesc_Mapped + - symbol: GeomEval_SineWaveCurve + - symbol: GeomEval_TBezierCurve + - symbol: GeomEval_TBezierSurface + - symbol: GeomFill + - symbol: GeomFill_AppSurf + - symbol: GeomFill_AppSweep + - symbol: GeomFill_ApproxStyle + - symbol: GeomFill_BSplineCurves + - symbol: GeomFill_BezierCurves + - symbol: GeomFill_BoundWithSurf + - symbol: GeomFill_Boundary + - symbol: GeomFill_CircularBlendFunc + - symbol: GeomFill_ConstantBiNormal + - symbol: GeomFill_ConstrainedFilling + - symbol: GeomFill_Coons + - symbol: GeomFill_CoonsAlgPatch + - symbol: GeomFill_CornerState + - symbol: GeomFill_CorrectedFrenet + - symbol: GeomFill_CurveAndTrihedron + - symbol: GeomFill_Curved + - symbol: GeomFill_Darboux + - symbol: GeomFill_DegeneratedBound + - symbol: GeomFill_DiscreteTrihedron + - symbol: GeomFill_DraftTrihedron + - symbol: GeomFill_EvolvedSection + - symbol: GeomFill_Filling + - symbol: GeomFill_FillingStyle + - symbol: GeomFill_Fixed + - symbol: GeomFill_Frenet + - symbol: GeomFill_FunctionDraft + - symbol: GeomFill_FunctionGuide + - symbol: GeomFill_Generator + - symbol: GeomFill_Gordon + - symbol: GeomFill_GordonBuilder + - symbol: GeomFill_GuideTrihedronAC + - symbol: GeomFill_GuideTrihedronPlan + - symbol: GeomFill_Line + - symbol: GeomFill_LocFunction + - symbol: GeomFill_LocationDraft + - symbol: GeomFill_LocationGuide + - symbol: GeomFill_LocationLaw + - symbol: GeomFill_Pipe + - symbol: GeomFill_PipeError + - symbol: GeomFill_PlanFunc + - symbol: GeomFill_PolynomialConvertor + - symbol: GeomFill_Profiler + - symbol: GeomFill_QuasiAngularConvertor + - symbol: GeomFill_SectionGenerator + - symbol: GeomFill_SectionLaw + - symbol: GeomFill_SectionPlacement + - symbol: GeomFill_SimpleBound + - symbol: GeomFill_SnglrFunc + - symbol: GeomFill_Stretch + - symbol: GeomFill_Sweep + - symbol: GeomFill_SweepFunction + - symbol: GeomFill_Tensor + - symbol: GeomFill_TgtField + - symbol: GeomFill_TgtOnCoons + - symbol: GeomFill_Trihedron + - symbol: GeomFill_TrihedronLaw + - symbol: GeomFill_TrihedronWithGuide + - symbol: GeomFill_UniformSection + - symbol: GeomHash_CurveHasher + - symbol: GeomHash_SurfaceHasher + - symbol: GeomInt + - symbol: GeomInt_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_IntSS + - symbol: GeomInt_LineConstructor + - symbol: GeomInt_LineTool + - symbol: GeomInt_MyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_MyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_MyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParFunctionOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ParFunctionOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ParLeastSquareOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParameterAndOrientation + - symbol: GeomInt_ResConstraintOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ResConstraintOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_TheImpPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheInt2SOfThePrmPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheMultiLineOfWLApprox + - symbol: GeomInt_TheMultiLineToolOfWLApprox + - symbol: GeomInt_ThePrmPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheZerImpFuncOfTheImpPrmSvSurfacesOfWLApprox + - symbol: GeomInt_WLApprox + - symbol: GeomLProp + - symbol: GeomLProp_CLProps + - symbol: GeomLProp_CLProps2d + - symbol: GeomLProp_CurAndInf2d + - symbol: GeomLProp_SLProps + - symbol: GeomLib + - symbol: GeomLib_Check2dBSplineCurve + - symbol: GeomLib_CheckBSplineCurve + - symbol: GeomLib_CheckCurveOnSurface + - symbol: GeomLib_DenominatorMultiplier + - symbol: GeomLib_Interpolate + - symbol: GeomLib_InterpolationErrors + - symbol: GeomLib_IsPlanarSurface + - symbol: GeomLib_LogSample + - symbol: GeomLib_MakeCurvefromApprox + - symbol: GeomLib_PolyFunc + - symbol: GeomLib_Tool + - symbol: GeomProjLib + - symbol: GeomToIGES_GeomCurve + - symbol: GeomToIGES_GeomEntity + - symbol: GeomToIGES_GeomPoint + - symbol: GeomToIGES_GeomSurface + - symbol: GeomToIGES_GeomVector + - symbol: GeomToStep_MakeAxis1Placement + - symbol: GeomToStep_MakeAxis2Placement2d + - symbol: GeomToStep_MakeAxis2Placement3d + - symbol: GeomToStep_MakeBSplineCurveWithKnots + - symbol: GeomToStep_MakeBSplineCurveWithKnotsAndRationalBSplineCurve + - symbol: GeomToStep_MakeBSplineSurfaceWithKnots + - symbol: GeomToStep_MakeBSplineSurfaceWithKnotsAndRationalBSplineSurface + - symbol: GeomToStep_MakeBoundedCurve + - symbol: GeomToStep_MakeBoundedSurface + - symbol: GeomToStep_MakeCartesianPoint + - symbol: GeomToStep_MakeCartesianTransformationOperator + - symbol: GeomToStep_MakeCircle + - symbol: GeomToStep_MakeConic + - symbol: GeomToStep_MakeConicalSurface + - symbol: GeomToStep_MakeCurve + - symbol: GeomToStep_MakeCylindricalSurface + - symbol: GeomToStep_MakeDirection + - symbol: GeomToStep_MakeElementarySurface + - symbol: GeomToStep_MakeEllipse + - symbol: GeomToStep_MakeHyperbola + - symbol: GeomToStep_MakeLine + - symbol: GeomToStep_MakeParabola + - symbol: GeomToStep_MakePlane + - symbol: GeomToStep_MakePolyline + - symbol: GeomToStep_MakeRectangularTrimmedSurface + - symbol: GeomToStep_MakeSphericalSurface + - symbol: GeomToStep_MakeSurface + - symbol: GeomToStep_MakeSurfaceOfLinearExtrusion + - symbol: GeomToStep_MakeSurfaceOfRevolution + - symbol: GeomToStep_MakeSweptSurface + - symbol: GeomToStep_MakeToroidalSurface + - symbol: GeomToStep_MakeVector + - symbol: GeomToStep_Root + - symbol: GeomTools + - symbol: GeomTools_Curve2dSet + - symbol: GeomTools_CurveSet + - symbol: GeomTools_SurfaceSet + - symbol: Geom_Axis1Placement + - symbol: Geom_Axis2Placement + - symbol: Geom_AxisPlacement + - symbol: Geom_BSplineCurve + - symbol: Geom_BSplineSurface + - symbol: Geom_BezierCurve + - symbol: Geom_BezierSurface + - symbol: Geom_BoundedCurve + - symbol: Geom_BoundedSurface + - symbol: Geom_CartesianPoint + - symbol: Geom_Circle + - symbol: Geom_Conic + - symbol: Geom_ConicalSurface + - symbol: Geom_Curve + - symbol: Geom_CylindricalSurface + - symbol: Geom_Direction + - symbol: Geom_ElementarySurface + - symbol: Geom_Ellipse + - symbol: Geom_Geometry + - symbol: Geom_Hyperbola + - symbol: Geom_Line + - symbol: Geom_OffsetCurve + - symbol: Geom_OffsetSurface + - symbol: Geom_Parabola + - symbol: Geom_Plane + - symbol: Geom_Point + - symbol: Geom_RectangularTrimmedSurface + - symbol: Geom_SphericalSurface + - symbol: Geom_Surface + - symbol: Geom_SurfaceOfLinearExtrusion + - symbol: Geom_SurfaceOfRevolution + - symbol: Geom_SweptSurface + - symbol: Geom_ToroidalSurface + - symbol: Geom_Transformation + - symbol: Geom_TrimmedCurve + - symbol: Geom_UndefinedDerivative + - symbol: Geom_UndefinedValue + - symbol: Geom_Vector + - symbol: Geom_VectorWithMagnitude + - symbol: HLRAlgo + - symbol: HLRAlgo_BiPoint + - symbol: HLRAlgo_BiPoint_PointsT + - symbol: HLRAlgo_EdgeIterator + - symbol: HLRAlgo_EdgeStatus + - symbol: HLRAlgo_EdgesBlock + - symbol: HLRAlgo_EdgesBlock_MinMaxIndices + - symbol: HLRAlgo_Interference + - symbol: HLRAlgo_Intersection + - symbol: HLRAlgo_PolyAlgo + - symbol: HLRAlgo_PolyData + - symbol: HLRAlgo_PolyHidingData + - symbol: HLRAlgo_PolyInternalNode + - symbol: HLRAlgo_PolyInternalSegment + - symbol: HLRAlgo_PolyMask + - symbol: HLRAlgo_PolyShellData + - symbol: HLRAlgo_Projector + - symbol: HLRAlgo_TriangleData + - symbol: HLRAlgo_WiresBlock + - symbol: HLRAppli_ReflectLines + - symbol: HLRBRep + - symbol: HLRBRep_Algo + - symbol: HLRBRep_AreaLimit + - symbol: HLRBRep_BCurveTool + - symbol: HLRBRep_BiPnt2D + - symbol: HLRBRep_BiPoint + - symbol: HLRBRep_CInter + - symbol: HLRBRep_CLPropsATool + - symbol: HLRBRep_Curve + - symbol: HLRBRep_CurveTool + - symbol: HLRBRep_EdgeBuilder + - symbol: HLRBRep_EdgeData + - symbol: HLRBRep_EdgeFaceTool + - symbol: HLRBRep_EdgeIList + - symbol: HLRBRep_EdgeInterferenceTool + - symbol: HLRBRep_ExactIntersectionPointOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_FaceData + - symbol: HLRBRep_FaceIterator + - symbol: HLRBRep_HLRToShape + - symbol: HLRBRep_Hider + - symbol: HLRBRep_IntConicCurveOfCInter + - symbol: HLRBRep_InterCSurf + - symbol: HLRBRep_InternalAlgo + - symbol: HLRBRep_LineTool + - symbol: HLRBRep_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfCInter + - symbol: HLRBRep_PolyAlgo + - symbol: HLRBRep_PolyHLRToShape + - symbol: HLRBRep_SLProps + - symbol: HLRBRep_SLPropsATool + - symbol: HLRBRep_ShapeBounds + - symbol: HLRBRep_ShapeToHLR + - symbol: HLRBRep_SurfaceTool + - symbol: HLRBRep_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_TheExactInterCSurf + - symbol: HLRBRep_TheIntConicCurveOfCInter + - symbol: HLRBRep_TheIntPCurvePCurveOfCInter + - symbol: HLRBRep_TheInterferenceOfInterCSurf + - symbol: HLRBRep_TheIntersectorOfTheIntConicCurveOfCInter + - symbol: HLRBRep_ThePolygon2dOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_ThePolygonOfInterCSurf + - symbol: HLRBRep_ThePolygonToolOfInterCSurf + - symbol: HLRBRep_ThePolyhedronToolOfInterCSurf + - symbol: HLRBRep_TheProjPCurOfCInter + - symbol: HLRBRep_TheQuadCurvExactInterCSurf + - symbol: HLRBRep_TheQuadCurvFuncOfTheQuadCurvExactInterCSurf + - symbol: HLRBRep_TypeOfResultingEdge + - symbol: HLRBRep_VertexList + - symbol: HLRTopoBRep_DSFiller + - symbol: HLRTopoBRep_Data + - symbol: HLRTopoBRep_FaceData + - symbol: HLRTopoBRep_FaceIsoLiner + - symbol: HLRTopoBRep_OutLiner + - symbol: HLRTopoBRep_VData + - symbol: HatchGen_Domain + - symbol: HatchGen_ErrorStatus + - symbol: HatchGen_IntersectionPoint + - symbol: HatchGen_IntersectionType + - symbol: HatchGen_PointOnElement + - symbol: HatchGen_PointOnHatching + - symbol: Hatch_Hatcher + - symbol: Hatch_Line + - symbol: Hatch_LineForm + - symbol: Hatch_Parameter + - symbol: HelixBRep_BuilderHelix + - symbol: HelixGeom_BuilderApproxCurve + - symbol: HelixGeom_BuilderHelix + - symbol: HelixGeom_BuilderHelixCoil + - symbol: HelixGeom_BuilderHelixGen + - symbol: HelixGeom_HelixCurve + - symbol: HelixGeom_Tools + - symbol: Hermit + - symbol: IFGraph_AllConnected + - symbol: IFGraph_AllShared + - symbol: IFGraph_Articulations + - symbol: IFGraph_Compare + - symbol: IFGraph_ConnectedComponants + - symbol: IFGraph_Cumulate + - symbol: IFGraph_Cycles + - symbol: IFGraph_ExternalSources + - symbol: IFGraph_SCRoots + - symbol: IFGraph_StrongComponants + - symbol: IFGraph_SubPartsIterator + - symbol: IFSelect + - symbol: IFSelect_Act + - symbol: IFSelect_Activator + - symbol: IFSelect_AppliedModifiers + - symbol: IFSelect_BasicDumper + - symbol: IFSelect_CheckCounter + - symbol: IFSelect_ContextWrite + - symbol: IFSelect_DispGlobal + - symbol: IFSelect_DispPerCount + - symbol: IFSelect_DispPerFiles + - symbol: IFSelect_DispPerOne + - symbol: IFSelect_DispPerSignature + - symbol: IFSelect_Dispatch + - symbol: IFSelect_EditValue + - symbol: IFSelect_Editor + - symbol: IFSelect_Functions + - symbol: IFSelect_GeneralModifier + - symbol: IFSelect_GraphCounter + - symbol: IFSelect_ListEditor + - symbol: IFSelect_ModelCopier + - symbol: IFSelect_ModifEditForm + - symbol: IFSelect_ModifReorder + - symbol: IFSelect_Modifier + - symbol: IFSelect_PacketList + - symbol: IFSelect_ParamEditor + - symbol: IFSelect_PrintCount + - symbol: IFSelect_PrintFail + - symbol: IFSelect_RemainMode + - symbol: IFSelect_ReturnStatus + - symbol: IFSelect_SelectAnyList + - symbol: IFSelect_SelectAnyType + - symbol: IFSelect_SelectBase + - symbol: IFSelect_SelectCombine + - symbol: IFSelect_SelectControl + - symbol: IFSelect_SelectDeduct + - symbol: IFSelect_SelectDiff + - symbol: IFSelect_SelectEntityNumber + - symbol: IFSelect_SelectErrorEntities + - symbol: IFSelect_SelectExplore + - symbol: IFSelect_SelectExtract + - symbol: IFSelect_SelectFlag + - symbol: IFSelect_SelectInList + - symbol: IFSelect_SelectIncorrectEntities + - symbol: IFSelect_SelectIntersection + - symbol: IFSelect_SelectModelEntities + - symbol: IFSelect_SelectModelRoots + - symbol: IFSelect_SelectPointed + - symbol: IFSelect_SelectRange + - symbol: IFSelect_SelectRootComps + - symbol: IFSelect_SelectRoots + - symbol: IFSelect_SelectSent + - symbol: IFSelect_SelectShared + - symbol: IFSelect_SelectSharing + - symbol: IFSelect_SelectSignature + - symbol: IFSelect_SelectSignedShared + - symbol: IFSelect_SelectSignedSharing + - symbol: IFSelect_SelectSuite + - symbol: IFSelect_SelectType + - symbol: IFSelect_SelectUnion + - symbol: IFSelect_SelectUnknownEntities + - symbol: IFSelect_Selection + - symbol: IFSelect_SelectionIterator + - symbol: IFSelect_SessionDumper + - symbol: IFSelect_SessionFile + - symbol: IFSelect_SessionPilot + - symbol: IFSelect_ShareOut + - symbol: IFSelect_ShareOutResult + - symbol: IFSelect_SignAncestor + - symbol: IFSelect_SignCategory + - symbol: IFSelect_SignCounter + - symbol: IFSelect_SignMultiple + - symbol: IFSelect_SignType + - symbol: IFSelect_SignValidity + - symbol: IFSelect_Signature + - symbol: IFSelect_SignatureList + - symbol: IFSelect_TransformStandard + - symbol: IFSelect_Transformer + - symbol: IFSelect_WorkLibrary + - symbol: IFSelect_WorkSession + - symbol: IGESAppli + - symbol: IGESAppli_DrilledHole + - symbol: IGESAppli_ElementResults + - symbol: IGESAppli_FiniteElement + - symbol: IGESAppli_Flow + - symbol: IGESAppli_FlowLineSpec + - symbol: IGESAppli_GeneralModule + - symbol: IGESAppli_LevelFunction + - symbol: IGESAppli_LevelToPWBLayerMap + - symbol: IGESAppli_LineWidening + - symbol: IGESAppli_NodalConstraint + - symbol: IGESAppli_NodalDisplAndRot + - symbol: IGESAppli_NodalResults + - symbol: IGESAppli_Node + - symbol: IGESAppli_PWBArtworkStackup + - symbol: IGESAppli_PWBDrilledHole + - symbol: IGESAppli_PartNumber + - symbol: IGESAppli_PinNumber + - symbol: IGESAppli_PipingFlow + - symbol: IGESAppli_Protocol + - symbol: IGESAppli_ReadWriteModule + - symbol: IGESAppli_ReferenceDesignator + - symbol: IGESAppli_RegionRestriction + - symbol: IGESAppli_SpecificModule + - symbol: IGESAppli_ToolDrilledHole + - symbol: IGESAppli_ToolElementResults + - symbol: IGESAppli_ToolFiniteElement + - symbol: IGESAppli_ToolFlow + - symbol: IGESAppli_ToolFlowLineSpec + - symbol: IGESAppli_ToolLevelFunction + - symbol: IGESAppli_ToolLevelToPWBLayerMap + - symbol: IGESAppli_ToolLineWidening + - symbol: IGESAppli_ToolNodalConstraint + - symbol: IGESAppli_ToolNodalDisplAndRot + - symbol: IGESAppli_ToolNodalResults + - symbol: IGESAppli_ToolNode + - symbol: IGESAppli_ToolPWBArtworkStackup + - symbol: IGESAppli_ToolPWBDrilledHole + - symbol: IGESAppli_ToolPartNumber + - symbol: IGESAppli_ToolPinNumber + - symbol: IGESAppli_ToolPipingFlow + - symbol: IGESAppli_ToolReferenceDesignator + - symbol: IGESAppli_ToolRegionRestriction + - symbol: IGESBasic + - symbol: IGESBasic_AssocGroupType + - symbol: IGESBasic_ExternalRefFile + - symbol: IGESBasic_ExternalRefFileIndex + - symbol: IGESBasic_ExternalRefFileName + - symbol: IGESBasic_ExternalRefLibName + - symbol: IGESBasic_ExternalRefName + - symbol: IGESBasic_ExternalReferenceFile + - symbol: IGESBasic_GeneralModule + - symbol: IGESBasic_Group + - symbol: IGESBasic_GroupWithoutBackP + - symbol: IGESBasic_HArray1OfHArray1OfIGESEntity + - symbol: IGESBasic_HArray1OfHArray1OfInteger + - symbol: IGESBasic_HArray1OfHArray1OfReal + - symbol: IGESBasic_HArray1OfHArray1OfXY + - symbol: IGESBasic_HArray1OfHArray1OfXYZ + - symbol: IGESBasic_Hierarchy + - symbol: IGESBasic_Name + - symbol: IGESBasic_OrderedGroup + - symbol: IGESBasic_OrderedGroupWithoutBackP + - symbol: IGESBasic_Protocol + - symbol: IGESBasic_ReadWriteModule + - symbol: IGESBasic_SingleParent + - symbol: IGESBasic_SingularSubfigure + - symbol: IGESBasic_SpecificModule + - symbol: IGESBasic_SubfigureDef + - symbol: IGESBasic_ToolAssocGroupType + - symbol: IGESBasic_ToolExternalRefFile + - symbol: IGESBasic_ToolExternalRefFileIndex + - symbol: IGESBasic_ToolExternalRefFileName + - symbol: IGESBasic_ToolExternalRefLibName + - symbol: IGESBasic_ToolExternalRefName + - symbol: IGESBasic_ToolExternalReferenceFile + - symbol: IGESBasic_ToolGroup + - symbol: IGESBasic_ToolGroupWithoutBackP + - symbol: IGESBasic_ToolHierarchy + - symbol: IGESBasic_ToolName + - symbol: IGESBasic_ToolOrderedGroup + - symbol: IGESBasic_ToolOrderedGroupWithoutBackP + - symbol: IGESBasic_ToolSingleParent + - symbol: IGESBasic_ToolSingularSubfigure + - symbol: IGESBasic_ToolSubfigureDef + - symbol: IGESCAFControl + - symbol: IGESCAFControl_Reader + - symbol: IGESCAFControl_Writer + - symbol: IGESControl_ActorWrite + - symbol: IGESControl_AlgoContainer + - symbol: IGESControl_Controller + - symbol: IGESControl_IGESBoundary + - symbol: IGESControl_Reader + - symbol: IGESControl_ToolContainer + - symbol: IGESControl_Writer + - symbol: IGESConvGeom + - symbol: IGESConvGeom_GeomBuilder + - symbol: IGESData + - symbol: IGESData_BasicEditor + - symbol: IGESData_ColorEntity + - symbol: IGESData_DefList + - symbol: IGESData_DefSwitch + - symbol: IGESData_DefType + - symbol: IGESData_DefaultGeneral + - symbol: IGESData_DefaultSpecific + - symbol: IGESData_DirChecker + - symbol: IGESData_DirPart + - symbol: IGESData_FileProtocol + - symbol: IGESData_FileRecognizer + - symbol: IGESData_GeneralModule + - symbol: IGESData_GlobalNodeOfSpecificLib + - symbol: IGESData_GlobalNodeOfWriterLib + - symbol: IGESData_GlobalSection + - symbol: IGESData_IGESDumper + - symbol: IGESData_IGESEntity + - symbol: IGESData_IGESModel + - symbol: IGESData_IGESReaderTool + - symbol: IGESData_IGESType + - symbol: IGESData_IGESWriter + - symbol: IGESData_LabelDisplayEntity + - symbol: IGESData_LevelListEntity + - symbol: IGESData_LineFontEntity + - symbol: IGESData_NameEntity + - symbol: IGESData_NodeOfSpecificLib + - symbol: IGESData_NodeOfWriterLib + - symbol: IGESData_ParamCursor + - symbol: IGESData_Protocol + - symbol: IGESData_ReadStage + - symbol: IGESData_ReadWriteModule + - symbol: IGESData_SingleParentEntity + - symbol: IGESData_SpecificLib + - symbol: IGESData_SpecificModule + - symbol: IGESData_Status + - symbol: IGESData_ToolLocation + - symbol: IGESData_TransfEntity + - symbol: IGESData_UndefinedEntity + - symbol: IGESData_ViewKindEntity + - symbol: IGESData_WriterLib + - symbol: IGESDefs + - symbol: IGESDefs_AssociativityDef + - symbol: IGESDefs_AttributeDef + - symbol: IGESDefs_AttributeTable + - symbol: IGESDefs_GeneralModule + - symbol: IGESDefs_GenericData + - symbol: IGESDefs_HArray1OfHArray1OfTextDisplayTemplate + - symbol: IGESDefs_MacroDef + - symbol: IGESDefs_Protocol + - symbol: IGESDefs_ReadWriteModule + - symbol: IGESDefs_SpecificModule + - symbol: IGESDefs_TabularData + - symbol: IGESDefs_ToolAssociativityDef + - symbol: IGESDefs_ToolAttributeDef + - symbol: IGESDefs_ToolAttributeTable + - symbol: IGESDefs_ToolGenericData + - symbol: IGESDefs_ToolMacroDef + - symbol: IGESDefs_ToolTabularData + - symbol: IGESDefs_ToolUnitsData + - symbol: IGESDefs_UnitsData + - symbol: IGESDimen + - symbol: IGESDimen_AngularDimension + - symbol: IGESDimen_BasicDimension + - symbol: IGESDimen_CenterLine + - symbol: IGESDimen_CurveDimension + - symbol: IGESDimen_DiameterDimension + - symbol: IGESDimen_DimensionDisplayData + - symbol: IGESDimen_DimensionTolerance + - symbol: IGESDimen_DimensionUnits + - symbol: IGESDimen_DimensionedGeometry + - symbol: IGESDimen_FlagNote + - symbol: IGESDimen_GeneralLabel + - symbol: IGESDimen_GeneralModule + - symbol: IGESDimen_GeneralNote + - symbol: IGESDimen_GeneralSymbol + - symbol: IGESDimen_LeaderArrow + - symbol: IGESDimen_LinearDimension + - symbol: IGESDimen_NewDimensionedGeometry + - symbol: IGESDimen_NewGeneralNote + - symbol: IGESDimen_OrdinateDimension + - symbol: IGESDimen_PointDimension + - symbol: IGESDimen_Protocol + - symbol: IGESDimen_RadiusDimension + - symbol: IGESDimen_ReadWriteModule + - symbol: IGESDimen_Section + - symbol: IGESDimen_SectionedArea + - symbol: IGESDimen_SpecificModule + - symbol: IGESDimen_ToolAngularDimension + - symbol: IGESDimen_ToolBasicDimension + - symbol: IGESDimen_ToolCenterLine + - symbol: IGESDimen_ToolCurveDimension + - symbol: IGESDimen_ToolDiameterDimension + - symbol: IGESDimen_ToolDimensionDisplayData + - symbol: IGESDimen_ToolDimensionTolerance + - symbol: IGESDimen_ToolDimensionUnits + - symbol: IGESDimen_ToolDimensionedGeometry + - symbol: IGESDimen_ToolFlagNote + - symbol: IGESDimen_ToolGeneralLabel + - symbol: IGESDimen_ToolGeneralNote + - symbol: IGESDimen_ToolGeneralSymbol + - symbol: IGESDimen_ToolLeaderArrow + - symbol: IGESDimen_ToolLinearDimension + - symbol: IGESDimen_ToolNewDimensionedGeometry + - symbol: IGESDimen_ToolNewGeneralNote + - symbol: IGESDimen_ToolOrdinateDimension + - symbol: IGESDimen_ToolPointDimension + - symbol: IGESDimen_ToolRadiusDimension + - symbol: IGESDimen_ToolSection + - symbol: IGESDimen_ToolSectionedArea + - symbol: IGESDimen_ToolWitnessLine + - symbol: IGESDimen_WitnessLine + - symbol: IGESDraw + - symbol: IGESDraw_CircArraySubfigure + - symbol: IGESDraw_ConnectPoint + - symbol: IGESDraw_Drawing + - symbol: IGESDraw_DrawingWithRotation + - symbol: IGESDraw_GeneralModule + - symbol: IGESDraw_LabelDisplay + - symbol: IGESDraw_NetworkSubfigure + - symbol: IGESDraw_NetworkSubfigureDef + - symbol: IGESDraw_PerspectiveView + - symbol: IGESDraw_Planar + - symbol: IGESDraw_Protocol + - symbol: IGESDraw_ReadWriteModule + - symbol: IGESDraw_RectArraySubfigure + - symbol: IGESDraw_SegmentedViewsVisible + - symbol: IGESDraw_SpecificModule + - symbol: IGESDraw_ToolCircArraySubfigure + - symbol: IGESDraw_ToolConnectPoint + - symbol: IGESDraw_ToolDrawing + - symbol: IGESDraw_ToolDrawingWithRotation + - symbol: IGESDraw_ToolLabelDisplay + - symbol: IGESDraw_ToolNetworkSubfigure + - symbol: IGESDraw_ToolNetworkSubfigureDef + - symbol: IGESDraw_ToolPerspectiveView + - symbol: IGESDraw_ToolPlanar + - symbol: IGESDraw_ToolRectArraySubfigure + - symbol: IGESDraw_ToolSegmentedViewsVisible + - symbol: IGESDraw_ToolView + - symbol: IGESDraw_ToolViewsVisible + - symbol: IGESDraw_ToolViewsVisibleWithAttr + - symbol: IGESDraw_View + - symbol: IGESDraw_ViewsVisible + - symbol: IGESDraw_ViewsVisibleWithAttr + - symbol: IGESGeom + - symbol: IGESGeom_BSplineCurve + - symbol: IGESGeom_BSplineSurface + - symbol: IGESGeom_Boundary + - symbol: IGESGeom_BoundedSurface + - symbol: IGESGeom_CircularArc + - symbol: IGESGeom_CompositeCurve + - symbol: IGESGeom_ConicArc + - symbol: IGESGeom_CopiousData + - symbol: IGESGeom_CurveOnSurface + - symbol: IGESGeom_Direction + - symbol: IGESGeom_Flash + - symbol: IGESGeom_GeneralModule + - symbol: IGESGeom_Line + - symbol: IGESGeom_OffsetCurve + - symbol: IGESGeom_OffsetSurface + - symbol: IGESGeom_Plane + - symbol: IGESGeom_Point + - symbol: IGESGeom_Protocol + - symbol: IGESGeom_ReadWriteModule + - symbol: IGESGeom_RuledSurface + - symbol: IGESGeom_SpecificModule + - symbol: IGESGeom_SplineCurve + - symbol: IGESGeom_SplineSurface + - symbol: IGESGeom_SurfaceOfRevolution + - symbol: IGESGeom_TabulatedCylinder + - symbol: IGESGeom_ToolBSplineCurve + - symbol: IGESGeom_ToolBSplineSurface + - symbol: IGESGeom_ToolBoundary + - symbol: IGESGeom_ToolBoundedSurface + - symbol: IGESGeom_ToolCircularArc + - symbol: IGESGeom_ToolCompositeCurve + - symbol: IGESGeom_ToolConicArc + - symbol: IGESGeom_ToolCopiousData + - symbol: IGESGeom_ToolCurveOnSurface + - symbol: IGESGeom_ToolDirection + - symbol: IGESGeom_ToolFlash + - symbol: IGESGeom_ToolLine + - symbol: IGESGeom_ToolOffsetCurve + - symbol: IGESGeom_ToolOffsetSurface + - symbol: IGESGeom_ToolPlane + - symbol: IGESGeom_ToolPoint + - symbol: IGESGeom_ToolRuledSurface + - symbol: IGESGeom_ToolSplineCurve + - symbol: IGESGeom_ToolSplineSurface + - symbol: IGESGeom_ToolSurfaceOfRevolution + - symbol: IGESGeom_ToolTabulatedCylinder + - symbol: IGESGeom_ToolTransformationMatrix + - symbol: IGESGeom_ToolTrimmedSurface + - symbol: IGESGeom_TransformationMatrix + - symbol: IGESGeom_TrimmedSurface + - symbol: IGESGraph + - symbol: IGESGraph_Color + - symbol: IGESGraph_DefinitionLevel + - symbol: IGESGraph_DrawingSize + - symbol: IGESGraph_DrawingUnits + - symbol: IGESGraph_GeneralModule + - symbol: IGESGraph_HighLight + - symbol: IGESGraph_IntercharacterSpacing + - symbol: IGESGraph_LineFontDefPattern + - symbol: IGESGraph_LineFontDefTemplate + - symbol: IGESGraph_LineFontPredefined + - symbol: IGESGraph_NominalSize + - symbol: IGESGraph_Pick + - symbol: IGESGraph_Protocol + - symbol: IGESGraph_ReadWriteModule + - symbol: IGESGraph_SpecificModule + - symbol: IGESGraph_TextDisplayTemplate + - symbol: IGESGraph_TextFontDef + - symbol: IGESGraph_ToolColor + - symbol: IGESGraph_ToolDefinitionLevel + - symbol: IGESGraph_ToolDrawingSize + - symbol: IGESGraph_ToolDrawingUnits + - symbol: IGESGraph_ToolHighLight + - symbol: IGESGraph_ToolIntercharacterSpacing + - symbol: IGESGraph_ToolLineFontDefPattern + - symbol: IGESGraph_ToolLineFontDefTemplate + - symbol: IGESGraph_ToolLineFontPredefined + - symbol: IGESGraph_ToolNominalSize + - symbol: IGESGraph_ToolPick + - symbol: IGESGraph_ToolTextDisplayTemplate + - symbol: IGESGraph_ToolTextFontDef + - symbol: IGESGraph_ToolUniformRectGrid + - symbol: IGESGraph_UniformRectGrid + - symbol: IGESSelect + - symbol: IGESSelect_Activator + - symbol: IGESSelect_AddFileComment + - symbol: IGESSelect_AddGroup + - symbol: IGESSelect_AutoCorrect + - symbol: IGESSelect_ChangeLevelList + - symbol: IGESSelect_ChangeLevelNumber + - symbol: IGESSelect_ComputeStatus + - symbol: IGESSelect_CounterOfLevelNumber + - symbol: IGESSelect_DispPerDrawing + - symbol: IGESSelect_DispPerSingleView + - symbol: IGESSelect_Dumper + - symbol: IGESSelect_EditDirPart + - symbol: IGESSelect_EditHeader + - symbol: IGESSelect_FileModifier + - symbol: IGESSelect_FloatFormat + - symbol: IGESSelect_IGESName + - symbol: IGESSelect_IGESTypeForm + - symbol: IGESSelect_ModelModifier + - symbol: IGESSelect_RebuildDrawings + - symbol: IGESSelect_RebuildGroups + - symbol: IGESSelect_RemoveCurves + - symbol: IGESSelect_SelectBypassGroup + - symbol: IGESSelect_SelectBypassSubfigure + - symbol: IGESSelect_SelectDrawingFrom + - symbol: IGESSelect_SelectFaces + - symbol: IGESSelect_SelectFromDrawing + - symbol: IGESSelect_SelectFromSingleView + - symbol: IGESSelect_SelectLevelNumber + - symbol: IGESSelect_SelectName + - symbol: IGESSelect_SelectPCurves + - symbol: IGESSelect_SelectSingleViewFrom + - symbol: IGESSelect_SelectSubordinate + - symbol: IGESSelect_SelectVisibleStatus + - symbol: IGESSelect_SetGlobalParameter + - symbol: IGESSelect_SetLabel + - symbol: IGESSelect_SetVersion5 + - symbol: IGESSelect_SignColor + - symbol: IGESSelect_SignLevelNumber + - symbol: IGESSelect_SignStatus + - symbol: IGESSelect_SplineToBSpline + - symbol: IGESSelect_UpdateCreationDate + - symbol: IGESSelect_UpdateFileName + - symbol: IGESSelect_UpdateLastChange + - symbol: IGESSelect_ViewSorter + - symbol: IGESSelect_WorkLibrary + - symbol: IGESSolid + - symbol: IGESSolid_Block + - symbol: IGESSolid_BooleanTree + - symbol: IGESSolid_ConeFrustum + - symbol: IGESSolid_ConicalSurface + - symbol: IGESSolid_Cylinder + - symbol: IGESSolid_CylindricalSurface + - symbol: IGESSolid_EdgeList + - symbol: IGESSolid_Ellipsoid + - symbol: IGESSolid_Face + - symbol: IGESSolid_GeneralModule + - symbol: IGESSolid_Loop + - symbol: IGESSolid_ManifoldSolid + - symbol: IGESSolid_PlaneSurface + - symbol: IGESSolid_Protocol + - symbol: IGESSolid_ReadWriteModule + - symbol: IGESSolid_RightAngularWedge + - symbol: IGESSolid_SelectedComponent + - symbol: IGESSolid_Shell + - symbol: IGESSolid_SolidAssembly + - symbol: IGESSolid_SolidInstance + - symbol: IGESSolid_SolidOfLinearExtrusion + - symbol: IGESSolid_SolidOfRevolution + - symbol: IGESSolid_SpecificModule + - symbol: IGESSolid_Sphere + - symbol: IGESSolid_SphericalSurface + - symbol: IGESSolid_ToolBlock + - symbol: IGESSolid_ToolBooleanTree + - symbol: IGESSolid_ToolConeFrustum + - symbol: IGESSolid_ToolConicalSurface + - symbol: IGESSolid_ToolCylinder + - symbol: IGESSolid_ToolCylindricalSurface + - symbol: IGESSolid_ToolEdgeList + - symbol: IGESSolid_ToolEllipsoid + - symbol: IGESSolid_ToolFace + - symbol: IGESSolid_ToolLoop + - symbol: IGESSolid_ToolManifoldSolid + - symbol: IGESSolid_ToolPlaneSurface + - symbol: IGESSolid_ToolRightAngularWedge + - symbol: IGESSolid_ToolSelectedComponent + - symbol: IGESSolid_ToolShell + - symbol: IGESSolid_ToolSolidAssembly + - symbol: IGESSolid_ToolSolidInstance + - symbol: IGESSolid_ToolSolidOfLinearExtrusion + - symbol: IGESSolid_ToolSolidOfRevolution + - symbol: IGESSolid_ToolSphere + - symbol: IGESSolid_ToolSphericalSurface + - symbol: IGESSolid_ToolToroidalSurface + - symbol: IGESSolid_ToolTorus + - symbol: IGESSolid_ToolVertexList + - symbol: IGESSolid_TopoBuilder + - symbol: IGESSolid_ToroidalSurface + - symbol: IGESSolid_Torus + - symbol: IGESSolid_VertexList + - symbol: IGESToBRep + - symbol: IGESToBRep_Actor + - symbol: IGESToBRep_AlgoContainer + - symbol: IGESToBRep_BRepEntity + - symbol: IGESToBRep_BasicCurve + - symbol: IGESToBRep_BasicSurface + - symbol: IGESToBRep_CurveAndSurface + - symbol: IGESToBRep_IGESBoundary + - symbol: IGESToBRep_Reader + - symbol: IGESToBRep_ToolContainer + - symbol: IGESToBRep_TopoCurve + - symbol: IMeshData_Array1OfInteger + - symbol: IMeshData_Array1OfVertexOfDelaun + - symbol: IMeshData_BndBox2dTree + - symbol: IMeshData_BndBox2dTreeFiller + - symbol: IMeshData_CircleCellFilter + - symbol: IMeshData_Curve + - symbol: IMeshData_DMapOfIFacePtrsListOfInteger + - symbol: IMeshData_DMapOfIFacePtrsMapOfIEdgePtrs + - symbol: IMeshData_DMapOfIntegerListOfInteger + - symbol: IMeshData_DMapOfShapeInteger + - symbol: IMeshData_IDMapOfIFacePtrsListOfIPCurves + - symbol: IMeshData_IDMapOfLink + - symbol: IMeshData_IMapOfReal + - symbol: IMeshData_ListOfIPCurves + - symbol: IMeshData_ListOfInteger + - symbol: IMeshData_ListOfPnt2d + - symbol: IMeshData_MapOfIEdgePtr + - symbol: IMeshData_MapOfIFacePtr + - symbol: IMeshData_MapOfInteger + - symbol: IMeshData_MapOfIntegerInteger + - symbol: IMeshData_MapOfOrientedEdges + - symbol: IMeshData_MapOfReal + - symbol: IMeshData_Model + - symbol: IMeshData_PCurve + - symbol: IMeshData_ParametersList + - symbol: IMeshData_SequenceOfBndB2d + - symbol: IMeshData_SequenceOfInteger + - symbol: IMeshData_SequenceOfReal + - symbol: IMeshData_Shape + - symbol: IMeshData_Status + - symbol: IMeshData_StatusOwner + - symbol: IMeshData_TessellatedShape + - symbol: IMeshData_VectorOfBoolean + - symbol: IMeshData_VectorOfCircle + - symbol: IMeshData_VectorOfElements + - symbol: IMeshData_VectorOfIEdgeHandles + - symbol: IMeshData_VectorOfIEdgePtrs + - symbol: IMeshData_VectorOfIFaceHandles + - symbol: IMeshData_VectorOfIPCurveHandles + - symbol: IMeshData_VectorOfIWireHandles + - symbol: IMeshData_VectorOfInteger + - symbol: IMeshData_VectorOfOrientation + - symbol: IMeshData_VectorOfVertex + - symbol: IMeshData_VertexCellFilter + - symbol: IMeshTools_Context + - symbol: IMeshTools_CurveTessellator + - symbol: IMeshTools_MeshAlgo + - symbol: IMeshTools_MeshAlgoFactory + - symbol: IMeshTools_MeshAlgoType + - symbol: IMeshTools_MeshBuilder + - symbol: IMeshTools_ModelAlgo + - symbol: IMeshTools_ModelBuilder + - symbol: IMeshTools_Parameters + - symbol: IMeshTools_ShapeExplorer + - symbol: IMeshTools_ShapeVisitor + - symbol: IntAna2d_AnaIntersection + - symbol: IntAna2d_Conic + - symbol: IntAna2d_IntPoint + - symbol: IntAna_Curve + - symbol: IntAna_Int3Pln + - symbol: IntAna_IntConicQuad + - symbol: IntAna_IntLinTorus + - symbol: IntAna_IntQuadQuad + - symbol: IntAna_QuadQuadGeo + - symbol: IntAna_Quadric + - symbol: IntAna_ResultType + - symbol: IntCurveSurface_HInter + - symbol: IntCurveSurface_Intersection + - symbol: IntCurveSurface_IntersectionSegment + - symbol: IntCurveSurface_TheCSFunctionOfHInter + - symbol: IntCurveSurface_TheExactHInter + - symbol: IntCurveSurface_TheHCurveTool + - symbol: IntCurveSurface_TheInterferenceOfHInter + - symbol: IntCurveSurface_ThePolygonOfHInter + - symbol: IntCurveSurface_ThePolygonToolOfHInter + - symbol: IntCurveSurface_ThePolyhedronToolOfHInter + - symbol: IntCurveSurface_TheQuadCurvExactHInter + - symbol: IntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter + - symbol: IntCurveSurface_TransitionOnCurve + - symbol: IntCurve_IConicTool + - symbol: IntCurve_IntConicConic + - symbol: IntCurve_IntImpConicParConic + - symbol: IntCurve_MyImpParToolOfIntImpConicParConic + - symbol: IntCurve_PConic + - symbol: IntCurve_PConicTool + - symbol: IntCurve_ProjectOnPConicTool + - symbol: IntCurvesFace_Intersector + - symbol: IntCurvesFace_ShapeIntersector + - symbol: IntImp_ConstIsoparametric + - symbol: IntPatch_ALine + - symbol: IntPatch_ALineToWLine + - symbol: IntPatch_ArcFunction + - symbol: IntPatch_BVHTraversal + - symbol: IntPatch_BVHTraversal_TrianglePair + - symbol: IntPatch_CSFunction + - symbol: IntPatch_CurvIntSurf + - symbol: IntPatch_GLine + - symbol: IntPatch_HCurve2dTool + - symbol: IntPatch_HInterTool + - symbol: IntPatch_IType + - symbol: IntPatch_ImpImpIntersection + - symbol: IntPatch_ImpPrmIntersection + - symbol: IntPatch_InterferencePolyhedron + - symbol: IntPatch_Intersection + - symbol: IntPatch_Line + - symbol: IntPatch_LineConstructor + - symbol: IntPatch_Point + - symbol: IntPatch_PointLine + - symbol: IntPatch_PolyArc + - symbol: IntPatch_PolyLine + - symbol: IntPatch_Polygo + - symbol: IntPatch_PolyhedronBVH + - symbol: IntPatch_PolyhedronTool + - symbol: IntPatch_PrmPrmIntersection + - symbol: IntPatch_PrmPrmIntersection_T3Bits + - symbol: IntPatch_RstInt + - symbol: IntPatch_SpecPntType + - symbol: IntPatch_SpecialPoints + - symbol: IntPatch_TheIWLineOfTheIWalking + - symbol: IntPatch_TheIWalking + - symbol: IntPatch_ThePathPointOfTheSOnBounds + - symbol: IntPatch_TheSOnBounds + - symbol: IntPatch_TheSearchInside + - symbol: IntPatch_TheSegmentOfTheSOnBounds + - symbol: IntPatch_TheSurfFunction + - symbol: IntPatch_WLine + - symbol: IntPatch_WLineTool + - symbol: IntPolyh_Couple + - symbol: IntPolyh_Edge + - symbol: IntPolyh_Intersection + - symbol: IntPolyh_Point + - symbol: IntPolyh_PointNormal + - symbol: IntPolyh_SectionLine + - symbol: IntPolyh_StartPoint + - symbol: IntPolyh_Tools + - symbol: IntPolyh_Triangle + - symbol: IntRes2d_Domain + - symbol: IntRes2d_Intersection + - symbol: IntRes2d_IntersectionPoint + - symbol: IntRes2d_IntersectionSegment + - symbol: IntRes2d_Position + - symbol: IntRes2d_Situation + - symbol: IntRes2d_Transition + - symbol: IntRes2d_TypeTrans + - symbol: IntStart_SITopolTool + - symbol: IntSurf + - symbol: IntSurf_Couple + - symbol: IntSurf_InteriorPoint + - symbol: IntSurf_InteriorPointTool + - symbol: IntSurf_LineOn2S + - symbol: IntSurf_PathPoint + - symbol: IntSurf_PathPointTool + - symbol: IntSurf_PntOn2S + - symbol: IntSurf_Quadric + - symbol: IntSurf_QuadricTool + - symbol: IntSurf_Situation + - symbol: IntSurf_Transition + - symbol: IntSurf_TypeTrans + - symbol: IntTools + - symbol: IntTools_BaseRangeSample + - symbol: IntTools_BeanFaceIntersector + - symbol: IntTools_CommonPrt + - symbol: IntTools_Context + - symbol: IntTools_Curve + - symbol: IntTools_CurveRangeLocalizeData + - symbol: IntTools_CurveRangeSample + - symbol: IntTools_EdgeEdge + - symbol: IntTools_EdgeFace + - symbol: IntTools_FClass2d + - symbol: IntTools_FaceFace + - symbol: IntTools_MarkedRangeSet + - symbol: IntTools_PntOn2Faces + - symbol: IntTools_Range + - symbol: IntTools_Root + - symbol: IntTools_ShrunkRange + - symbol: IntTools_SurfaceRangeLocalizeData + - symbol: IntTools_SurfaceRangeSample + - symbol: IntTools_Tools + - symbol: IntTools_TopolTool + - symbol: IntTools_WLineTool + - symbol: IntWalk_StatusDeflection + - symbol: IntWalk_TheInt2S + - symbol: IntWalk_VectorOfInteger + - symbol: IntWalk_VectorOfWalkingData + - symbol: IntWalk_WalkingData + - symbol: Interface_BitMap + - symbol: Interface_Category + - symbol: Interface_Check + - symbol: Interface_CheckFailure + - symbol: Interface_CheckIterator + - symbol: Interface_CheckStatus + - symbol: Interface_CheckTool + - symbol: Interface_CopyControl + - symbol: Interface_CopyMap + - symbol: Interface_CopyTool + - symbol: Interface_DataState + - symbol: Interface_EntityCluster + - symbol: Interface_EntityIterator + - symbol: Interface_EntityList + - symbol: Interface_FileParameter + - symbol: Interface_FileReaderTool + - symbol: Interface_FloatWriter + - symbol: Interface_GTool + - symbol: Interface_GeneralLib + - symbol: Interface_GlobalNodeOfGeneralLib + - symbol: Interface_GlobalNodeOfReaderLib + - symbol: Interface_GraphContent + - symbol: Interface_IntList + - symbol: Interface_IntVal + - symbol: Interface_InterfaceError + - symbol: Interface_InterfaceMismatch + - symbol: Interface_InterfaceModel + - symbol: Interface_LineBuffer + - symbol: Interface_MSG + - symbol: Interface_NodeOfGeneralLib + - symbol: Interface_NodeOfReaderLib + - symbol: Interface_ParamList + - symbol: Interface_ParamSet + - symbol: Interface_ParamType + - symbol: Interface_Protocol + - symbol: Interface_ReaderLib + - symbol: Interface_ReaderModule + - symbol: Interface_ReportEntity + - symbol: Interface_STAT + - symbol: Interface_ShareFlags + - symbol: Interface_ShareTool + - symbol: Interface_SignLabel + - symbol: Interface_SignType + - symbol: Interface_Static + - symbol: Interface_TypedValue + - symbol: Interval + - symbol: Intf + - symbol: Intf_Interference + - symbol: Intf_InterferencePolygon2d + - symbol: Intf_PIType + - symbol: Intf_Polygon2d + - symbol: Intf_SectionLine + - symbol: Intf_TangentZone + - symbol: Intf_Tool + - symbol: Intrv_Interval + - symbol: Intrv_Intervals + - symbol: Intrv_Position + - symbol: LDOMBasicString + - symbol: LDOMParser + - symbol: LDOMString + - symbol: LDOM_Attr + - symbol: LDOM_BasicAttribute + - symbol: LDOM_BasicElement + - symbol: LDOM_BasicNode + - symbol: LDOM_BasicText + - symbol: LDOM_CDATASection + - symbol: LDOM_CharReference + - symbol: LDOM_CharacterData + - symbol: LDOM_Comment + - symbol: LDOM_Document + - symbol: LDOM_DocumentType + - symbol: LDOM_Element + - symbol: LDOM_LDOMImplementation + - symbol: LDOM_MemManager + - symbol: LDOM_Node + - symbol: LDOM_NodeList + - symbol: LDOM_OSStream + - symbol: LDOM_SBuffer + - symbol: LDOM_Text + - symbol: LDOM_XmlWriter + - symbol: LProp_BadContinuity + - symbol: LProp_CIType + - symbol: LProp_CLProps3d + - symbol: LProp_CurAndInf + - symbol: LProp_CurveUtils_DirectAccess + - symbol: LProp_NotDefined + - symbol: LProp_SLProps3d + - symbol: LProp_Status + - symbol: LProp_SurfaceUtils_DirectAccess + - symbol: Law + - symbol: Law_BSpFunc + - symbol: Law_BSpline + - symbol: Law_BSplineKnotSplitting + - symbol: Law_Composite + - symbol: Law_Constant + - symbol: Law_Function + - symbol: Law_Interpol + - symbol: Law_Interpolate + - symbol: Law_Linear + - symbol: Law_S + - symbol: LocOpe + - symbol: LocOpe_BuildShape + - symbol: LocOpe_BuildWires + - symbol: LocOpe_DPrism + - symbol: LocOpe_FindEdges + - symbol: LocOpe_FindEdgesInFace + - symbol: LocOpe_GeneratedShape + - symbol: LocOpe_Generator + - symbol: LocOpe_GluedShape + - symbol: LocOpe_Gluer + - symbol: LocOpe_LinearForm + - symbol: LocOpe_Operation + - symbol: LocOpe_Pipe + - symbol: LocOpe_PntFace + - symbol: LocOpe_Prism + - symbol: LocOpe_SplitDrafts + - symbol: LocOpe_SplitShape + - symbol: LocOpe_Spliter + - symbol: LocOpe_WiresOnShape + - symbol: LocalAnalysis + - symbol: LocalAnalysis_CurveContinuity + - symbol: LocalAnalysis_StatusErrorType + - symbol: LocalAnalysis_SurfaceContinuity + - symbol: MAT2d_BiInt + - symbol: MAT2d_Circuit + - symbol: MAT2d_Connexion + - symbol: MAT2d_Mat2d + - symbol: MAT2d_MiniPath + - symbol: MAT2d_Tool2d + - symbol: MAT_Arc + - symbol: MAT_BasicElt + - symbol: MAT_Bisector + - symbol: MAT_Edge + - symbol: MAT_Graph + - symbol: MAT_ListOfBisector + - symbol: MAT_ListOfEdge + - symbol: MAT_Node + - symbol: MAT_Side + - symbol: MAT_TListNodeOfListOfBisector + - symbol: MAT_TListNodeOfListOfEdge + - symbol: MAT_Zone + - symbol: MathInteg_DoubleExpConfig + - symbol: MathInteg_KronrodConfig + - symbol: MathInteg_MultipleConfig + - symbol: MathInteg_SetResult + - symbol: MathLin_CroutResult + - symbol: MathLin_EigenResult + - symbol: MathLin_LUResult + - symbol: MathLin_LeastSquaresMethod + - symbol: MathLin_LeastSquaresResult + - symbol: MathLin_QRResult + - symbol: MathLin_SVDResult + - symbol: MathOpt_ConjugateGradientFormula + - symbol: MathOpt_FRPRConfig + - symbol: MathOpt_GlobalConfig + - symbol: MathOpt_GlobalStrategy + - symbol: MathOpt_NewtonConfig + - symbol: MathOpt_PSOBoundaryMode + - symbol: MathOpt_PSOConfig + - symbol: MathOpt_PSOInertiaSchedule + - symbol: MathOpt_PSOInitMode + - symbol: MathOpt_PSOSeedParticle + - symbol: MathOpt_PSOStats + - symbol: MathOpt_UzawaConfig + - symbol: MathOpt_UzawaResult + - symbol: MathPoly_GeneralPolyResult + - symbol: MathRoot_AllRootsResult + - symbol: MathRoot_MultipleConfig + - symbol: MathRoot_MultipleNoExtraHandler + - symbol: MathRoot_MultipleResult + - symbol: MathRoot_NullInterval + - symbol: MathRoot_TrigResult + - symbol: MathSys_LMConfig + - symbol: MathSys_NewtonOptions + - symbol: MathUtils_Ackley + - symbol: MathUtils_Beale + - symbol: MathUtils_Booth + - symbol: MathUtils_BoundedConfig + - symbol: MathUtils_BracketResult + - symbol: MathUtils_Config + - symbol: MathUtils_Constant + - symbol: MathUtils_Cosine + - symbol: MathUtils_DecompResult + - symbol: MathUtils_Domain1D + - symbol: MathUtils_Domain2D + - symbol: MathUtils_EigenResult + - symbol: MathUtils_Exponential + - symbol: MathUtils_Gaussian + - symbol: MathUtils_Himmelblau + - symbol: MathUtils_IntegConfig + - symbol: MathUtils_IntegResult + - symbol: MathUtils_InverseResult + - symbol: MathUtils_LinConfig + - symbol: MathUtils_LineSearchResult + - symbol: MathUtils_Linear + - symbol: MathUtils_LinearMultipleResult + - symbol: MathUtils_LinearResidual + - symbol: MathUtils_LinearResult + - symbol: MathUtils_MinBracketOptions + - symbol: MathUtils_MinBracketResult + - symbol: MathUtils_NDimConfig + - symbol: MathUtils_PolyResult + - symbol: MathUtils_Polynomial + - symbol: MathUtils_Power + - symbol: MathUtils_QuadraticForm + - symbol: MathUtils_RandomGenerator + - symbol: MathUtils_Rastrigin + - symbol: MathUtils_Rational + - symbol: MathUtils_Rosenbrock + - symbol: MathUtils_ScalarResult + - symbol: MathUtils_Sine + - symbol: MathUtils_Sphere + - symbol: MathUtils_Status + - symbol: MathUtils_VectorResult + - symbol: Message_Alert + - symbol: Message_AlertExtended + - symbol: Message_Algorithm + - symbol: Message_Attribute + - symbol: Message_AttributeMeter + - symbol: Message_AttributeObject + - symbol: Message_AttributeStream + - symbol: Message_CompositeAlerts + - symbol: Message_ExecStatus + - symbol: Message_Gravity + - symbol: Message_Level + - symbol: Message_MetricType + - symbol: Message_Msg + - symbol: Message_MsgFile + - symbol: Message_Printer + - symbol: Message_PrinterOStream + - symbol: Message_PrinterToReport + - symbol: Message_ProgressIndicator + - symbol: Message_ProgressRange + - symbol: Message_ProgressScope + - symbol: Message_ProgressSentry + - symbol: Message_Report + - symbol: Message_Status + - symbol: Message_StatusType + - symbol: MoniTool_AttrList + - symbol: MoniTool_CaseData + - symbol: MoniTool_DataInfo + - symbol: MoniTool_Element + - symbol: MoniTool_IntVal + - symbol: MoniTool_RealVal + - symbol: MoniTool_SignShape + - symbol: MoniTool_SignText + - symbol: MoniTool_Stat + - symbol: MoniTool_Timer + - symbol: MoniTool_TimerSentry + - symbol: MoniTool_TransientElem + - symbol: MoniTool_TypedValue + - symbol: MoniTool_ValueType + - symbol: MyDirectPolynomialRoots + - symbol: NCollection_AccAllocator + - symbol: NCollection_AlignedAllocator + - symbol: NCollection_BaseAllocator + - symbol: NCollection_BaseList + - symbol: NCollection_BaseList_Iterator + - symbol: NCollection_BaseMap + - symbol: NCollection_BaseMap_Iterator + - symbol: NCollection_BaseSequence + - symbol: NCollection_BaseSequence_Iterator + - symbol: NCollection_Buffer + - symbol: NCollection_CellFilter_Action + - symbol: NCollection_ForwardRangeSentinel + - symbol: NCollection_HeapAllocator + - symbol: NCollection_IncAllocator + - symbol: NCollection_IncAllocator_IBlock + - symbol: NCollection_SparseArrayBase + - symbol: NCollection_SparseArrayBase_Iterator + - symbol: NCollection_String + - symbol: NCollection_UtfStringTool + - symbol: NCollection_WinHeapAllocator + - symbol: NLPlate_HGPPConstraint + - symbol: NLPlate_HPG0Constraint + - symbol: NLPlate_HPG0G1Constraint + - symbol: NLPlate_HPG0G2Constraint + - symbol: NLPlate_HPG0G3Constraint + - symbol: NLPlate_HPG1Constraint + - symbol: NLPlate_HPG2Constraint + - symbol: NLPlate_HPG3Constraint + - symbol: NLPlate_NLPlate + - symbol: OSD + - symbol: OSD_Parallel + - symbol: OSD_Thread + - symbol: OSD_ThreadPool + - symbol: OSD_ThreadPool_Launcher + - symbol: PCDM + - symbol: PCDM_DOMHeaderParser + - symbol: PCDM_Document + - symbol: PCDM_DriverError + - symbol: PCDM_ReadWriter + - symbol: PCDM_ReadWriter_1 + - symbol: PCDM_Reader + - symbol: PCDM_ReaderStatus + - symbol: PCDM_Reference + - symbol: PCDM_ReferenceIterator + - symbol: PCDM_RetrievalDriver + - symbol: PCDM_StorageDriver + - symbol: PCDM_StoreStatus + - symbol: PCDM_TypeOfFileDriver + - symbol: PCDM_Writer + - symbol: PLib + - symbol: PLib_HermitJacobi + - symbol: PLib_JacobiPolynomial + - symbol: PSO_Particle + - symbol: PeriodicInterval + - symbol: PeriodicityInfo + - symbol: Plate_D1 + - symbol: Plate_D2 + - symbol: Plate_D3 + - symbol: Plate_FreeGtoCConstraint + - symbol: Plate_GlobalTranslationConstraint + - symbol: Plate_GtoCConstraint + - symbol: Plate_LineConstraint + - symbol: Plate_LinearScalarConstraint + - symbol: Plate_LinearXYZConstraint + - symbol: Plate_PinpointConstraint + - symbol: Plate_PlaneConstraint + - symbol: Plate_Plate + - symbol: Plate_SampledCurveConstraint + - symbol: Poly + - symbol: Poly_ArrayOfNodes + - symbol: Poly_ArrayOfUVNodes + - symbol: Poly_CoherentLink + - symbol: Poly_CoherentNode + - symbol: Poly_CoherentTriPtr_Iterator + - symbol: Poly_CoherentTriangle + - symbol: Poly_CoherentTriangulation + - symbol: Poly_CoherentTriangulation_IteratorOfLink + - symbol: Poly_CoherentTriangulation_IteratorOfNode + - symbol: Poly_CoherentTriangulation_IteratorOfTriangle + - symbol: Poly_Connect + - symbol: Poly_MakeLoops + - symbol: Poly_MakeLoops2D_Helper + - symbol: Poly_MakeLoops3D_Helper + - symbol: Poly_MakeLoops_Hasher + - symbol: Poly_MakeLoops_HeapOfInteger + - symbol: Poly_MakeLoops_Helper + - symbol: Poly_MakeLoops_Link + - symbol: Poly_MergeNodesTool + - symbol: Poly_Polygon2D + - symbol: Poly_Polygon3D + - symbol: Poly_PolygonOnTriangulation + - symbol: Poly_Triangle + - symbol: Poly_Triangulation + - symbol: Poly_TriangulationParameters + - symbol: Precision + - symbol: Quantity_Color + - symbol: Quantity_ColorRGBA + - symbol: Quantity_NameOfColor + - symbol: Quantity_TypeOfColor + - symbol: RWGltf_CafReader + - symbol: RWGltf_CafWriter + - symbol: RWGltf_DracoParameters + - symbol: RWGltf_GltfAccessor + - symbol: RWGltf_GltfAccessorCompType + - symbol: RWGltf_GltfAccessorLayout + - symbol: RWGltf_GltfAlphaMode + - symbol: RWGltf_GltfArrayType + - symbol: RWGltf_GltfBufferView + - symbol: RWGltf_GltfBufferViewTarget + - symbol: RWGltf_GltfFace + - symbol: RWGltf_GltfJsonParser + - symbol: RWGltf_GltfLatePrimitiveArray + - symbol: RWGltf_GltfMaterialMap + - symbol: RWGltf_GltfOStreamWriter + - symbol: RWGltf_GltfPrimArrayData + - symbol: RWGltf_GltfPrimitiveMode + - symbol: RWGltf_GltfRootElement + - symbol: RWGltf_GltfSceneNodeMap + - symbol: RWGltf_MaterialCommon + - symbol: RWGltf_MaterialMetallicRoughness + - symbol: RWGltf_TriangulationReader + - symbol: RWGltf_WriterTrsfFormat + - symbol: RWHeaderSection + - symbol: RWHeaderSection_RWFileDescription + - symbol: RWHeaderSection_RWFileName + - symbol: RWHeaderSection_RWFileSchema + - symbol: RWHeaderSection_ReadWriteModule + - symbol: RWMesh + - symbol: RWMesh_CafReader + - symbol: RWMesh_CafReaderStatusEx + - symbol: RWMesh_CoordinateSystem + - symbol: RWMesh_CoordinateSystemConverter + - symbol: RWMesh_EdgeIterator + - symbol: RWMesh_FaceIterator + - symbol: RWMesh_MaterialMap + - symbol: RWMesh_NameFormat + - symbol: RWMesh_NodeAttributes + - symbol: RWMesh_ShapeIterator + - symbol: RWMesh_TriangulationReader + - symbol: RWMesh_TriangulationReader_LoadingStatistic + - symbol: RWMesh_TriangulationSource + - symbol: RWMesh_VertexIterator + - symbol: RWObj + - symbol: RWObj_CafReader + - symbol: RWObj_CafWriter + - symbol: RWObj_IShapeReceiver + - symbol: RWObj_Material + - symbol: RWObj_MtlReader + - symbol: RWObj_ObjMaterialMap + - symbol: RWObj_ObjWriterContext + - symbol: RWObj_Reader + - symbol: RWObj_SubMesh + - symbol: RWObj_SubMeshReason + - symbol: RWObj_TriangulationReader + - symbol: RWPly_CafWriter + - symbol: RWPly_PlyWriterContext + - symbol: RWStl + - symbol: RWStl_Reader + - symbol: Resource_FormatType + - symbol: Resource_LexicalCompare + - symbol: Resource_Manager + - symbol: Resource_NoSuchResource + - symbol: Resource_Unicode + - symbol: STEPCAFControl_ActorWrite + - symbol: STEPCAFControl_Controller + - symbol: STEPCAFControl_ExternFile + - symbol: STEPCAFControl_Reader + - symbol: STEPCAFControl_Writer + - symbol: STEPConstruct + - symbol: STEPConstruct_AP203Context + - symbol: STEPConstruct_Assembly + - symbol: STEPConstruct_ContextTool + - symbol: STEPConstruct_ExternRefs + - symbol: STEPConstruct_Part + - symbol: STEPConstruct_RenderingProperties + - symbol: STEPConstruct_Styles + - symbol: STEPConstruct_Tool + - symbol: STEPConstruct_UnitContext + - symbol: STEPConstruct_ValidationProps + - symbol: STEPControl_ActorRead + - symbol: STEPControl_ActorWrite + - symbol: STEPControl_Controller + - symbol: STEPControl_Reader + - symbol: STEPControl_StepModelType + - symbol: STEPControl_Writer + - symbol: STEPEdit + - symbol: STEPEdit_EditContext + - symbol: STEPEdit_EditSDR + - symbol: STEPSelections_AssemblyComponent + - symbol: STEPSelections_AssemblyExplorer + - symbol: STEPSelections_AssemblyLink + - symbol: STEPSelections_SelectAssembly + - symbol: STEPSelections_SelectDerived + - symbol: STEPSelections_SelectFaces + - symbol: STEPSelections_SelectForTransfer + - symbol: STEPSelections_SelectGSCurves + - symbol: STEPSelections_SelectInstances + - symbol: ShapeAlgo + - symbol: ShapeAlgo_AlgoContainer + - symbol: ShapeAlgo_ToolContainer + - symbol: ShapeAnalysis + - symbol: ShapeAnalysis_BoxBndTreeSelector + - symbol: ShapeAnalysis_CanonicalRecognition + - symbol: ShapeAnalysis_CheckSmallFace + - symbol: ShapeAnalysis_Curve + - symbol: ShapeAnalysis_Edge + - symbol: ShapeAnalysis_FreeBoundData + - symbol: ShapeAnalysis_FreeBounds + - symbol: ShapeAnalysis_FreeBoundsProperties + - symbol: ShapeAnalysis_Geom + - symbol: ShapeAnalysis_ShapeContents + - symbol: ShapeAnalysis_ShapeTolerance + - symbol: ShapeAnalysis_Shell + - symbol: ShapeAnalysis_Surface + - symbol: ShapeAnalysis_TransferParameters + - symbol: ShapeAnalysis_TransferParametersProj + - symbol: ShapeAnalysis_Wire + - symbol: ShapeAnalysis_WireOrder + - symbol: ShapeAnalysis_WireVertex + - symbol: ShapeBuild + - symbol: ShapeBuild_Edge + - symbol: ShapeBuild_ReShape + - symbol: ShapeBuild_Vertex + - symbol: ShapeConstruct + - symbol: ShapeConstruct_Curve + - symbol: ShapeConstruct_MakeTriangulation + - symbol: ShapeConstruct_ProjectCurveOnSurface + - symbol: ShapeCustom + - symbol: ShapeCustom_BSplineRestriction + - symbol: ShapeCustom_ConvertToBSpline + - symbol: ShapeCustom_ConvertToRevolution + - symbol: ShapeCustom_Curve + - symbol: ShapeCustom_Curve2d + - symbol: ShapeCustom_DirectModification + - symbol: ShapeCustom_Modification + - symbol: ShapeCustom_RestrictionParameters + - symbol: ShapeCustom_Surface + - symbol: ShapeCustom_SweptToElementary + - symbol: ShapeCustom_TrsfModification + - symbol: ShapeExtend + - symbol: ShapeExtend_BasicMsgRegistrator + - symbol: ShapeExtend_ComplexCurve + - symbol: ShapeExtend_CompositeSurface + - symbol: ShapeExtend_Explorer + - symbol: ShapeExtend_MsgRegistrator + - symbol: ShapeExtend_Parametrisation + - symbol: ShapeExtend_Status + - symbol: ShapeExtend_WireData + - symbol: ShapeFix + - symbol: ShapeFix_ComposeShell + - symbol: ShapeFix_Edge + - symbol: ShapeFix_EdgeConnect + - symbol: ShapeFix_EdgeProjAux + - symbol: ShapeFix_Face + - symbol: ShapeFix_FaceConnect + - symbol: ShapeFix_FixSmallFace + - symbol: ShapeFix_FixSmallSolid + - symbol: ShapeFix_FreeBounds + - symbol: ShapeFix_IntersectionTool + - symbol: ShapeFix_Root + - symbol: ShapeFix_Shape + - symbol: ShapeFix_ShapeTolerance + - symbol: ShapeFix_Shell + - symbol: ShapeFix_Solid + - symbol: ShapeFix_SplitCommonVertex + - symbol: ShapeFix_SplitTool + - symbol: ShapeFix_Wire + - symbol: ShapeFix_WireVertex + - symbol: ShapeFix_Wireframe + - symbol: ShapeProcess + - symbol: ShapeProcessAPI_ApplySequence + - symbol: ShapeProcess_Context + - symbol: ShapeProcess_OperLibrary + - symbol: ShapeProcess_Operator + - symbol: ShapeProcess_ShapeContext + - symbol: ShapeProcess_UOperator + - symbol: ShapeUpgrade + - symbol: ShapeUpgrade_ClosedEdgeDivide + - symbol: ShapeUpgrade_ClosedFaceDivide + - symbol: ShapeUpgrade_ConvertCurve2dToBezier + - symbol: ShapeUpgrade_ConvertCurve3dToBezier + - symbol: ShapeUpgrade_ConvertSurfaceToBezierBasis + - symbol: ShapeUpgrade_EdgeDivide + - symbol: ShapeUpgrade_FaceDivide + - symbol: ShapeUpgrade_FaceDivideArea + - symbol: ShapeUpgrade_FixSmallBezierCurves + - symbol: ShapeUpgrade_FixSmallCurves + - symbol: ShapeUpgrade_RemoveInternalWires + - symbol: ShapeUpgrade_RemoveLocations + - symbol: ShapeUpgrade_ShapeConvertToBezier + - symbol: ShapeUpgrade_ShapeDivide + - symbol: ShapeUpgrade_ShapeDivideAngle + - symbol: ShapeUpgrade_ShapeDivideArea + - symbol: ShapeUpgrade_ShapeDivideClosed + - symbol: ShapeUpgrade_ShapeDivideClosedEdges + - symbol: ShapeUpgrade_ShapeDivideContinuity + - symbol: ShapeUpgrade_ShellSewing + - symbol: ShapeUpgrade_SplitCurve + - symbol: ShapeUpgrade_SplitCurve2d + - symbol: ShapeUpgrade_SplitCurve2dContinuity + - symbol: ShapeUpgrade_SplitCurve3d + - symbol: ShapeUpgrade_SplitCurve3dContinuity + - symbol: ShapeUpgrade_SplitSurface + - symbol: ShapeUpgrade_SplitSurfaceAngle + - symbol: ShapeUpgrade_SplitSurfaceArea + - symbol: ShapeUpgrade_SplitSurfaceContinuity + - symbol: ShapeUpgrade_Tool + - symbol: ShapeUpgrade_UnifySameDomain + - symbol: ShapeUpgrade_WireDivide + - symbol: Standard + - symbol: Standard_ArrayStreamBuffer + - symbol: Standard_CLocaleSentry + - symbol: Standard_CStringHasher + - symbol: Standard_Condition + - symbol: Standard_ConstructionError + - symbol: Standard_DimensionError + - symbol: Standard_DimensionMismatch + - symbol: Standard_DivideByZero + - symbol: Standard_DomainError + - symbol: Standard_DumpValue + - symbol: Standard_ErrorHandler_Callback + - symbol: Standard_Failure + - symbol: Standard_GUID + - symbol: Standard_HMutex + - symbol: Standard_JsonKey + - symbol: Standard_MultiplyDefined + - symbol: Standard_Mutex + - symbol: Standard_Mutex_Sentry + - symbol: Standard_NegativeValue + - symbol: Standard_NoMoreObject + - symbol: Standard_NoSuchObject + - symbol: Standard_NotImplemented + - symbol: Standard_NullObject + - symbol: Standard_NullValue + - symbol: Standard_NumericError + - symbol: Standard_OutOfMemory + - symbol: Standard_OutOfRange + - symbol: Standard_Overflow + - symbol: Standard_Persistent + - symbol: Standard_ProgramError + - symbol: Standard_RangeError + - symbol: Standard_ReadBuffer + - symbol: Standard_ReadLineBuffer + - symbol: Standard_Transient + - symbol: Standard_Type + - symbol: Standard_TypeMismatch + - symbol: Standard_UUID + - symbol: Standard_Underflow + - symbol: StdFail_InfiniteSolutions + - symbol: StdFail_NotDone + - symbol: StdFail_Undefined + - symbol: StdFail_UndefinedDerivative + - symbol: StdFail_UndefinedValue + - symbol: StepAP203_ApprovedItem + - symbol: StepAP203_CcDesignApproval + - symbol: StepAP203_CcDesignCertification + - symbol: StepAP203_CcDesignContract + - symbol: StepAP203_CcDesignDateAndTimeAssignment + - symbol: StepAP203_CcDesignPersonAndOrganizationAssignment + - symbol: StepAP203_CcDesignSecurityClassification + - symbol: StepAP203_CcDesignSpecificationReference + - symbol: StepAP203_CertifiedItem + - symbol: StepAP203_Change + - symbol: StepAP203_ChangeRequest + - symbol: StepAP203_ChangeRequestItem + - symbol: StepAP203_ClassifiedItem + - symbol: StepAP203_ContractedItem + - symbol: StepAP203_DateTimeItem + - symbol: StepAP203_PersonOrganizationItem + - symbol: StepAP203_SpecifiedItem + - symbol: StepAP203_StartRequest + - symbol: StepAP203_StartRequestItem + - symbol: StepAP203_StartWork + - symbol: StepAP203_WorkItem + - symbol: StepAP209_Construct + - symbol: StepAP214 + - symbol: StepAP214_AppliedApprovalAssignment + - symbol: StepAP214_AppliedDateAndTimeAssignment + - symbol: StepAP214_AppliedDateAssignment + - symbol: StepAP214_AppliedDocumentReference + - symbol: StepAP214_AppliedExternalIdentificationAssignment + - symbol: StepAP214_AppliedGroupAssignment + - symbol: StepAP214_AppliedOrganizationAssignment + - symbol: StepAP214_AppliedPersonAndOrganizationAssignment + - symbol: StepAP214_AppliedPresentedItem + - symbol: StepAP214_AppliedSecurityClassificationAssignment + - symbol: StepAP214_ApprovalItem + - symbol: StepAP214_AutoDesignActualDateAndTimeAssignment + - symbol: StepAP214_AutoDesignActualDateAssignment + - symbol: StepAP214_AutoDesignApprovalAssignment + - symbol: StepAP214_AutoDesignDateAndPersonAssignment + - symbol: StepAP214_AutoDesignDateAndPersonItem + - symbol: StepAP214_AutoDesignDateAndTimeItem + - symbol: StepAP214_AutoDesignDatedItem + - symbol: StepAP214_AutoDesignDocumentReference + - symbol: StepAP214_AutoDesignGeneralOrgItem + - symbol: StepAP214_AutoDesignGroupAssignment + - symbol: StepAP214_AutoDesignGroupedItem + - symbol: StepAP214_AutoDesignNominalDateAndTimeAssignment + - symbol: StepAP214_AutoDesignNominalDateAssignment + - symbol: StepAP214_AutoDesignOrganizationAssignment + - symbol: StepAP214_AutoDesignOrganizationItem + - symbol: StepAP214_AutoDesignPersonAndOrganizationAssignment + - symbol: StepAP214_AutoDesignPresentedItem + - symbol: StepAP214_AutoDesignPresentedItemSelect + - symbol: StepAP214_AutoDesignReferencingItem + - symbol: StepAP214_AutoDesignSecurityClassificationAssignment + - symbol: StepAP214_Class + - symbol: StepAP214_DateAndTimeItem + - symbol: StepAP214_DateItem + - symbol: StepAP214_DocumentReferenceItem + - symbol: StepAP214_ExternalIdentificationItem + - symbol: StepAP214_ExternallyDefinedClass + - symbol: StepAP214_ExternallyDefinedGeneralProperty + - symbol: StepAP214_GroupItem + - symbol: StepAP214_OrganizationItem + - symbol: StepAP214_PersonAndOrganizationItem + - symbol: StepAP214_PresentedItemSelect + - symbol: StepAP214_Protocol + - symbol: StepAP214_RepItemGroup + - symbol: StepAP214_SecurityClassificationItem + - symbol: StepAP242_DraughtingModelItemAssociation + - symbol: StepAP242_GeometricItemSpecificUsage + - symbol: StepAP242_IdAttribute + - symbol: StepAP242_IdAttributeSelect + - symbol: StepAP242_ItemIdentifiedRepresentationUsage + - symbol: StepAP242_ItemIdentifiedRepresentationUsageDefinition + - symbol: StepBasic_Action + - symbol: StepBasic_ActionAssignment + - symbol: StepBasic_ActionMethod + - symbol: StepBasic_ActionRequestAssignment + - symbol: StepBasic_ActionRequestSolution + - symbol: StepBasic_Address + - symbol: StepBasic_AheadOrBehind + - symbol: StepBasic_ApplicationContext + - symbol: StepBasic_ApplicationContextElement + - symbol: StepBasic_ApplicationProtocolDefinition + - symbol: StepBasic_Approval + - symbol: StepBasic_ApprovalAssignment + - symbol: StepBasic_ApprovalDateTime + - symbol: StepBasic_ApprovalPersonOrganization + - symbol: StepBasic_ApprovalRelationship + - symbol: StepBasic_ApprovalRole + - symbol: StepBasic_ApprovalStatus + - symbol: StepBasic_AreaUnit + - symbol: StepBasic_CalendarDate + - symbol: StepBasic_Certification + - symbol: StepBasic_CertificationAssignment + - symbol: StepBasic_CertificationType + - symbol: StepBasic_CharacterizedObject + - symbol: StepBasic_Contract + - symbol: StepBasic_ContractAssignment + - symbol: StepBasic_ContractType + - symbol: StepBasic_ConversionBasedUnit + - symbol: StepBasic_ConversionBasedUnitAndAreaUnit + - symbol: StepBasic_ConversionBasedUnitAndLengthUnit + - symbol: StepBasic_ConversionBasedUnitAndMassUnit + - symbol: StepBasic_ConversionBasedUnitAndPlaneAngleUnit + - symbol: StepBasic_ConversionBasedUnitAndRatioUnit + - symbol: StepBasic_ConversionBasedUnitAndSolidAngleUnit + - symbol: StepBasic_ConversionBasedUnitAndTimeUnit + - symbol: StepBasic_ConversionBasedUnitAndVolumeUnit + - symbol: StepBasic_CoordinatedUniversalTimeOffset + - symbol: StepBasic_Date + - symbol: StepBasic_DateAndTime + - symbol: StepBasic_DateAndTimeAssignment + - symbol: StepBasic_DateAssignment + - symbol: StepBasic_DateRole + - symbol: StepBasic_DateTimeRole + - symbol: StepBasic_DateTimeSelect + - symbol: StepBasic_DerivedUnit + - symbol: StepBasic_DerivedUnitElement + - symbol: StepBasic_DesignContext + - symbol: StepBasic_DigitalDocument + - symbol: StepBasic_DimensionalExponents + - symbol: StepBasic_Document + - symbol: StepBasic_DocumentFile + - symbol: StepBasic_DocumentProductAssociation + - symbol: StepBasic_DocumentProductEquivalence + - symbol: StepBasic_DocumentReference + - symbol: StepBasic_DocumentRelationship + - symbol: StepBasic_DocumentRepresentationType + - symbol: StepBasic_DocumentType + - symbol: StepBasic_DocumentUsageConstraint + - symbol: StepBasic_Effectivity + - symbol: StepBasic_EffectivityAssignment + - symbol: StepBasic_EulerAngles + - symbol: StepBasic_ExternalIdentificationAssignment + - symbol: StepBasic_ExternalSource + - symbol: StepBasic_ExternallyDefinedItem + - symbol: StepBasic_GeneralProperty + - symbol: StepBasic_GeneralPropertyAssociation + - symbol: StepBasic_GeneralPropertyRelationship + - symbol: StepBasic_Group + - symbol: StepBasic_GroupAssignment + - symbol: StepBasic_GroupRelationship + - symbol: StepBasic_IdentificationAssignment + - symbol: StepBasic_IdentificationRole + - symbol: StepBasic_LengthMeasureWithUnit + - symbol: StepBasic_LengthUnit + - symbol: StepBasic_LocalTime + - symbol: StepBasic_MassMeasureWithUnit + - symbol: StepBasic_MassUnit + - symbol: StepBasic_MeasureValueMember + - symbol: StepBasic_MeasureWithUnit + - symbol: StepBasic_MechanicalContext + - symbol: StepBasic_NameAssignment + - symbol: StepBasic_NamedUnit + - symbol: StepBasic_ObjectRole + - symbol: StepBasic_OrdinalDate + - symbol: StepBasic_Organization + - symbol: StepBasic_OrganizationAssignment + - symbol: StepBasic_OrganizationRole + - symbol: StepBasic_OrganizationalAddress + - symbol: StepBasic_Person + - symbol: StepBasic_PersonAndOrganization + - symbol: StepBasic_PersonAndOrganizationAssignment + - symbol: StepBasic_PersonAndOrganizationRole + - symbol: StepBasic_PersonOrganizationSelect + - symbol: StepBasic_PersonalAddress + - symbol: StepBasic_PhysicallyModeledProductDefinition + - symbol: StepBasic_PlaneAngleMeasureWithUnit + - symbol: StepBasic_PlaneAngleUnit + - symbol: StepBasic_Product + - symbol: StepBasic_ProductCategory + - symbol: StepBasic_ProductCategoryRelationship + - symbol: StepBasic_ProductConceptContext + - symbol: StepBasic_ProductContext + - symbol: StepBasic_ProductDefinition + - symbol: StepBasic_ProductDefinitionContext + - symbol: StepBasic_ProductDefinitionEffectivity + - symbol: StepBasic_ProductDefinitionFormation + - symbol: StepBasic_ProductDefinitionFormationRelationship + - symbol: StepBasic_ProductDefinitionFormationWithSpecifiedSource + - symbol: StepBasic_ProductDefinitionOrReference + - symbol: StepBasic_ProductDefinitionReference + - symbol: StepBasic_ProductDefinitionReferenceWithLocalRepresentation + - symbol: StepBasic_ProductDefinitionRelationship + - symbol: StepBasic_ProductDefinitionWithAssociatedDocuments + - symbol: StepBasic_ProductOrFormationOrDefinition + - symbol: StepBasic_ProductRelatedProductCategory + - symbol: StepBasic_ProductType + - symbol: StepBasic_RatioMeasureWithUnit + - symbol: StepBasic_RatioUnit + - symbol: StepBasic_RoleAssociation + - symbol: StepBasic_RoleSelect + - symbol: StepBasic_SecurityClassification + - symbol: StepBasic_SecurityClassificationAssignment + - symbol: StepBasic_SecurityClassificationLevel + - symbol: StepBasic_SiPrefix + - symbol: StepBasic_SiUnit + - symbol: StepBasic_SiUnitAndAreaUnit + - symbol: StepBasic_SiUnitAndLengthUnit + - symbol: StepBasic_SiUnitAndMassUnit + - symbol: StepBasic_SiUnitAndPlaneAngleUnit + - symbol: StepBasic_SiUnitAndRatioUnit + - symbol: StepBasic_SiUnitAndSolidAngleUnit + - symbol: StepBasic_SiUnitAndThermodynamicTemperatureUnit + - symbol: StepBasic_SiUnitAndTimeUnit + - symbol: StepBasic_SiUnitAndVolumeUnit + - symbol: StepBasic_SiUnitName + - symbol: StepBasic_SizeMember + - symbol: StepBasic_SizeSelect + - symbol: StepBasic_SolidAngleMeasureWithUnit + - symbol: StepBasic_SolidAngleUnit + - symbol: StepBasic_Source + - symbol: StepBasic_SourceItem + - symbol: StepBasic_ThermodynamicTemperatureUnit + - symbol: StepBasic_TimeMeasureWithUnit + - symbol: StepBasic_TimeUnit + - symbol: StepBasic_UncertaintyMeasureWithUnit + - symbol: StepBasic_Unit + - symbol: StepBasic_VersionedActionRequest + - symbol: StepBasic_VolumeUnit + - symbol: StepBasic_WeekOfYearAndDayDate + - symbol: StepData + - symbol: StepData_Described + - symbol: StepData_ECDescr + - symbol: StepData_EDescr + - symbol: StepData_ESDescr + - symbol: StepData_EnumTool + - symbol: StepData_Factors + - symbol: StepData_Field + - symbol: StepData_FieldList + - symbol: StepData_FieldList1 + - symbol: StepData_FieldListD + - symbol: StepData_FieldListN + - symbol: StepData_FileProtocol + - symbol: StepData_FileRecognizer + - symbol: StepData_GlobalNodeOfWriterLib + - symbol: StepData_Logical + - symbol: StepData_NodeOfWriterLib + - symbol: StepData_PDescr + - symbol: StepData_Plex + - symbol: StepData_Protocol + - symbol: StepData_ReadWriteModule + - symbol: StepData_SelectArrReal + - symbol: StepData_SelectInt + - symbol: StepData_SelectMember + - symbol: StepData_SelectNamed + - symbol: StepData_SelectReal + - symbol: StepData_SelectType + - symbol: StepData_Simple + - symbol: StepData_StepDumper + - symbol: StepData_StepModel + - symbol: StepData_StepReaderTool + - symbol: StepData_StepWriter + - symbol: StepData_WriterLib + - symbol: StepDimTol_AngularityTolerance + - symbol: StepDimTol_AreaUnitType + - symbol: StepDimTol_CircularRunoutTolerance + - symbol: StepDimTol_CoaxialityTolerance + - symbol: StepDimTol_CommonDatum + - symbol: StepDimTol_ConcentricityTolerance + - symbol: StepDimTol_CylindricityTolerance + - symbol: StepDimTol_Datum + - symbol: StepDimTol_DatumFeature + - symbol: StepDimTol_DatumOrCommonDatum + - symbol: StepDimTol_DatumReference + - symbol: StepDimTol_DatumReferenceCompartment + - symbol: StepDimTol_DatumReferenceElement + - symbol: StepDimTol_DatumReferenceModifier + - symbol: StepDimTol_DatumReferenceModifierType + - symbol: StepDimTol_DatumReferenceModifierWithValue + - symbol: StepDimTol_DatumSystem + - symbol: StepDimTol_DatumSystemOrReference + - symbol: StepDimTol_DatumTarget + - symbol: StepDimTol_FlatnessTolerance + - symbol: StepDimTol_GeneralDatumReference + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRef + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndUneqDisGeoTol + - symbol: StepDimTol_GeoTolAndGeoTolWthMaxTol + - symbol: StepDimTol_GeoTolAndGeoTolWthMod + - symbol: StepDimTol_GeometricTolerance + - symbol: StepDimTol_GeometricToleranceModifier + - symbol: StepDimTol_GeometricToleranceRelationship + - symbol: StepDimTol_GeometricToleranceTarget + - symbol: StepDimTol_GeometricToleranceType + - symbol: StepDimTol_GeometricToleranceWithDatumReference + - symbol: StepDimTol_GeometricToleranceWithDefinedAreaUnit + - symbol: StepDimTol_GeometricToleranceWithDefinedUnit + - symbol: StepDimTol_GeometricToleranceWithMaximumTolerance + - symbol: StepDimTol_GeometricToleranceWithModifiers + - symbol: StepDimTol_LimitCondition + - symbol: StepDimTol_LineProfileTolerance + - symbol: StepDimTol_ModifiedGeometricTolerance + - symbol: StepDimTol_NonUniformZoneDefinition + - symbol: StepDimTol_ParallelismTolerance + - symbol: StepDimTol_PerpendicularityTolerance + - symbol: StepDimTol_PlacedDatumTargetFeature + - symbol: StepDimTol_PositionTolerance + - symbol: StepDimTol_ProjectedZoneDefinition + - symbol: StepDimTol_RoundnessTolerance + - symbol: StepDimTol_RunoutZoneDefinition + - symbol: StepDimTol_RunoutZoneOrientation + - symbol: StepDimTol_ShapeToleranceSelect + - symbol: StepDimTol_SimpleDatumReferenceModifier + - symbol: StepDimTol_SimpleDatumReferenceModifierMember + - symbol: StepDimTol_StraightnessTolerance + - symbol: StepDimTol_SurfaceProfileTolerance + - symbol: StepDimTol_SymmetryTolerance + - symbol: StepDimTol_ToleranceZone + - symbol: StepDimTol_ToleranceZoneDefinition + - symbol: StepDimTol_ToleranceZoneForm + - symbol: StepDimTol_ToleranceZoneTarget + - symbol: StepDimTol_TotalRunoutTolerance + - symbol: StepDimTol_UnequallyDisposedGeometricTolerance + - symbol: StepElement_AnalysisItemWithinRepresentation + - symbol: StepElement_Curve3dElementDescriptor + - symbol: StepElement_CurveEdge + - symbol: StepElement_CurveElementEndReleasePacket + - symbol: StepElement_CurveElementFreedom + - symbol: StepElement_CurveElementFreedomMember + - symbol: StepElement_CurveElementPurpose + - symbol: StepElement_CurveElementPurposeMember + - symbol: StepElement_CurveElementSectionDefinition + - symbol: StepElement_CurveElementSectionDerivedDefinitions + - symbol: StepElement_Element2dShape + - symbol: StepElement_ElementAspect + - symbol: StepElement_ElementAspectMember + - symbol: StepElement_ElementDescriptor + - symbol: StepElement_ElementMaterial + - symbol: StepElement_ElementOrder + - symbol: StepElement_ElementVolume + - symbol: StepElement_EnumeratedCurveElementFreedom + - symbol: StepElement_EnumeratedCurveElementPurpose + - symbol: StepElement_EnumeratedSurfaceElementPurpose + - symbol: StepElement_EnumeratedVolumeElementPurpose + - symbol: StepElement_MeasureOrUnspecifiedValue + - symbol: StepElement_MeasureOrUnspecifiedValueMember + - symbol: StepElement_Surface3dElementDescriptor + - symbol: StepElement_SurfaceElementProperty + - symbol: StepElement_SurfaceElementPurpose + - symbol: StepElement_SurfaceElementPurposeMember + - symbol: StepElement_SurfaceSection + - symbol: StepElement_SurfaceSectionField + - symbol: StepElement_SurfaceSectionFieldConstant + - symbol: StepElement_SurfaceSectionFieldVarying + - symbol: StepElement_UniformSurfaceSection + - symbol: StepElement_UnspecifiedValue + - symbol: StepElement_Volume3dElementDescriptor + - symbol: StepElement_Volume3dElementShape + - symbol: StepElement_VolumeElementPurpose + - symbol: StepElement_VolumeElementPurposeMember + - symbol: StepFEA_AlignedCurve3dElementCoordinateSystem + - symbol: StepFEA_AlignedSurface3dElementCoordinateSystem + - symbol: StepFEA_ArbitraryVolume3dElementCoordinateSystem + - symbol: StepFEA_ConstantSurface3dElementCoordinateSystem + - symbol: StepFEA_CoordinateSystemType + - symbol: StepFEA_Curve3dElementProperty + - symbol: StepFEA_Curve3dElementRepresentation + - symbol: StepFEA_CurveEdge + - symbol: StepFEA_CurveElementEndCoordinateSystem + - symbol: StepFEA_CurveElementEndOffset + - symbol: StepFEA_CurveElementEndRelease + - symbol: StepFEA_CurveElementInterval + - symbol: StepFEA_CurveElementIntervalConstant + - symbol: StepFEA_CurveElementIntervalLinearlyVarying + - symbol: StepFEA_CurveElementLocation + - symbol: StepFEA_DegreeOfFreedom + - symbol: StepFEA_DegreeOfFreedomMember + - symbol: StepFEA_DummyNode + - symbol: StepFEA_ElementGeometricRelationship + - symbol: StepFEA_ElementGroup + - symbol: StepFEA_ElementOrElementGroup + - symbol: StepFEA_ElementRepresentation + - symbol: StepFEA_ElementVolume + - symbol: StepFEA_EnumeratedDegreeOfFreedom + - symbol: StepFEA_FeaAreaDensity + - symbol: StepFEA_FeaAxis2Placement3d + - symbol: StepFEA_FeaCurveSectionGeometricRelationship + - symbol: StepFEA_FeaGroup + - symbol: StepFEA_FeaLinearElasticity + - symbol: StepFEA_FeaMassDensity + - symbol: StepFEA_FeaMaterialPropertyRepresentation + - symbol: StepFEA_FeaMaterialPropertyRepresentationItem + - symbol: StepFEA_FeaModel + - symbol: StepFEA_FeaModel3d + - symbol: StepFEA_FeaModelDefinition + - symbol: StepFEA_FeaMoistureAbsorption + - symbol: StepFEA_FeaParametricPoint + - symbol: StepFEA_FeaRepresentationItem + - symbol: StepFEA_FeaSecantCoefficientOfLinearThermalExpansion + - symbol: StepFEA_FeaShellBendingStiffness + - symbol: StepFEA_FeaShellMembraneBendingCouplingStiffness + - symbol: StepFEA_FeaShellMembraneStiffness + - symbol: StepFEA_FeaShellShearStiffness + - symbol: StepFEA_FeaSurfaceSectionGeometricRelationship + - symbol: StepFEA_FeaTangentialCoefficientOfLinearThermalExpansion + - symbol: StepFEA_FreedomAndCoefficient + - symbol: StepFEA_FreedomsList + - symbol: StepFEA_GeometricNode + - symbol: StepFEA_Node + - symbol: StepFEA_NodeDefinition + - symbol: StepFEA_NodeGroup + - symbol: StepFEA_NodeRepresentation + - symbol: StepFEA_NodeSet + - symbol: StepFEA_NodeWithSolutionCoordinateSystem + - symbol: StepFEA_NodeWithVector + - symbol: StepFEA_ParametricCurve3dElementCoordinateDirection + - symbol: StepFEA_ParametricCurve3dElementCoordinateSystem + - symbol: StepFEA_ParametricSurface3dElementCoordinateSystem + - symbol: StepFEA_Surface3dElementRepresentation + - symbol: StepFEA_SymmetricTensor22d + - symbol: StepFEA_SymmetricTensor23d + - symbol: StepFEA_SymmetricTensor23dMember + - symbol: StepFEA_SymmetricTensor42d + - symbol: StepFEA_SymmetricTensor43dMember + - symbol: StepFEA_UnspecifiedValue + - symbol: StepFEA_Volume3dElementRepresentation + - symbol: StepFile_ReadData + - symbol: StepGeom_Axis1Placement + - symbol: StepGeom_Axis2Placement + - symbol: StepGeom_Axis2Placement2d + - symbol: StepGeom_Axis2Placement3d + - symbol: StepGeom_BSplineCurve + - symbol: StepGeom_BSplineCurveForm + - symbol: StepGeom_BSplineCurveWithKnots + - symbol: StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve + - symbol: StepGeom_BSplineSurface + - symbol: StepGeom_BSplineSurfaceForm + - symbol: StepGeom_BSplineSurfaceWithKnots + - symbol: StepGeom_BSplineSurfaceWithKnotsAndRationalBSplineSurface + - symbol: StepGeom_BezierCurve + - symbol: StepGeom_BezierCurveAndRationalBSplineCurve + - symbol: StepGeom_BezierSurface + - symbol: StepGeom_BezierSurfaceAndRationalBSplineSurface + - symbol: StepGeom_BoundaryCurve + - symbol: StepGeom_BoundedCurve + - symbol: StepGeom_BoundedSurface + - symbol: StepGeom_CartesianPoint + - symbol: StepGeom_CartesianTransformationOperator + - symbol: StepGeom_CartesianTransformationOperator2d + - symbol: StepGeom_CartesianTransformationOperator3d + - symbol: StepGeom_Circle + - symbol: StepGeom_CompositeCurve + - symbol: StepGeom_CompositeCurveOnSurface + - symbol: StepGeom_CompositeCurveSegment + - symbol: StepGeom_Conic + - symbol: StepGeom_ConicalSurface + - symbol: StepGeom_Curve + - symbol: StepGeom_CurveBoundedSurface + - symbol: StepGeom_CurveOnSurface + - symbol: StepGeom_CurveReplica + - symbol: StepGeom_CylindricalSurface + - symbol: StepGeom_DegeneratePcurve + - symbol: StepGeom_DegenerateToroidalSurface + - symbol: StepGeom_Direction + - symbol: StepGeom_ElementarySurface + - symbol: StepGeom_Ellipse + - symbol: StepGeom_EvaluatedDegeneratePcurve + - symbol: StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx + - symbol: StepGeom_GeometricRepresentationContext + - symbol: StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext + - symbol: StepGeom_GeometricRepresentationContextAndParametricRepresentationContext + - symbol: StepGeom_GeometricRepresentationItem + - symbol: StepGeom_Hyperbola + - symbol: StepGeom_IntersectionCurve + - symbol: StepGeom_KnotType + - symbol: StepGeom_Line + - symbol: StepGeom_OffsetCurve3d + - symbol: StepGeom_OffsetSurface + - symbol: StepGeom_OrientedSurface + - symbol: StepGeom_OuterBoundaryCurve + - symbol: StepGeom_Parabola + - symbol: StepGeom_Pcurve + - symbol: StepGeom_PcurveOrSurface + - symbol: StepGeom_Placement + - symbol: StepGeom_Plane + - symbol: StepGeom_Point + - symbol: StepGeom_PointOnCurve + - symbol: StepGeom_PointOnSurface + - symbol: StepGeom_PointReplica + - symbol: StepGeom_Polyline + - symbol: StepGeom_PreferredSurfaceCurveRepresentation + - symbol: StepGeom_QuasiUniformCurve + - symbol: StepGeom_QuasiUniformCurveAndRationalBSplineCurve + - symbol: StepGeom_QuasiUniformSurface + - symbol: StepGeom_QuasiUniformSurfaceAndRationalBSplineSurface + - symbol: StepGeom_RationalBSplineCurve + - symbol: StepGeom_RationalBSplineSurface + - symbol: StepGeom_RectangularCompositeSurface + - symbol: StepGeom_RectangularTrimmedSurface + - symbol: StepGeom_ReparametrisedCompositeCurveSegment + - symbol: StepGeom_SeamCurve + - symbol: StepGeom_SphericalSurface + - symbol: StepGeom_SuParameters + - symbol: StepGeom_Surface + - symbol: StepGeom_SurfaceBoundary + - symbol: StepGeom_SurfaceCurve + - symbol: StepGeom_SurfaceCurveAndBoundedCurve + - symbol: StepGeom_SurfaceOfLinearExtrusion + - symbol: StepGeom_SurfaceOfRevolution + - symbol: StepGeom_SurfacePatch + - symbol: StepGeom_SurfaceReplica + - symbol: StepGeom_SweptSurface + - symbol: StepGeom_ToroidalSurface + - symbol: StepGeom_TransitionCode + - symbol: StepGeom_TrimmedCurve + - symbol: StepGeom_TrimmingMember + - symbol: StepGeom_TrimmingPreference + - symbol: StepGeom_TrimmingSelect + - symbol: StepGeom_UniformCurve + - symbol: StepGeom_UniformCurveAndRationalBSplineCurve + - symbol: StepGeom_UniformSurface + - symbol: StepGeom_UniformSurfaceAndRationalBSplineSurface + - symbol: StepGeom_Vector + - symbol: StepGeom_VectorOrDirection + - symbol: StepKinematics_ActuatedDirection + - symbol: StepKinematics_ActuatedKinPairAndOrderKinPair + - symbol: StepKinematics_ActuatedKinematicPair + - symbol: StepKinematics_ContextDependentKinematicLinkRepresentation + - symbol: StepKinematics_CylindricalPair + - symbol: StepKinematics_CylindricalPairValue + - symbol: StepKinematics_CylindricalPairWithRange + - symbol: StepKinematics_FullyConstrainedPair + - symbol: StepKinematics_GearPair + - symbol: StepKinematics_GearPairValue + - symbol: StepKinematics_GearPairWithRange + - symbol: StepKinematics_HighOrderKinematicPair + - symbol: StepKinematics_HomokineticPair + - symbol: StepKinematics_KinematicJoint + - symbol: StepKinematics_KinematicLink + - symbol: StepKinematics_KinematicLinkRepresentation + - symbol: StepKinematics_KinematicLinkRepresentationAssociation + - symbol: StepKinematics_KinematicPair + - symbol: StepKinematics_KinematicPropertyDefinitionRepresentation + - symbol: StepKinematics_KinematicPropertyMechanismRepresentation + - symbol: StepKinematics_KinematicTopologyDirectedStructure + - symbol: StepKinematics_KinematicTopologyNetworkStructure + - symbol: StepKinematics_KinematicTopologyRepresentationSelect + - symbol: StepKinematics_KinematicTopologyStructure + - symbol: StepKinematics_LinearFlexibleAndPinionPair + - symbol: StepKinematics_LinearFlexibleAndPlanarCurvePair + - symbol: StepKinematics_LinearFlexibleLinkRepresentation + - symbol: StepKinematics_LowOrderKinematicPair + - symbol: StepKinematics_LowOrderKinematicPairValue + - symbol: StepKinematics_LowOrderKinematicPairWithMotionCoupling + - symbol: StepKinematics_LowOrderKinematicPairWithRange + - symbol: StepKinematics_MechanismRepresentation + - symbol: StepKinematics_MechanismStateRepresentation + - symbol: StepKinematics_OrientedJoint + - symbol: StepKinematics_PairRepresentationRelationship + - symbol: StepKinematics_PairValue + - symbol: StepKinematics_PlanarCurvePair + - symbol: StepKinematics_PlanarCurvePairRange + - symbol: StepKinematics_PlanarPair + - symbol: StepKinematics_PlanarPairValue + - symbol: StepKinematics_PlanarPairWithRange + - symbol: StepKinematics_PointOnPlanarCurvePair + - symbol: StepKinematics_PointOnPlanarCurvePairValue + - symbol: StepKinematics_PointOnPlanarCurvePairWithRange + - symbol: StepKinematics_PointOnSurfacePair + - symbol: StepKinematics_PointOnSurfacePairValue + - symbol: StepKinematics_PointOnSurfacePairWithRange + - symbol: StepKinematics_PrismaticPair + - symbol: StepKinematics_PrismaticPairValue + - symbol: StepKinematics_PrismaticPairWithRange + - symbol: StepKinematics_ProductDefinitionKinematics + - symbol: StepKinematics_ProductDefinitionRelationshipKinematics + - symbol: StepKinematics_RackAndPinionPair + - symbol: StepKinematics_RackAndPinionPairValue + - symbol: StepKinematics_RackAndPinionPairWithRange + - symbol: StepKinematics_RevolutePair + - symbol: StepKinematics_RevolutePairValue + - symbol: StepKinematics_RevolutePairWithRange + - symbol: StepKinematics_RigidLinkRepresentation + - symbol: StepKinematics_RigidPlacement + - symbol: StepKinematics_RollingCurvePair + - symbol: StepKinematics_RollingCurvePairValue + - symbol: StepKinematics_RollingSurfacePair + - symbol: StepKinematics_RollingSurfacePairValue + - symbol: StepKinematics_RotationAboutDirection + - symbol: StepKinematics_ScrewPair + - symbol: StepKinematics_ScrewPairValue + - symbol: StepKinematics_ScrewPairWithRange + - symbol: StepKinematics_SlidingCurvePair + - symbol: StepKinematics_SlidingCurvePairValue + - symbol: StepKinematics_SlidingSurfacePair + - symbol: StepKinematics_SlidingSurfacePairValue + - symbol: StepKinematics_SpatialRotation + - symbol: StepKinematics_SphericalPair + - symbol: StepKinematics_SphericalPairSelect + - symbol: StepKinematics_SphericalPairValue + - symbol: StepKinematics_SphericalPairWithPin + - symbol: StepKinematics_SphericalPairWithPinAndRange + - symbol: StepKinematics_SphericalPairWithRange + - symbol: StepKinematics_SurfacePair + - symbol: StepKinematics_SurfacePairWithRange + - symbol: StepKinematics_UniversalPair + - symbol: StepKinematics_UniversalPairValue + - symbol: StepKinematics_UniversalPairWithRange + - symbol: StepRepr_AllAroundShapeAspect + - symbol: StepRepr_Apex + - symbol: StepRepr_AssemblyComponentUsage + - symbol: StepRepr_AssemblyComponentUsageSubstitute + - symbol: StepRepr_BetweenShapeAspect + - symbol: StepRepr_BooleanRepresentationItem + - symbol: StepRepr_CentreOfSymmetry + - symbol: StepRepr_CharacterizedDefinition + - symbol: StepRepr_CharacterizedRepresentation + - symbol: StepRepr_CompGroupShAspAndCompShAspAndDatumFeatAndShAsp + - symbol: StepRepr_CompShAspAndDatumFeatAndShAsp + - symbol: StepRepr_CompositeGroupShapeAspect + - symbol: StepRepr_CompositeShapeAspect + - symbol: StepRepr_CompoundRepresentationItem + - symbol: StepRepr_ConfigurationDesign + - symbol: StepRepr_ConfigurationDesignItem + - symbol: StepRepr_ConfigurationEffectivity + - symbol: StepRepr_ConfigurationItem + - symbol: StepRepr_ConstructiveGeometryRepresentation + - symbol: StepRepr_ConstructiveGeometryRepresentationRelationship + - symbol: StepRepr_ContinuosShapeAspect + - symbol: StepRepr_DataEnvironment + - symbol: StepRepr_DefinitionalRepresentation + - symbol: StepRepr_DerivedShapeAspect + - symbol: StepRepr_DescriptiveRepresentationItem + - symbol: StepRepr_Extension + - symbol: StepRepr_ExternallyDefinedRepresentation + - symbol: StepRepr_FeatureForDatumTargetRelationship + - symbol: StepRepr_FunctionallyDefinedTransformation + - symbol: StepRepr_GeometricAlignment + - symbol: StepRepr_GlobalUncertaintyAssignedContext + - symbol: StepRepr_GlobalUnitAssignedContext + - symbol: StepRepr_IntegerRepresentationItem + - symbol: StepRepr_ItemDefinedTransformation + - symbol: StepRepr_MakeFromUsageOption + - symbol: StepRepr_MappedItem + - symbol: StepRepr_MaterialDesignation + - symbol: StepRepr_MaterialProperty + - symbol: StepRepr_MaterialPropertyRepresentation + - symbol: StepRepr_MeasureRepresentationItem + - symbol: StepRepr_MechanicalDesignAndDraughtingRelationship + - symbol: StepRepr_NextAssemblyUsageOccurrence + - symbol: StepRepr_ParallelOffset + - symbol: StepRepr_ParametricRepresentationContext + - symbol: StepRepr_PerpendicularTo + - symbol: StepRepr_ProductConcept + - symbol: StepRepr_ProductDefinitionShape + - symbol: StepRepr_ProductDefinitionUsage + - symbol: StepRepr_PromissoryUsageOccurrence + - symbol: StepRepr_PropertyDefinition + - symbol: StepRepr_PropertyDefinitionRelationship + - symbol: StepRepr_PropertyDefinitionRepresentation + - symbol: StepRepr_QuantifiedAssemblyComponentUsage + - symbol: StepRepr_RealRepresentationItem + - symbol: StepRepr_ReprItemAndLengthMeasureWithUnit + - symbol: StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI + - symbol: StepRepr_ReprItemAndMeasureWithUnit + - symbol: StepRepr_ReprItemAndMeasureWithUnitAndQRI + - symbol: StepRepr_ReprItemAndPlaneAngleMeasureWithUnit + - symbol: StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI + - symbol: StepRepr_Representation + - symbol: StepRepr_RepresentationContext + - symbol: StepRepr_RepresentationContextReference + - symbol: StepRepr_RepresentationItem + - symbol: StepRepr_RepresentationMap + - symbol: StepRepr_RepresentationOrRepresentationReference + - symbol: StepRepr_RepresentationReference + - symbol: StepRepr_RepresentationRelationship + - symbol: StepRepr_RepresentationRelationshipWithTransformation + - symbol: StepRepr_RepresentedDefinition + - symbol: StepRepr_ShapeAspect + - symbol: StepRepr_ShapeAspectDerivingRelationship + - symbol: StepRepr_ShapeAspectRelationship + - symbol: StepRepr_ShapeAspectTransition + - symbol: StepRepr_ShapeDefinition + - symbol: StepRepr_ShapeRepresentationRelationship + - symbol: StepRepr_ShapeRepresentationRelationshipWithTransformation + - symbol: StepRepr_SpecifiedHigherUsageOccurrence + - symbol: StepRepr_StructuralResponseProperty + - symbol: StepRepr_StructuralResponsePropertyDefinitionRepresentation + - symbol: StepRepr_SuppliedPartRelationship + - symbol: StepRepr_Tangent + - symbol: StepRepr_Transformation + - symbol: StepRepr_ValueRange + - symbol: StepRepr_ValueRepresentationItem + - symbol: StepSelect_Activator + - symbol: StepSelect_FileModifier + - symbol: StepSelect_FloatFormat + - symbol: StepSelect_ModelModifier + - symbol: StepSelect_StepType + - symbol: StepSelect_WorkLibrary + - symbol: StepShape_AdvancedBrepShapeRepresentation + - symbol: StepShape_AdvancedFace + - symbol: StepShape_AngleRelator + - symbol: StepShape_AngularLocation + - symbol: StepShape_AngularSize + - symbol: StepShape_Block + - symbol: StepShape_BooleanOperand + - symbol: StepShape_BooleanOperator + - symbol: StepShape_BooleanResult + - symbol: StepShape_BoxDomain + - symbol: StepShape_BoxedHalfSpace + - symbol: StepShape_BrepWithVoids + - symbol: StepShape_ClosedShell + - symbol: StepShape_CompoundShapeRepresentation + - symbol: StepShape_ConnectedEdgeSet + - symbol: StepShape_ConnectedFaceSet + - symbol: StepShape_ConnectedFaceShapeRepresentation + - symbol: StepShape_ConnectedFaceSubSet + - symbol: StepShape_ContextDependentShapeRepresentation + - symbol: StepShape_CsgPrimitive + - symbol: StepShape_CsgSelect + - symbol: StepShape_CsgShapeRepresentation + - symbol: StepShape_CsgSolid + - symbol: StepShape_DefinitionalRepresentationAndShapeRepresentation + - symbol: StepShape_DimensionalCharacteristic + - symbol: StepShape_DimensionalCharacteristicRepresentation + - symbol: StepShape_DimensionalLocation + - symbol: StepShape_DimensionalLocationWithPath + - symbol: StepShape_DimensionalSize + - symbol: StepShape_DimensionalSizeWithPath + - symbol: StepShape_DirectedDimensionalLocation + - symbol: StepShape_Edge + - symbol: StepShape_EdgeBasedWireframeModel + - symbol: StepShape_EdgeBasedWireframeShapeRepresentation + - symbol: StepShape_EdgeCurve + - symbol: StepShape_EdgeLoop + - symbol: StepShape_ExtrudedAreaSolid + - symbol: StepShape_ExtrudedFaceSolid + - symbol: StepShape_Face + - symbol: StepShape_FaceBasedSurfaceModel + - symbol: StepShape_FaceBound + - symbol: StepShape_FaceOuterBound + - symbol: StepShape_FaceSurface + - symbol: StepShape_FacetedBrep + - symbol: StepShape_FacetedBrepAndBrepWithVoids + - symbol: StepShape_FacetedBrepShapeRepresentation + - symbol: StepShape_GeometricCurveSet + - symbol: StepShape_GeometricSet + - symbol: StepShape_GeometricSetSelect + - symbol: StepShape_GeometricallyBoundedSurfaceShapeRepresentation + - symbol: StepShape_GeometricallyBoundedWireframeShapeRepresentation + - symbol: StepShape_HalfSpaceSolid + - symbol: StepShape_LimitsAndFits + - symbol: StepShape_Loop + - symbol: StepShape_LoopAndPath + - symbol: StepShape_ManifoldSolidBrep + - symbol: StepShape_ManifoldSurfaceShapeRepresentation + - symbol: StepShape_MeasureQualification + - symbol: StepShape_MeasureRepresentationItemAndQualifiedRepresentationItem + - symbol: StepShape_NonManifoldSurfaceShapeRepresentation + - symbol: StepShape_OpenShell + - symbol: StepShape_OrientedClosedShell + - symbol: StepShape_OrientedEdge + - symbol: StepShape_OrientedFace + - symbol: StepShape_OrientedOpenShell + - symbol: StepShape_OrientedPath + - symbol: StepShape_Path + - symbol: StepShape_PlusMinusTolerance + - symbol: StepShape_PointRepresentation + - symbol: StepShape_PolyLoop + - symbol: StepShape_PrecisionQualifier + - symbol: StepShape_QualifiedRepresentationItem + - symbol: StepShape_ReversibleTopologyItem + - symbol: StepShape_RevolvedAreaSolid + - symbol: StepShape_RevolvedFaceSolid + - symbol: StepShape_RightAngularWedge + - symbol: StepShape_RightCircularCone + - symbol: StepShape_RightCircularCylinder + - symbol: StepShape_SeamEdge + - symbol: StepShape_ShapeDefinitionRepresentation + - symbol: StepShape_ShapeDimensionRepresentation + - symbol: StepShape_ShapeDimensionRepresentationItem + - symbol: StepShape_ShapeRepresentation + - symbol: StepShape_ShapeRepresentationWithParameters + - symbol: StepShape_Shell + - symbol: StepShape_ShellBasedSurfaceModel + - symbol: StepShape_SolidModel + - symbol: StepShape_SolidReplica + - symbol: StepShape_Sphere + - symbol: StepShape_Subedge + - symbol: StepShape_Subface + - symbol: StepShape_SurfaceModel + - symbol: StepShape_SweptAreaSolid + - symbol: StepShape_SweptFaceSolid + - symbol: StepShape_ToleranceMethodDefinition + - symbol: StepShape_ToleranceValue + - symbol: StepShape_TopologicalRepresentationItem + - symbol: StepShape_Torus + - symbol: StepShape_TransitionalShapeRepresentation + - symbol: StepShape_TypeQualifier + - symbol: StepShape_ValueFormatTypeQualifier + - symbol: StepShape_ValueQualifier + - symbol: StepShape_Vertex + - symbol: StepShape_VertexLoop + - symbol: StepShape_VertexPoint + - symbol: StepTidy_DuplicateCleaner + - symbol: StepToGeom + - symbol: StepToTopoDS + - symbol: StepToTopoDS_Builder + - symbol: StepToTopoDS_BuilderError + - symbol: StepToTopoDS_GeometricTool + - symbol: StepToTopoDS_GeometricToolError + - symbol: StepToTopoDS_MakeTransformed + - symbol: StepToTopoDS_NMTool + - symbol: StepToTopoDS_PointPair + - symbol: StepToTopoDS_Root + - symbol: StepToTopoDS_Tool + - symbol: StepToTopoDS_TranslateCompositeCurve + - symbol: StepToTopoDS_TranslateCurveBoundedSurface + - symbol: StepToTopoDS_TranslateEdge + - symbol: StepToTopoDS_TranslateEdgeError + - symbol: StepToTopoDS_TranslateEdgeLoop + - symbol: StepToTopoDS_TranslateEdgeLoopError + - symbol: StepToTopoDS_TranslateFaceError + - symbol: StepToTopoDS_TranslatePolyLoop + - symbol: StepToTopoDS_TranslatePolyLoopError + - symbol: StepToTopoDS_TranslateShell + - symbol: StepToTopoDS_TranslateShellError + - symbol: StepToTopoDS_TranslateSolid + - symbol: StepToTopoDS_TranslateSolidError + - symbol: StepToTopoDS_TranslateVertex + - symbol: StepToTopoDS_TranslateVertexError + - symbol: StepToTopoDS_TranslateVertexLoop + - symbol: StepToTopoDS_TranslateVertexLoopError + - symbol: StepVisual_AnnotationCurveOccurrence + - symbol: StepVisual_AnnotationCurveOccurrenceAndGeomReprItem + - symbol: StepVisual_AnnotationFillArea + - symbol: StepVisual_AnnotationFillAreaOccurrence + - symbol: StepVisual_AnnotationOccurrence + - symbol: StepVisual_AnnotationPlane + - symbol: StepVisual_AnnotationPlaneElement + - symbol: StepVisual_AnnotationText + - symbol: StepVisual_AnnotationTextOccurrence + - symbol: StepVisual_AreaInSet + - symbol: StepVisual_AreaOrView + - symbol: StepVisual_BackgroundColour + - symbol: StepVisual_BoxCharacteristicSelect + - symbol: StepVisual_CameraImage + - symbol: StepVisual_CameraImage2dWithScale + - symbol: StepVisual_CameraImage3dWithScale + - symbol: StepVisual_CameraModel + - symbol: StepVisual_CameraModelD2 + - symbol: StepVisual_CameraModelD3 + - symbol: StepVisual_CameraModelD3MultiClipping + - symbol: StepVisual_CameraModelD3MultiClippingInterectionSelect + - symbol: StepVisual_CameraModelD3MultiClippingIntersection + - symbol: StepVisual_CameraModelD3MultiClippingUnion + - symbol: StepVisual_CameraModelD3MultiClippingUnionSelect + - symbol: StepVisual_CameraUsage + - symbol: StepVisual_CentralOrParallel + - symbol: StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel + - symbol: StepVisual_Colour + - symbol: StepVisual_ColourRgb + - symbol: StepVisual_ColourSpecification + - symbol: StepVisual_ComplexTriangulatedFace + - symbol: StepVisual_ComplexTriangulatedSurfaceSet + - symbol: StepVisual_CompositeText + - symbol: StepVisual_CompositeTextWithExtent + - symbol: StepVisual_ContextDependentInvisibility + - symbol: StepVisual_ContextDependentOverRidingStyledItem + - symbol: StepVisual_CoordinatesList + - symbol: StepVisual_CubicBezierTessellatedEdge + - symbol: StepVisual_CubicBezierTriangulatedFace + - symbol: StepVisual_CurveStyle + - symbol: StepVisual_CurveStyleFont + - symbol: StepVisual_CurveStyleFontPattern + - symbol: StepVisual_CurveStyleFontSelect + - symbol: StepVisual_DirectionCountSelect + - symbol: StepVisual_DraughtingAnnotationOccurrence + - symbol: StepVisual_DraughtingCallout + - symbol: StepVisual_DraughtingCalloutElement + - symbol: StepVisual_DraughtingModel + - symbol: StepVisual_DraughtingPreDefinedColour + - symbol: StepVisual_DraughtingPreDefinedCurveFont + - symbol: StepVisual_EdgeOrCurve + - symbol: StepVisual_ExternallyDefinedCurveFont + - symbol: StepVisual_ExternallyDefinedTextFont + - symbol: StepVisual_FaceOrSurface + - symbol: StepVisual_FillAreaStyle + - symbol: StepVisual_FillAreaStyleColour + - symbol: StepVisual_FillStyleSelect + - symbol: StepVisual_FontSelect + - symbol: StepVisual_Invisibility + - symbol: StepVisual_InvisibilityContext + - symbol: StepVisual_InvisibleItem + - symbol: StepVisual_LayeredItem + - symbol: StepVisual_MarkerMember + - symbol: StepVisual_MarkerSelect + - symbol: StepVisual_MarkerType + - symbol: StepVisual_MechanicalDesignGeometricPresentationArea + - symbol: StepVisual_MechanicalDesignGeometricPresentationRepresentation + - symbol: StepVisual_NullStyle + - symbol: StepVisual_NullStyleMember + - symbol: StepVisual_OverRidingStyledItem + - symbol: StepVisual_PathOrCompositeCurve + - symbol: StepVisual_PlanarBox + - symbol: StepVisual_PlanarExtent + - symbol: StepVisual_PointStyle + - symbol: StepVisual_PreDefinedColour + - symbol: StepVisual_PreDefinedCurveFont + - symbol: StepVisual_PreDefinedItem + - symbol: StepVisual_PreDefinedTextFont + - symbol: StepVisual_PresentationArea + - symbol: StepVisual_PresentationLayerAssignment + - symbol: StepVisual_PresentationLayerUsage + - symbol: StepVisual_PresentationRepresentation + - symbol: StepVisual_PresentationRepresentationSelect + - symbol: StepVisual_PresentationSet + - symbol: StepVisual_PresentationSize + - symbol: StepVisual_PresentationSizeAssignmentSelect + - symbol: StepVisual_PresentationStyleAssignment + - symbol: StepVisual_PresentationStyleByContext + - symbol: StepVisual_PresentationStyleSelect + - symbol: StepVisual_PresentationView + - symbol: StepVisual_PresentedItem + - symbol: StepVisual_PresentedItemRepresentation + - symbol: StepVisual_RenderingPropertiesSelect + - symbol: StepVisual_RepositionedTessellatedGeometricSet + - symbol: StepVisual_RepositionedTessellatedItem + - symbol: StepVisual_ShadingSurfaceMethod + - symbol: StepVisual_StyleContextSelect + - symbol: StepVisual_StyledItem + - symbol: StepVisual_StyledItemTarget + - symbol: StepVisual_SurfaceSide + - symbol: StepVisual_SurfaceSideStyle + - symbol: StepVisual_SurfaceStyleBoundary + - symbol: StepVisual_SurfaceStyleControlGrid + - symbol: StepVisual_SurfaceStyleElementSelect + - symbol: StepVisual_SurfaceStyleFillArea + - symbol: StepVisual_SurfaceStyleParameterLine + - symbol: StepVisual_SurfaceStyleReflectanceAmbient + - symbol: StepVisual_SurfaceStyleReflectanceAmbientDiffuse + - symbol: StepVisual_SurfaceStyleReflectanceAmbientDiffuseSpecular + - symbol: StepVisual_SurfaceStyleRendering + - symbol: StepVisual_SurfaceStyleRenderingWithProperties + - symbol: StepVisual_SurfaceStyleSegmentationCurve + - symbol: StepVisual_SurfaceStyleSilhouette + - symbol: StepVisual_SurfaceStyleTransparent + - symbol: StepVisual_SurfaceStyleUsage + - symbol: StepVisual_Template + - symbol: StepVisual_TemplateInstance + - symbol: StepVisual_TessellatedAnnotationOccurrence + - symbol: StepVisual_TessellatedConnectingEdge + - symbol: StepVisual_TessellatedCurveSet + - symbol: StepVisual_TessellatedEdge + - symbol: StepVisual_TessellatedEdgeOrVertex + - symbol: StepVisual_TessellatedFace + - symbol: StepVisual_TessellatedGeometricSet + - symbol: StepVisual_TessellatedItem + - symbol: StepVisual_TessellatedPointSet + - symbol: StepVisual_TessellatedShapeRepresentation + - symbol: StepVisual_TessellatedShapeRepresentationWithAccuracyParameters + - symbol: StepVisual_TessellatedShell + - symbol: StepVisual_TessellatedSolid + - symbol: StepVisual_TessellatedStructuredItem + - symbol: StepVisual_TessellatedSurfaceSet + - symbol: StepVisual_TessellatedVertex + - symbol: StepVisual_TessellatedWire + - symbol: StepVisual_TextLiteral + - symbol: StepVisual_TextOrCharacter + - symbol: StepVisual_TextPath + - symbol: StepVisual_TextStyle + - symbol: StepVisual_TextStyleForDefinedFont + - symbol: StepVisual_TextStyleWithBoxCharacteristics + - symbol: StepVisual_TriangulatedFace + - symbol: StepVisual_TriangulatedSurfaceSet + - symbol: StepVisual_ViewVolume + - symbol: StlAPI + - symbol: StlAPI_Reader + - symbol: StlAPI_Writer + - symbol: Storage + - symbol: Storage_Bucket + - symbol: Storage_BucketIterator + - symbol: Storage_BucketOfPersistent + - symbol: Storage_CallBack + - symbol: Storage_Data + - symbol: Storage_DefaultCallBack + - symbol: Storage_Error + - symbol: Storage_HeaderData + - symbol: Storage_InternalData + - symbol: Storage_OpenMode + - symbol: Storage_Root + - symbol: Storage_RootData + - symbol: Storage_Schema + - symbol: Storage_SolveMode + - symbol: Storage_StreamExtCharParityError + - symbol: Storage_StreamFormatError + - symbol: Storage_StreamModeError + - symbol: Storage_StreamReadError + - symbol: Storage_StreamTypeMismatchError + - symbol: Storage_StreamUnknownTypeError + - symbol: Storage_StreamWriteError + - symbol: Storage_TypeData + - symbol: Storage_TypedCallBack + - symbol: Sweep_NumShape + - symbol: Sweep_NumShapeIterator + - symbol: Sweep_NumShapeTool + - symbol: TColStd_HPackedMapOfInteger + - symbol: TCollection + - symbol: TCollection_AsciiString + - symbol: TCollection_ExtendedString + - symbol: TCollection_HAsciiString + - symbol: TCollection_HExtendedString + - symbol: TDF + - symbol: TDF_Attribute + - symbol: TDF_AttributeDelta + - symbol: TDF_AttributeIterator + - symbol: TDF_ChildIDIterator + - symbol: TDF_ChildIterator + - symbol: TDF_ClosureMode + - symbol: TDF_ClosureTool + - symbol: TDF_ComparisonTool + - symbol: TDF_CopyLabel + - symbol: TDF_CopyTool + - symbol: TDF_Data + - symbol: TDF_DataSet + - symbol: TDF_DefaultDeltaOnModification + - symbol: TDF_DefaultDeltaOnRemoval + - symbol: TDF_Delta + - symbol: TDF_DeltaOnAddition + - symbol: TDF_DeltaOnForget + - symbol: TDF_DeltaOnModification + - symbol: TDF_DeltaOnRemoval + - symbol: TDF_DeltaOnResume + - symbol: TDF_IDFilter + - symbol: TDF_Label + - symbol: TDF_Reference + - symbol: TDF_RelocationTable + - symbol: TDF_TagSource + - symbol: TDF_Tool + - symbol: TDF_Transaction + - symbol: TDataStd + - symbol: TDataStd_AsciiString + - symbol: TDataStd_BooleanArray + - symbol: TDataStd_BooleanList + - symbol: TDataStd_ByteArray + - symbol: TDataStd_ChildNodeIterator + - symbol: TDataStd_Comment + - symbol: TDataStd_Current + - symbol: TDataStd_DeltaOnModificationOfByteArray + - symbol: TDataStd_DeltaOnModificationOfExtStringArray + - symbol: TDataStd_DeltaOnModificationOfIntArray + - symbol: TDataStd_DeltaOnModificationOfIntPackedMap + - symbol: TDataStd_DeltaOnModificationOfRealArray + - symbol: TDataStd_Directory + - symbol: TDataStd_Expression + - symbol: TDataStd_ExtStringArray + - symbol: TDataStd_ExtStringList + - symbol: TDataStd_GenericEmpty + - symbol: TDataStd_GenericExtString + - symbol: TDataStd_HDataMapOfStringByte + - symbol: TDataStd_HDataMapOfStringHArray1OfInteger + - symbol: TDataStd_HDataMapOfStringHArray1OfReal + - symbol: TDataStd_HDataMapOfStringInteger + - symbol: TDataStd_HDataMapOfStringReal + - symbol: TDataStd_HDataMapOfStringString + - symbol: TDataStd_IntPackedMap + - symbol: TDataStd_Integer + - symbol: TDataStd_IntegerArray + - symbol: TDataStd_IntegerList + - symbol: TDataStd_Name + - symbol: TDataStd_NamedData + - symbol: TDataStd_NoteBook + - symbol: TDataStd_Real + - symbol: TDataStd_RealArray + - symbol: TDataStd_RealEnum + - symbol: TDataStd_RealList + - symbol: TDataStd_ReferenceArray + - symbol: TDataStd_ReferenceList + - symbol: TDataStd_Relation + - symbol: TDataStd_Tick + - symbol: TDataStd_TreeNode + - symbol: TDataStd_UAttribute + - symbol: TDataStd_Variable + - symbol: TDataXtd + - symbol: TDataXtd_Axis + - symbol: TDataXtd_Constraint + - symbol: TDataXtd_ConstraintEnum + - symbol: TDataXtd_Geometry + - symbol: TDataXtd_GeometryEnum + - symbol: TDataXtd_Pattern + - symbol: TDataXtd_PatternStd + - symbol: TDataXtd_Placement + - symbol: TDataXtd_Plane + - symbol: TDataXtd_Point + - symbol: TDataXtd_Position + - symbol: TDataXtd_Presentation + - symbol: TDataXtd_Shape + - symbol: TDataXtd_Triangulation + - symbol: TDocStd + - symbol: TDocStd_Application + - symbol: TDocStd_ApplicationDelta + - symbol: TDocStd_CompoundDelta + - symbol: TDocStd_Context + - symbol: TDocStd_Document + - symbol: TDocStd_FormatVersion + - symbol: TDocStd_Modified + - symbol: TDocStd_MultiTransactionManager + - symbol: TDocStd_Owner + - symbol: TDocStd_PathParser + - symbol: TDocStd_XLink + - symbol: TDocStd_XLinkIterator + - symbol: TDocStd_XLinkRoot + - symbol: TDocStd_XLinkTool + - symbol: TFunction_Driver + - symbol: TFunction_DriverTable + - symbol: TFunction_ExecutionStatus + - symbol: TFunction_Function + - symbol: TFunction_GraphNode + - symbol: TFunction_IFunction + - symbol: TFunction_Iterator + - symbol: TFunction_Logbook + - symbol: TFunction_Scope + - symbol: TNaming + - symbol: TNaming_Builder + - symbol: TNaming_CopyShape + - symbol: TNaming_DeltaOnModification + - symbol: TNaming_DeltaOnRemoval + - symbol: TNaming_Evolution + - symbol: TNaming_Identifier + - symbol: TNaming_Iterator + - symbol: TNaming_IteratorOnShapesSet + - symbol: TNaming_Localizer + - symbol: TNaming_Name + - symbol: TNaming_NameType + - symbol: TNaming_NamedShape + - symbol: TNaming_Naming + - symbol: TNaming_NamingTool + - symbol: TNaming_NewShapeIterator + - symbol: TNaming_OldShapeIterator + - symbol: TNaming_RefShape + - symbol: TNaming_SameShapeIterator + - symbol: TNaming_Scope + - symbol: TNaming_Selector + - symbol: TNaming_ShapesSet + - symbol: TNaming_Tool + - symbol: TNaming_TranslateTool + - symbol: TNaming_Translator + - symbol: TNaming_UsedShapes + - symbol: TopAbs + - symbol: TopAbs_Orientation + - symbol: TopAbs_ShapeEnum + - symbol: TopAbs_State + - symbol: TopBas_TestInterference + - symbol: TopCnx_EdgeFaceTransition + - symbol: TopExp + - symbol: TopExp_Explorer + - symbol: TopLoc_Datum3D + - symbol: TopLoc_ItemLocation + - symbol: TopLoc_Location + - symbol: TopLoc_SListNodeOfItemLocation + - symbol: TopLoc_SListOfItemLocation + - symbol: TopTools + - symbol: TopTools_FormatVersion + - symbol: TopTools_LocationSet + - symbol: TopTools_ShapeMapHasher + - symbol: TopTools_ShapeSet + - symbol: TopTrans_CurveTransition + - symbol: TopTrans_SurfaceTransition + - symbol: TopoDSToStep + - symbol: TopoDSToStep_Builder + - symbol: TopoDSToStep_BuilderError + - symbol: TopoDSToStep_FacetedError + - symbol: TopoDSToStep_FacetedTool + - symbol: TopoDSToStep_MakeBrepWithVoids + - symbol: TopoDSToStep_MakeEdgeError + - symbol: TopoDSToStep_MakeFaceError + - symbol: TopoDSToStep_MakeFacetedBrep + - symbol: TopoDSToStep_MakeFacetedBrepAndBrepWithVoids + - symbol: TopoDSToStep_MakeGeometricCurveSet + - symbol: TopoDSToStep_MakeManifoldSolidBrep + - symbol: TopoDSToStep_MakeShellBasedSurfaceModel + - symbol: TopoDSToStep_MakeStepEdge + - symbol: TopoDSToStep_MakeStepFace + - symbol: TopoDSToStep_MakeStepVertex + - symbol: TopoDSToStep_MakeStepWire + - symbol: TopoDSToStep_MakeTessellatedItem + - symbol: TopoDSToStep_MakeVertexError + - symbol: TopoDSToStep_MakeWireError + - symbol: TopoDSToStep_Root + - symbol: TopoDSToStep_Tool + - symbol: TopoDSToStep_WireframeBuilder + - symbol: TopoDS_AlertAttribute + - symbol: TopoDS_AlertWithShape + - symbol: TopoDS_Builder + - symbol: TopoDS_CompSolid + - symbol: TopoDS_Compound + - symbol: TopoDS_Edge + - symbol: TopoDS_Face + - symbol: TopoDS_FrozenShape + - symbol: TopoDS_HShape + - symbol: TopoDS_Iterator + - symbol: TopoDS_LockedShape + - symbol: TopoDS_Shape + - symbol: TopoDS_Shell + - symbol: TopoDS_Solid + - symbol: TopoDS_TCompSolid + - symbol: TopoDS_TCompound + - symbol: TopoDS_TEdge + - symbol: TopoDS_TFace + - symbol: TopoDS_TShape + - symbol: TopoDS_TShell + - symbol: TopoDS_TSolid + - symbol: TopoDS_TVertex + - symbol: TopoDS_TWire + - symbol: TopoDS_UnCompatibleShapes + - symbol: TopoDS_Vertex + - symbol: TopoDS_Wire + - symbol: TransferBRep_BinderOfShape + - symbol: TransferBRep_Reader + - symbol: TransferBRep_ShapeBinder + - symbol: TransferBRep_ShapeInfo + - symbol: TransferBRep_ShapeListBinder + - symbol: TransferBRep_ShapeMapper + - symbol: TransferBRep_TransferResultInfo + - symbol: Transfer_ActorDispatch + - symbol: Transfer_ActorOfFinderProcess + - symbol: Transfer_ActorOfProcessForFinder + - symbol: Transfer_ActorOfProcessForTransient + - symbol: Transfer_ActorOfTransientProcess + - symbol: Transfer_Binder + - symbol: Transfer_BinderOfTransientInteger + - symbol: Transfer_DataInfo + - symbol: Transfer_DispatchControl + - symbol: Transfer_FindHasher + - symbol: Transfer_Finder + - symbol: Transfer_FinderProcess + - symbol: Transfer_IteratorOfProcessForFinder + - symbol: Transfer_IteratorOfProcessForTransient + - symbol: Transfer_MapContainer + - symbol: Transfer_MultipleBinder + - symbol: Transfer_ProcessForFinder + - symbol: Transfer_ProcessForTransient + - symbol: Transfer_ResultFromModel + - symbol: Transfer_ResultFromTransient + - symbol: Transfer_SimpleBinderOfTransient + - symbol: Transfer_StatusExec + - symbol: Transfer_StatusResult + - symbol: Transfer_TransferDeadLoop + - symbol: Transfer_TransferDispatch + - symbol: Transfer_TransferFailure + - symbol: Transfer_TransferInput + - symbol: Transfer_TransferIterator + - symbol: Transfer_TransferOutput + - symbol: Transfer_TransientListBinder + - symbol: Transfer_TransientMapper + - symbol: Transfer_TransientProcess + - symbol: Transfer_UndefMode + - symbol: Transfer_VoidBinder + - symbol: Units + - symbol: UnitsAPI + - symbol: UnitsAPI_SystemUnits + - symbol: UnitsMethods + - symbol: UnitsMethods_LengthUnit + - symbol: Units_Dimensions + - symbol: Units_Explorer + - symbol: Units_Lexicon + - symbol: Units_MathSentence + - symbol: Units_Measurement + - symbol: Units_NoSuchType + - symbol: Units_NoSuchUnit + - symbol: Units_Quantity + - symbol: Units_Sentence + - symbol: Units_ShiftedToken + - symbol: Units_ShiftedUnit + - symbol: Units_Token + - symbol: Units_Unit + - symbol: Units_UnitSentence + - symbol: Units_UnitsDictionary + - symbol: Units_UnitsLexicon + - symbol: Units_UnitsSystem + - symbol: XCAFApp_Application + - symbol: XCAFDimTolObjects_AngularQualifier + - symbol: XCAFDimTolObjects_DatumModifWithValue + - symbol: XCAFDimTolObjects_DatumObject + - symbol: XCAFDimTolObjects_DatumSingleModif + - symbol: XCAFDimTolObjects_DatumTargetType + - symbol: XCAFDimTolObjects_DimensionFormVariance + - symbol: XCAFDimTolObjects_DimensionGrade + - symbol: XCAFDimTolObjects_DimensionModif + - symbol: XCAFDimTolObjects_DimensionObject + - symbol: XCAFDimTolObjects_DimensionQualifier + - symbol: XCAFDimTolObjects_DimensionType + - symbol: XCAFDimTolObjects_GeomToleranceMatReqModif + - symbol: XCAFDimTolObjects_GeomToleranceModif + - symbol: XCAFDimTolObjects_GeomToleranceObject + - symbol: XCAFDimTolObjects_GeomToleranceType + - symbol: XCAFDimTolObjects_GeomToleranceTypeValue + - symbol: XCAFDimTolObjects_GeomToleranceZoneModif + - symbol: XCAFDimTolObjects_ToleranceZoneAffectedPlane + - symbol: XCAFDimTolObjects_Tool + - symbol: XCAFDoc + - symbol: XCAFDoc_Area + - symbol: XCAFDoc_AssemblyGraph + - symbol: XCAFDoc_AssemblyGraph_Iterator + - symbol: XCAFDoc_AssemblyItemId + - symbol: XCAFDoc_AssemblyItemRef + - symbol: XCAFDoc_AssemblyIterator + - symbol: XCAFDoc_AssemblyTool + - symbol: XCAFDoc_Centroid + - symbol: XCAFDoc_ClippingPlaneTool + - symbol: XCAFDoc_Color + - symbol: XCAFDoc_ColorTool + - symbol: XCAFDoc_ColorType + - symbol: XCAFDoc_Datum + - symbol: XCAFDoc_DimTol + - symbol: XCAFDoc_DimTolTool + - symbol: XCAFDoc_Dimension + - symbol: XCAFDoc_DocumentTool + - symbol: XCAFDoc_Editor + - symbol: XCAFDoc_GeomTolerance + - symbol: XCAFDoc_GraphNode + - symbol: XCAFDoc_LayerTool + - symbol: XCAFDoc_LengthUnit + - symbol: XCAFDoc_Location + - symbol: XCAFDoc_Material + - symbol: XCAFDoc_MaterialTool + - symbol: XCAFDoc_Note + - symbol: XCAFDoc_NoteBalloon + - symbol: XCAFDoc_NoteBinData + - symbol: XCAFDoc_NoteComment + - symbol: XCAFDoc_NotesTool + - symbol: XCAFDoc_ShapeMapTool + - symbol: XCAFDoc_ShapeTool + - symbol: XCAFDoc_View + - symbol: XCAFDoc_ViewTool + - symbol: XCAFDoc_VisMaterial + - symbol: XCAFDoc_VisMaterialCommon + - symbol: XCAFDoc_VisMaterialPBR + - symbol: XCAFDoc_VisMaterialTool + - symbol: XCAFDoc_Volume + - symbol: XCAFNoteObjects_NoteObject + - symbol: XCAFPrs + - symbol: XCAFPrs_DocumentExplorer + - symbol: XCAFPrs_DocumentIdIterator + - symbol: XCAFPrs_DocumentNode + - symbol: XCAFPrs_Style + - symbol: XCAFView_Object + - symbol: XCAFView_ProjectionType + - symbol: XSAlgo + - symbol: XSAlgo_AlgoContainer + - symbol: XSControl + - symbol: XSControl_ConnectedShapes + - symbol: XSControl_Controller + - symbol: XSControl_FuncShape + - symbol: XSControl_Functions + - symbol: XSControl_Reader + - symbol: XSControl_SelectForTransfer + - symbol: XSControl_SignTransferStatus + - symbol: XSControl_TransferReader + - symbol: XSControl_TransferWriter + - symbol: XSControl_Utils + - symbol: XSControl_Vars + - symbol: XSControl_WorkSession + - symbol: XSControl_WorkSessionMap + - symbol: XSControl_Writer + - symbol: gce_ErrorType + - symbol: gce_MakeCirc + - symbol: gce_MakeCirc2d + - symbol: gce_MakeCone + - symbol: gce_MakeCylinder + - symbol: gce_MakeDir + - symbol: gce_MakeDir2d + - symbol: gce_MakeElips + - symbol: gce_MakeElips2d + - symbol: gce_MakeHypr + - symbol: gce_MakeHypr2d + - symbol: gce_MakeLin + - symbol: gce_MakeLin2d + - symbol: gce_MakeMirror + - symbol: gce_MakeMirror2d + - symbol: gce_MakeParab + - symbol: gce_MakeParab2d + - symbol: gce_MakePln + - symbol: gce_MakeRotation + - symbol: gce_MakeRotation2d + - symbol: gce_MakeScale + - symbol: gce_MakeScale2d + - symbol: gce_MakeTranslation + - symbol: gce_MakeTranslation2d + - symbol: gce_Root + - symbol: gp + - symbol: gp_Ax1 + - symbol: gp_Ax2 + - symbol: gp_Ax22d + - symbol: gp_Ax2d + - symbol: gp_Ax3 + - symbol: gp_Circ + - symbol: gp_Circ2d + - symbol: gp_Cone + - symbol: gp_Cylinder + - symbol: gp_Dir + - symbol: gp_Dir2d + - symbol: gp_Elips + - symbol: gp_Elips2d + - symbol: gp_EulerSequence + - symbol: gp_GTrsf + - symbol: gp_GTrsf2d + - symbol: gp_Hypr + - symbol: gp_Hypr2d + - symbol: gp_Lin + - symbol: gp_Lin2d + - symbol: gp_Mat + - symbol: gp_Mat2d + - symbol: gp_Parab + - symbol: gp_Parab2d + - symbol: gp_Pln + - symbol: gp_Pnt + - symbol: gp_Pnt2d + - symbol: gp_Quaternion + - symbol: gp_QuaternionNLerp + - symbol: gp_QuaternionSLerp + - symbol: gp_Sphere + - symbol: gp_Torus + - symbol: gp_Trsf + - symbol: gp_Trsf2d + - symbol: gp_TrsfForm + - symbol: gp_Vec + - symbol: gp_Vec2d + - symbol: gp_XY + - symbol: gp_XYZ + - symbol: math + - symbol: math_BFGS + - symbol: math_BissecNewton + - symbol: math_BracketMinimum + - symbol: math_BracketedRoot + - symbol: math_BrentMinimum + - symbol: math_BullardGenerator + - symbol: math_ComputeGaussPointsAndWeights + - symbol: math_ComputeKronrodPointsAndWeights + - symbol: math_Crout + - symbol: math_DirectPolynomialRoots + - symbol: math_DoubleTab + - symbol: math_EigenValuesSearcher + - symbol: math_FRPR + - symbol: math_Function + - symbol: math_FunctionAllRoots + - symbol: math_FunctionRoot + - symbol: math_FunctionRoots + - symbol: math_FunctionSample + - symbol: math_FunctionSet + - symbol: math_FunctionSetRoot + - symbol: math_FunctionSetWithDerivatives + - symbol: math_FunctionWithDerivative + - symbol: math_Gauss + - symbol: math_GaussLeastSquare + - symbol: math_GaussMultipleIntegration + - symbol: math_GaussSetIntegration + - symbol: math_GaussSingleIntegration + - symbol: math_GlobOptMin + - symbol: math_Jacobi + - symbol: math_KronrodSingleIntegration + - symbol: math_Matrix + - symbol: math_MultipleVarFunction + - symbol: math_MultipleVarFunctionWithGradient + - symbol: math_MultipleVarFunctionWithHessian + - symbol: math_NewtonFunctionRoot + - symbol: math_NotSquare + - symbol: math_PSO + - symbol: math_PSOParticlesPool + - symbol: math_Powell + - symbol: math_SVD + - symbol: math_SingularMatrix + - symbol: math_Status + - symbol: math_TrigonometricEquationFunction + - symbol: math_TrigonometricFunctionRoots + - symbol: math_Uzawa + - symbol: math_ValueAndWeight + additionalBindCode: | + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + struct TopoDS_Cast {}; + using namespace emscripten; + EMSCRIPTEN_BINDINGS(ocjs_additional) { + function("FairCurve_Batten_Compute", optional_override([](FairCurve_Batten& self, int nbIter, double tol) -> int { + FairCurve_AnalysisCode code; + self.Compute(code, nbIter, tol); + return static_cast(code); + })); + function("FairCurve_MinimalVariation_Compute", optional_override([](FairCurve_MinimalVariation& self, int nbIter, double tol) -> int { + FairCurve_AnalysisCode code; + self.Compute(code, nbIter, tol); + return static_cast(code); + })); + class_("TopoDS_Cast") + .class_function("Edge", optional_override([](const TopoDS_Shape& s) -> TopoDS_Edge { return TopoDS::Edge(s); })) + .class_function("Wire", optional_override([](const TopoDS_Shape& s) -> TopoDS_Wire { return TopoDS::Wire(s); })) + .class_function("Face", optional_override([](const TopoDS_Shape& s) -> TopoDS_Face { return TopoDS::Face(s); })) + .class_function("Vertex", optional_override([](const TopoDS_Shape& s) -> TopoDS_Vertex { return TopoDS::Vertex(s); })) + .class_function("Shell", optional_override([](const TopoDS_Shape& s) -> TopoDS_Shell { return TopoDS::Shell(s); })) + .class_function("Solid", optional_override([](const TopoDS_Shape& s) -> TopoDS_Solid { return TopoDS::Solid(s); })) + .class_function("Compound", optional_override([](const TopoDS_Shape& s) -> TopoDS_Compound { return TopoDS::Compound(s); })) + ; + } + emccFlags: + - -fwasm-exceptions + - -sEXPORT_EXCEPTION_HANDLING_HELPERS + - -sEXPORT_ES6=1 + - -sMODULARIZE + - -sALLOW_MEMORY_GROWTH=1 + - -sEXPORTED_RUNTIME_METHODS=["FS"] + - -sINITIAL_MEMORY=128MB + - -sMAXIMUM_MEMORY=4GB + - -sUSE_FREETYPE=1 + - -sERROR_ON_UNDEFINED_SYMBOLS=0 + - --no-entry + - -Wl,--allow-undefined + - --emit-symbol-map + - -sSTACK_SIZE=8388608 + - -sWASM_BIGINT + - -sEVAL_CTORS=2 + - -msimd128 + - -O3 diff --git a/build-configs/full_multi.yml b/build-configs/full_multi.yml new file mode 100644 index 00000000..93d6e7a8 --- /dev/null +++ b/build-configs/full_multi.yml @@ -0,0 +1,4500 @@ +mainBuild: + name: opencascade_full_multi.js + bindings: + - symbol: APIHeaderSection_EditHeader + - symbol: APIHeaderSection_MakeHeader + - symbol: Adaptor2d_Curve2d + - symbol: Adaptor2d_Line2d + - symbol: Adaptor2d_OffsetCurve + - symbol: Adaptor3d_Curve + - symbol: Adaptor3d_CurveOnSurface + - symbol: Adaptor3d_HSurfaceTool + - symbol: Adaptor3d_HVertex + - symbol: Adaptor3d_InterFunc + - symbol: Adaptor3d_IsoCurve + - symbol: Adaptor3d_Surface + - symbol: Adaptor3d_TopolTool + - symbol: AdvApprox_ApproxAFunction + - symbol: AdvApprox_Cutting + - symbol: AdvApprox_DichoCutting + - symbol: AdvApprox_EvaluatorFunction + - symbol: AdvApprox_PrefAndRec + - symbol: AdvApprox_PrefCutting + - symbol: AdvApprox_SimpleApprox + - symbol: AppBlend_Approx + - symbol: AppCont_Function + - symbol: AppCont_LeastSquare + - symbol: AppParCurves + - symbol: AppParCurves_Constraint + - symbol: AppParCurves_ConstraintCouple + - symbol: AppParCurves_MultiBSpCurve + - symbol: AppParCurves_MultiCurve + - symbol: AppParCurves_MultiPoint + - symbol: AppStdL_Application + - symbol: AppStd_Application + - symbol: ApproxInt_KnotTools + - symbol: ApproxInt_SvSurfaces + - symbol: Approx_BSplineApproxInterp + - symbol: Approx_Curve2d + - symbol: Approx_Curve3d + - symbol: Approx_CurveOnSurface + - symbol: Approx_CurvilinearParameter + - symbol: Approx_CurvlinFunc + - symbol: Approx_FitAndDivide + - symbol: Approx_FitAndDivide2d + - symbol: Approx_MCurvesToBSpCurve + - symbol: Approx_ParametrizationType + - symbol: Approx_SameParameter + - symbol: Approx_Status + - symbol: Approx_SweepApproximation + - symbol: Approx_SweepFunction + - symbol: BOPAlgo_AlertAcquiredSelfIntersection + - symbol: BOPAlgo_AlertBOPNotAllowed + - symbol: BOPAlgo_AlertBOPNotSet + - symbol: BOPAlgo_AlertBadPositioning + - symbol: BOPAlgo_AlertBuilderFailed + - symbol: BOPAlgo_AlertBuildingPCurveFailed + - symbol: BOPAlgo_AlertEmptyShape + - symbol: BOPAlgo_AlertFaceBuilderUnusedEdges + - symbol: BOPAlgo_AlertIntersectionFailed + - symbol: BOPAlgo_AlertIntersectionOfPairOfShapesFailed + - symbol: BOPAlgo_AlertMultiDimensionalArguments + - symbol: BOPAlgo_AlertMultipleArguments + - symbol: BOPAlgo_AlertNoFacesToRemove + - symbol: BOPAlgo_AlertNoFiller + - symbol: BOPAlgo_AlertNoPeriodicityRequired + - symbol: BOPAlgo_AlertNotSplittableEdge + - symbol: BOPAlgo_AlertNullInputShapes + - symbol: BOPAlgo_AlertPostTreatFF + - symbol: BOPAlgo_AlertRemovalOfIBForEdgesFailed + - symbol: BOPAlgo_AlertRemovalOfIBForFacesFailed + - symbol: BOPAlgo_AlertRemovalOfIBForMDimShapes + - symbol: BOPAlgo_AlertRemovalOfIBForSolidsFailed + - symbol: BOPAlgo_AlertRemoveFeaturesFailed + - symbol: BOPAlgo_AlertSelfInterferingShape + - symbol: BOPAlgo_AlertShapeIsNotPeriodic + - symbol: BOPAlgo_AlertShellSplitterFailed + - symbol: BOPAlgo_AlertSolidBuilderFailed + - symbol: BOPAlgo_AlertSolidBuilderUnusedFaces + - symbol: BOPAlgo_AlertTooFewArguments + - symbol: BOPAlgo_AlertTooSmallEdge + - symbol: BOPAlgo_AlertUnableToGlue + - symbol: BOPAlgo_AlertUnableToMakeClosedEdgeOnFace + - symbol: BOPAlgo_AlertUnableToMakeIdentical + - symbol: BOPAlgo_AlertUnableToMakePeriodic + - symbol: BOPAlgo_AlertUnableToOrientTheShape + - symbol: BOPAlgo_AlertUnableToRemoveTheFeature + - symbol: BOPAlgo_AlertUnableToRepeat + - symbol: BOPAlgo_AlertUnableToTrim + - symbol: BOPAlgo_AlertUnknownShape + - symbol: BOPAlgo_AlertUnsupportedType + - symbol: BOPAlgo_AlertUserBreak + - symbol: BOPAlgo_Algo + - symbol: BOPAlgo_ArgumentAnalyzer + - symbol: BOPAlgo_BOP + - symbol: BOPAlgo_Builder + - symbol: BOPAlgo_BuilderArea + - symbol: BOPAlgo_BuilderFace + - symbol: BOPAlgo_BuilderShape + - symbol: BOPAlgo_BuilderSolid + - symbol: BOPAlgo_CellsBuilder + - symbol: BOPAlgo_CheckResult + - symbol: BOPAlgo_CheckStatus + - symbol: BOPAlgo_CheckerSI + - symbol: BOPAlgo_EdgeInfo + - symbol: BOPAlgo_GlueEnum + - symbol: BOPAlgo_MakeConnected + - symbol: BOPAlgo_MakePeriodic + - symbol: BOPAlgo_MakePeriodic_PeriodicityParams + - symbol: BOPAlgo_MakerVolume + - symbol: BOPAlgo_Operation + - symbol: BOPAlgo_Options + - symbol: BOPAlgo_PISteps + - symbol: BOPAlgo_ParallelAlgo + - symbol: BOPAlgo_RemoveFeatures + - symbol: BOPAlgo_Section + - symbol: BOPAlgo_SectionAttribute + - symbol: BOPAlgo_ShellSplitter + - symbol: BOPAlgo_Splitter + - symbol: BOPAlgo_Tools + - symbol: BOPAlgo_ToolsProvider + - symbol: BOPAlgo_WireEdgeSet + - symbol: BOPAlgo_WireSplitter + - symbol: BOPDS_CommonBlock + - symbol: BOPDS_CoupleOfPaveBlocks + - symbol: BOPDS_Curve + - symbol: BOPDS_DS + - symbol: BOPDS_FaceInfo + - symbol: BOPDS_IndexRange + - symbol: BOPDS_Interf + - symbol: BOPDS_InterfEE + - symbol: BOPDS_InterfEF + - symbol: BOPDS_InterfEZ + - symbol: BOPDS_InterfFF + - symbol: BOPDS_InterfFZ + - symbol: BOPDS_InterfVE + - symbol: BOPDS_InterfVF + - symbol: BOPDS_InterfVV + - symbol: BOPDS_InterfVZ + - symbol: BOPDS_InterfZZ + - symbol: BOPDS_Pair + - symbol: BOPDS_Pave + - symbol: BOPDS_PaveBlock + - symbol: BOPDS_Point + - symbol: BOPDS_ShapeInfo + - symbol: BOPDS_SubIterator + - symbol: BOPDS_Tools + - symbol: BOPTools_AlgoTools + - symbol: BOPTools_AlgoTools2D + - symbol: BOPTools_AlgoTools3D + - symbol: BOPTools_ConnexityBlock + - symbol: BOPTools_CoupleOfShape + - symbol: BOPTools_Set + - symbol: BRepAdaptor_CompCurve + - symbol: BRepAdaptor_Curve + - symbol: BRepAdaptor_Curve2d + - symbol: BRepAdaptor_Surface + - symbol: BRepAlgo + - symbol: BRepAlgoAPI_Algo + - symbol: BRepAlgoAPI_BooleanOperation + - symbol: BRepAlgoAPI_BuilderAlgo + - symbol: BRepAlgoAPI_Check + - symbol: BRepAlgoAPI_Common + - symbol: BRepAlgoAPI_Cut + - symbol: BRepAlgoAPI_Defeaturing + - symbol: BRepAlgoAPI_Fuse + - symbol: BRepAlgoAPI_Section + - symbol: BRepAlgoAPI_Splitter + - symbol: BRepAlgo_AsDes + - symbol: BRepAlgo_FaceRestrictor + - symbol: BRepAlgo_Image + - symbol: BRepAlgo_Loop + - symbol: BRepAlgo_NormalProjection + - symbol: BRepApprox_ApproxLine + - symbol: BRepApprox_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_MyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_MyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_MyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_ParFunctionOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_ParFunctionOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_ParLeastSquareOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_SurfaceTool + - symbol: BRepApprox_TheImpPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheInt2SOfThePrmPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheMultiLineOfApprox + - symbol: BRepApprox_TheMultiLineToolOfApprox + - symbol: BRepApprox_ThePrmPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheZerImpFuncOfTheImpPrmSvSurfacesOfApprox + - symbol: BRepBlend_AppFunc + - symbol: BRepBlend_AppFuncRoot + - symbol: BRepBlend_AppFuncRst + - symbol: BRepBlend_AppFuncRstRst + - symbol: BRepBlend_AppSurf + - symbol: BRepBlend_AppSurface + - symbol: BRepBlend_BlendTool + - symbol: BRepBlend_CSWalking + - symbol: BRepBlend_CurvPointRadInv + - symbol: BRepBlend_Extremity + - symbol: BRepBlend_HCurve2dTool + - symbol: BRepBlend_HCurveTool + - symbol: BRepBlend_Line + - symbol: BRepBlend_PointOnRst + - symbol: BRepBlend_RstRstConstRad + - symbol: BRepBlend_RstRstEvolRad + - symbol: BRepBlend_RstRstLineBuilder + - symbol: BRepBlend_SurfCurvConstRadInv + - symbol: BRepBlend_SurfCurvEvolRadInv + - symbol: BRepBlend_SurfPointConstRadInv + - symbol: BRepBlend_SurfPointEvolRadInv + - symbol: BRepBlend_SurfRstConstRad + - symbol: BRepBlend_SurfRstEvolRad + - symbol: BRepBlend_SurfRstLineBuilder + - symbol: BRepBndLib + - symbol: BRepBuilderAPI + - symbol: BRepBuilderAPI_BndBoxTreeSelector + - symbol: BRepBuilderAPI_Collect + - symbol: BRepBuilderAPI_Command + - symbol: BRepBuilderAPI_Copy + - symbol: BRepBuilderAPI_EdgeError + - symbol: BRepBuilderAPI_FaceError + - symbol: BRepBuilderAPI_FastSewing + - symbol: BRepBuilderAPI_FindPlane + - symbol: BRepBuilderAPI_GTransform + - symbol: BRepBuilderAPI_MakeEdge + - symbol: BRepBuilderAPI_MakeEdge2d + - symbol: BRepBuilderAPI_MakeFace + - symbol: BRepBuilderAPI_MakePolygon + - symbol: BRepBuilderAPI_MakeShape + - symbol: BRepBuilderAPI_MakeShapeOnMesh + - symbol: BRepBuilderAPI_MakeShell + - symbol: BRepBuilderAPI_MakeSolid + - symbol: BRepBuilderAPI_MakeVertex + - symbol: BRepBuilderAPI_MakeWire + - symbol: BRepBuilderAPI_ModifyShape + - symbol: BRepBuilderAPI_NurbsConvert + - symbol: BRepBuilderAPI_PipeError + - symbol: BRepBuilderAPI_Sewing + - symbol: BRepBuilderAPI_ShapeModification + - symbol: BRepBuilderAPI_ShellError + - symbol: BRepBuilderAPI_Transform + - symbol: BRepBuilderAPI_TransitionMode + - symbol: BRepBuilderAPI_VertexInspector + - symbol: BRepBuilderAPI_WireError + - symbol: BRepCheck + - symbol: BRepCheck_Analyzer + - symbol: BRepCheck_Edge + - symbol: BRepCheck_Face + - symbol: BRepCheck_Result + - symbol: BRepCheck_Shell + - symbol: BRepCheck_Solid + - symbol: BRepCheck_Status + - symbol: BRepCheck_Vertex + - symbol: BRepCheck_Wire + - symbol: BRepClass3d + - symbol: BRepClass3d_BndBoxTreeSelectorLine + - symbol: BRepClass3d_BndBoxTreeSelectorPoint + - symbol: BRepClass3d_Intersector3d + - symbol: BRepClass3d_SClassifier + - symbol: BRepClass3d_SolidClassifier + - symbol: BRepClass3d_SolidExplorer + - symbol: BRepClass3d_SolidPassiveClassifier + - symbol: BRepClass_Edge + - symbol: BRepClass_FClass2dOfFClassifier + - symbol: BRepClass_FClassifier + - symbol: BRepClass_FaceClassifier + - symbol: BRepClass_FacePassiveClassifier + - symbol: BRepClass_Intersector + - symbol: BRepExtrema_DistShapeShape + - symbol: BRepExtrema_DistanceSS + - symbol: BRepExtrema_ElementFilter + - symbol: BRepExtrema_ExtCC + - symbol: BRepExtrema_ExtCF + - symbol: BRepExtrema_ExtFF + - symbol: BRepExtrema_ExtPC + - symbol: BRepExtrema_ExtPF + - symbol: BRepExtrema_OverlapTool + - symbol: BRepExtrema_Poly + - symbol: BRepExtrema_ProximityDistTool_PrjState + - symbol: BRepExtrema_SelfIntersection + - symbol: BRepExtrema_ShapeProximity + - symbol: BRepExtrema_SolutionElem + - symbol: BRepExtrema_SupportType + - symbol: BRepExtrema_TriangleSet + - symbol: BRepExtrema_UnCompatibleShape + - symbol: BRepExtrema_VertexInspector + - symbol: BRepFeat_Builder + - symbol: BRepFeat_Form + - symbol: BRepFeat_Gluer + - symbol: BRepFeat_MakeCylindricalHole + - symbol: BRepFeat_MakeDPrism + - symbol: BRepFeat_MakePipe + - symbol: BRepFeat_MakePrism + - symbol: BRepFeat_MakeRevol + - symbol: BRepFeat_PerfSelection + - symbol: BRepFeat_RibSlot + - symbol: BRepFeat_SplitShape + - symbol: BRepFeat_Status + - symbol: BRepFeat_StatusError + - symbol: BRepFill + - symbol: BRepFill_ACRLaw + - symbol: BRepFill_AdvancedEvolved + - symbol: BRepFill_ApproxSeewing + - symbol: BRepFill_CompatibleWires + - symbol: BRepFill_ComputeCLine + - symbol: BRepFill_CurveConstraint + - symbol: BRepFill_Draft + - symbol: BRepFill_DraftLaw + - symbol: BRepFill_Edge3DLaw + - symbol: BRepFill_EdgeFaceAndOrder + - symbol: BRepFill_EdgeOnSurfLaw + - symbol: BRepFill_Evolved + - symbol: BRepFill_FaceAndOrder + - symbol: BRepFill_Filling + - symbol: BRepFill_Generator + - symbol: BRepFill_LocationLaw + - symbol: BRepFill_MultiLine + - symbol: BRepFill_NSections + - symbol: BRepFill_OffsetAncestors + - symbol: BRepFill_OffsetWire + - symbol: BRepFill_Pipe + - symbol: BRepFill_PipeShell + - symbol: BRepFill_Section + - symbol: BRepFill_SectionLaw + - symbol: BRepFill_SectionPlacement + - symbol: BRepFill_ShapeLaw + - symbol: BRepFill_Sweep + - symbol: BRepFill_ThruSectionErrorStatus + - symbol: BRepFill_TransitionStyle + - symbol: BRepFill_TrimEdgeTool + - symbol: BRepFill_TrimShellCorner + - symbol: BRepFill_TypeOfContact + - symbol: BRepFilletAPI_LocalOperation + - symbol: BRepFilletAPI_MakeChamfer + - symbol: BRepFilletAPI_MakeFillet + - symbol: BRepFilletAPI_MakeFillet2d + - symbol: BRepGProp + - symbol: BRepGProp_Cinert + - symbol: BRepGProp_Domain + - symbol: BRepGProp_EdgeTool + - symbol: BRepGProp_Face + - symbol: BRepGProp_MeshCinert + - symbol: BRepGProp_Sinert + - symbol: BRepGProp_TFunction + - symbol: BRepGProp_UFunction + - symbol: BRepGProp_Vinert + - symbol: BRepGraph + - symbol: BRepGraphInc_BaseDef + - symbol: BRepGraphInc_BaseRef + - symbol: BRepGraphInc_BaseRep + - symbol: BRepGraphInc_ChildRef + - symbol: BRepGraphInc_CoEdgeDef + - symbol: BRepGraphInc_CoEdgeRef + - symbol: BRepGraphInc_CompSolidDef + - symbol: BRepGraphInc_CompoundDef + - symbol: BRepGraphInc_Curve2DRep + - symbol: BRepGraphInc_Curve3DRep + - symbol: BRepGraphInc_EdgeDef + - symbol: BRepGraphInc_FaceDef + - symbol: BRepGraphInc_FaceRef + - symbol: BRepGraphInc_OccurrenceDef + - symbol: BRepGraphInc_OccurrenceRef + - symbol: BRepGraphInc_Polygon2DRep + - symbol: BRepGraphInc_Polygon3DRep + - symbol: BRepGraphInc_PolygonOnTriRep + - symbol: BRepGraphInc_Populate + - symbol: BRepGraphInc_ProductDef + - symbol: BRepGraphInc_Reconstruct + - symbol: BRepGraphInc_Reconstruct_Cache + - symbol: BRepGraphInc_Reconstruct_Cache_TempScope + - symbol: BRepGraphInc_ReverseIndex + - symbol: BRepGraphInc_ShellDef + - symbol: BRepGraphInc_ShellRef + - symbol: BRepGraphInc_SolidDef + - symbol: BRepGraphInc_SolidRef + - symbol: BRepGraphInc_Storage + - symbol: BRepGraphInc_SurfaceRep + - symbol: BRepGraphInc_TriangulationRep + - symbol: BRepGraphInc_VertexDef + - symbol: BRepGraphInc_VertexRef + - symbol: BRepGraphInc_WireDef + - symbol: BRepGraphInc_WireInstance + - symbol: BRepGraphInc_WireRef + - symbol: BRepGraph_Builder + - symbol: BRepGraph_CacheKind + - symbol: BRepGraph_CacheKindRegistry + - symbol: BRepGraph_CacheValue + - symbol: BRepGraph_CacheView + - symbol: BRepGraph_ChildExplorer + - symbol: BRepGraph_ChildRefId + - symbol: BRepGraph_CoEdgeId + - symbol: BRepGraph_CoEdgeRefId + - symbol: BRepGraph_CoEdgesOfEdge + - symbol: BRepGraph_CompSolidId + - symbol: BRepGraph_CompSolidsOfSolid + - symbol: BRepGraph_Compact + - symbol: BRepGraph_CompoundId + - symbol: BRepGraph_CompoundsOfCompSolid + - symbol: BRepGraph_Copy + - symbol: BRepGraph_Curve2DRepId + - symbol: BRepGraph_Curve3DRepId + - symbol: BRepGraph_Data + - symbol: BRepGraph_Deduplicate + - symbol: BRepGraph_DeferredScope + - symbol: BRepGraph_DefsChildOfCompound + - symbol: BRepGraph_DefsChildOfShell + - symbol: BRepGraph_DefsChildOfSolid + - symbol: BRepGraph_DefsCoEdgeOfWire + - symbol: BRepGraph_DefsEdgeOfWire + - symbol: BRepGraph_DefsFaceOfShell + - symbol: BRepGraph_DefsIterator_ChildOfCompoundTraits + - symbol: BRepGraph_DefsIterator_ChildOfShellTraits + - symbol: BRepGraph_DefsIterator_ChildOfSolidTraits + - symbol: BRepGraph_DefsIterator_CoEdgeOfWireTraits + - symbol: BRepGraph_DefsIterator_DefsVertexOfEdge + - symbol: BRepGraph_DefsIterator_EdgeOfWireTraits + - symbol: BRepGraph_DefsIterator_FaceOfShellTraits + - symbol: BRepGraph_DefsIterator_OccurrenceOfProductTraits + - symbol: BRepGraph_DefsIterator_ShellOfSolidTraits + - symbol: BRepGraph_DefsIterator_SolidOfCompSolidTraits + - symbol: BRepGraph_DefsIterator_VertexOfFaceTraits + - symbol: BRepGraph_DefsIterator_WireOfFaceTraits + - symbol: BRepGraph_DefsOccurrenceOfProduct + - symbol: BRepGraph_DefsShellOfSolid + - symbol: BRepGraph_DefsSolidOfCompSolid + - symbol: BRepGraph_DefsVertexOfFace + - symbol: BRepGraph_DefsWireOfFace + - symbol: BRepGraph_EdgeId + - symbol: BRepGraph_EdgesOfVertex + - symbol: BRepGraph_EditorView + - symbol: BRepGraph_FaceId + - symbol: BRepGraph_FaceRefId + - symbol: BRepGraph_FacesOfEdge + - symbol: BRepGraph_FullChildRefIterator + - symbol: BRepGraph_FullCoEdgeRefIterator + - symbol: BRepGraph_FullFaceRefIterator + - symbol: BRepGraph_FullOccurrenceRefIterator + - symbol: BRepGraph_FullShellRefIterator + - symbol: BRepGraph_FullSolidRefIterator + - symbol: BRepGraph_FullVertexRefIterator + - symbol: BRepGraph_FullWireRefIterator + - symbol: BRepGraph_History + - symbol: BRepGraph_HistoryRecord + - symbol: BRepGraph_Layer + - symbol: BRepGraph_LayerIterator + - symbol: BRepGraph_LayerParam + - symbol: BRepGraph_LayerParam_VertexParams + - symbol: BRepGraph_LayerRegistry + - symbol: BRepGraph_LayerRegularity + - symbol: BRepGraph_LayerRegularity_EdgeRegularities + - symbol: BRepGraph_MeshCacheStorage + - symbol: BRepGraph_MeshCache_CoEdgeMeshEntry + - symbol: BRepGraph_MeshCache_EdgeMeshEntry + - symbol: BRepGraph_MeshCache_FaceMeshEntry + - symbol: BRepGraph_MeshView + - symbol: BRepGraph_MeshView_CoEdgeOps + - symbol: BRepGraph_MeshView_EdgeOps + - symbol: BRepGraph_MeshView_FaceOps + - symbol: BRepGraph_MeshView_PolyOps + - symbol: BRepGraph_NodeId + - symbol: BRepGraph_OccurrenceId + - symbol: BRepGraph_OccurrenceRefId + - symbol: BRepGraph_OccurrencesOfProduct + - symbol: BRepGraph_ParallelPolicy + - symbol: BRepGraph_ParentExplorer + - symbol: BRepGraph_Polygon2DRepId + - symbol: BRepGraph_Polygon3DRepId + - symbol: BRepGraph_PolygonOnTriRepId + - symbol: BRepGraph_ProductId + - symbol: BRepGraph_RefId + - symbol: BRepGraph_RefTransientCache + - symbol: BRepGraph_RefUID + - symbol: BRepGraph_RefsChildOfCompound + - symbol: BRepGraph_RefsChildOfShell + - symbol: BRepGraph_RefsChildOfSolid + - symbol: BRepGraph_RefsCoEdgeOfWire + - symbol: BRepGraph_RefsCompSolidsOfSolid + - symbol: BRepGraph_RefsCompoundsOfChild + - symbol: BRepGraph_RefsEdgesOfVertex + - symbol: BRepGraph_RefsFaceOfShell + - symbol: BRepGraph_RefsFacesOfWire + - symbol: BRepGraph_RefsIterator_ChildOfCompoundTraits + - symbol: BRepGraph_RefsIterator_ChildOfShellTraits + - symbol: BRepGraph_RefsIterator_ChildOfSolidTraits + - symbol: BRepGraph_RefsIterator_CoEdgeOfWireTraits + - symbol: BRepGraph_RefsIterator_FaceOfShellTraits + - symbol: BRepGraph_RefsIterator_OccurrenceOfProductTraits + - symbol: BRepGraph_RefsIterator_RefsVertexOfEdge + - symbol: BRepGraph_RefsIterator_ShellOfSolidTraits + - symbol: BRepGraph_RefsIterator_SolidOfCompSolidTraits + - symbol: BRepGraph_RefsIterator_VertexOfFaceTraits + - symbol: BRepGraph_RefsIterator_WireOfFaceTraits + - symbol: BRepGraph_RefsOccurrenceOfProduct + - symbol: BRepGraph_RefsProductsOfOccurrence + - symbol: BRepGraph_RefsShellOfSolid + - symbol: BRepGraph_RefsShellsOfFace + - symbol: BRepGraph_RefsSolidOfCompSolid + - symbol: BRepGraph_RefsSolidsOfShell + - symbol: BRepGraph_RefsVertexOfFace + - symbol: BRepGraph_RefsView + - symbol: BRepGraph_RefsView_ChildOps + - symbol: BRepGraph_RefsView_CoEdgeOps + - symbol: BRepGraph_RefsView_FaceOps + - symbol: BRepGraph_RefsView_OccurrenceOps + - symbol: BRepGraph_RefsView_ShellOps + - symbol: BRepGraph_RefsView_SolidOps + - symbol: BRepGraph_RefsView_VertexOps + - symbol: BRepGraph_RefsView_WireOps + - symbol: BRepGraph_RefsWireOfFace + - symbol: BRepGraph_RefsWiresOfCoEdge + - symbol: BRepGraph_RelatedIterator + - symbol: BRepGraph_RepId + - symbol: BRepGraph_ReverseIterator_CompSolidOfSolidRefTraits + - symbol: BRepGraph_ReverseIterator_CompoundOfChildRefTraits + - symbol: BRepGraph_ReverseIterator_EdgeOfVertexRefTraits + - symbol: BRepGraph_ReverseIterator_FaceOfWireRefTraits + - symbol: BRepGraph_ReverseIterator_ProductOfOccurrenceRefTraits + - symbol: BRepGraph_ReverseIterator_ShellOfFaceRefTraits + - symbol: BRepGraph_ReverseIterator_SolidOfShellRefTraits + - symbol: BRepGraph_ReverseIterator_WireOfCoEdgeRefTraits + - symbol: BRepGraph_RootProductIterator + - symbol: BRepGraph_ShapesView + - symbol: BRepGraph_ShellId + - symbol: BRepGraph_ShellRefId + - symbol: BRepGraph_ShellsOfFace + - symbol: BRepGraph_SolidId + - symbol: BRepGraph_SolidRefId + - symbol: BRepGraph_SolidsOfShell + - symbol: BRepGraph_SurfaceRepId + - symbol: BRepGraph_Tool + - symbol: BRepGraph_Tool_CoEdge + - symbol: BRepGraph_Tool_Edge + - symbol: BRepGraph_Tool_Face + - symbol: BRepGraph_Tool_Mesh + - symbol: BRepGraph_Tool_Shell + - symbol: BRepGraph_Tool_Vertex + - symbol: BRepGraph_Tool_Wire + - symbol: BRepGraph_TopoView + - symbol: BRepGraph_TopoView_CoEdgeOps + - symbol: BRepGraph_TopoView_CompSolidOps + - symbol: BRepGraph_TopoView_CompoundOps + - symbol: BRepGraph_TopoView_EdgeOps + - symbol: BRepGraph_TopoView_FaceOps + - symbol: BRepGraph_TopoView_GenOps + - symbol: BRepGraph_TopoView_GeometryOps + - symbol: BRepGraph_TopoView_OccurrenceOps + - symbol: BRepGraph_TopoView_ProductOps + - symbol: BRepGraph_TopoView_ShellOps + - symbol: BRepGraph_TopoView_SolidOps + - symbol: BRepGraph_TopoView_VertexOps + - symbol: BRepGraph_TopoView_WireOps + - symbol: BRepGraph_Transform + - symbol: BRepGraph_TransientCache + - symbol: BRepGraph_TriangulationRepId + - symbol: BRepGraph_UID + - symbol: BRepGraph_UIDsView + - symbol: BRepGraph_Validate + - symbol: BRepGraph_Validate_Options + - symbol: BRepGraph_Validate_Result + - symbol: BRepGraph_VersionStamp + - symbol: BRepGraph_VertexId + - symbol: BRepGraph_VertexRefId + - symbol: BRepGraph_WireExplorer + - symbol: BRepGraph_WireId + - symbol: BRepGraph_WireRefId + - symbol: BRepGraph_WiresOfCoEdge + - symbol: BRepIntCurveSurface_Inter + - symbol: BRepLProp + - symbol: BRepLProp_CLProps + - symbol: BRepLProp_SLProps + - symbol: BRepLProp_SurfaceTool + - symbol: BRepLib + - symbol: BRepLib_CheckCurveOnSurface + - symbol: BRepLib_Command + - symbol: BRepLib_EdgeError + - symbol: BRepLib_FaceError + - symbol: BRepLib_FindSurface + - symbol: BRepLib_FuseEdges + - symbol: BRepLib_MakeEdge + - symbol: BRepLib_MakeEdge2d + - symbol: BRepLib_MakeFace + - symbol: BRepLib_MakePolygon + - symbol: BRepLib_MakeShape + - symbol: BRepLib_MakeShell + - symbol: BRepLib_MakeSolid + - symbol: BRepLib_MakeVertex + - symbol: BRepLib_MakeWire + - symbol: BRepLib_PointCloudShape + - symbol: BRepLib_ShapeModification + - symbol: BRepLib_ShellError + - symbol: BRepLib_ToolTriangulatedShape + - symbol: BRepLib_ValidateEdge + - symbol: BRepLib_WireError + - symbol: BRepMAT2d_BisectingLocus + - symbol: BRepMAT2d_Explorer + - symbol: BRepMAT2d_LinkTopoBilo + - symbol: BRepMesh_BaseMeshAlgo + - symbol: BRepMesh_BoundaryParamsRangeSplitter + - symbol: BRepMesh_Circle + - symbol: BRepMesh_CircleInspector + - symbol: BRepMesh_CircleTool + - symbol: BRepMesh_Classifier + - symbol: BRepMesh_ConeRangeSplitter + - symbol: BRepMesh_ConstrainedBaseMeshAlgo + - symbol: BRepMesh_Context + - symbol: BRepMesh_CurveTessellator + - symbol: BRepMesh_CustomBaseMeshAlgo + - symbol: BRepMesh_CylinderRangeSplitter + - symbol: BRepMesh_DataStructureOfDelaun + - symbol: BRepMesh_DefaultRangeSplitter + - symbol: BRepMesh_Deflection + - symbol: BRepMesh_DegreeOfFreedom + - symbol: BRepMesh_DelabellaBaseMeshAlgo + - symbol: BRepMesh_DelabellaMeshAlgoFactory + - symbol: BRepMesh_DelaunayBaseMeshAlgo + - symbol: BRepMesh_DiscretAlgoFactory + - symbol: BRepMesh_DiscretFactory + - symbol: BRepMesh_DiscretRoot + - symbol: BRepMesh_Edge + - symbol: BRepMesh_EdgeDiscret + - symbol: BRepMesh_EdgeTessellationExtractor + - symbol: BRepMesh_ExtrusionRangeSplitter + - symbol: BRepMesh_FaceChecker + - symbol: BRepMesh_FaceDiscret + - symbol: BRepMesh_FastDiscret + - symbol: BRepMesh_GeomTool + - symbol: BRepMesh_IncrementalMesh + - symbol: BRepMesh_IncrementalMeshFactory + - symbol: BRepMesh_MeshAlgoFactory + - symbol: BRepMesh_MeshTool + - symbol: BRepMesh_MeshTool_NodeClassifier + - symbol: BRepMesh_ModelBuilder + - symbol: BRepMesh_ModelHealer + - symbol: BRepMesh_ModelPostProcessor + - symbol: BRepMesh_ModelPreProcessor + - symbol: BRepMesh_NURBSRangeSplitter + - symbol: BRepMesh_OrientedEdge + - symbol: BRepMesh_PairOfIndex + - symbol: BRepMesh_SelectorOfDataStructureOfDelaun + - symbol: BRepMesh_ShapeTool + - symbol: BRepMesh_ShapeVisitor + - symbol: BRepMesh_SphereRangeSplitter + - symbol: BRepMesh_TorusRangeSplitter + - symbol: BRepMesh_Triangulator + - symbol: BRepMesh_UVParamRangeSplitter + - symbol: BRepMesh_UndefinedRangeSplitter + - symbol: BRepMesh_Vertex + - symbol: BRepMesh_VertexInspector + - symbol: BRepMesh_VertexTool + - symbol: BRepOffsetAPI_DraftAngle + - symbol: BRepOffsetAPI_MakeDraft + - symbol: BRepOffsetAPI_MakeEvolved + - symbol: BRepOffsetAPI_MakeFilling + - symbol: BRepOffsetAPI_MakeOffset + - symbol: BRepOffsetAPI_MakeOffsetShape + - symbol: BRepOffsetAPI_MakePipe + - symbol: BRepOffsetAPI_MakePipeShell + - symbol: BRepOffsetAPI_MakeThickSolid + - symbol: BRepOffsetAPI_MiddlePath + - symbol: BRepOffsetAPI_NormalProjection + - symbol: BRepOffsetAPI_ThruSections + - symbol: BRepOffsetSimple_Status + - symbol: BRepOffset_Analyse + - symbol: BRepOffset_Error + - symbol: BRepOffset_Inter2d + - symbol: BRepOffset_Inter3d + - symbol: BRepOffset_Interval + - symbol: BRepOffset_MakeLoops + - symbol: BRepOffset_MakeSimpleOffset + - symbol: BRepOffset_Mode + - symbol: BRepOffset_Offset + - symbol: BRepOffset_SimpleOffset + - symbol: BRepOffset_Status + - symbol: BRepPreviewAPI_MakeBox + - symbol: BRepPrimAPI_MakeBox + - symbol: BRepPrimAPI_MakeCone + - symbol: BRepPrimAPI_MakeCylinder + - symbol: BRepPrimAPI_MakeHalfSpace + - symbol: BRepPrimAPI_MakeOneAxis + - symbol: BRepPrimAPI_MakePrism + - symbol: BRepPrimAPI_MakeRevol + - symbol: BRepPrimAPI_MakeRevolution + - symbol: BRepPrimAPI_MakeSphere + - symbol: BRepPrimAPI_MakeSweep + - symbol: BRepPrimAPI_MakeTorus + - symbol: BRepPrimAPI_MakeWedge + - symbol: BRepPrim_Builder + - symbol: BRepPrim_Cone + - symbol: BRepPrim_Cylinder + - symbol: BRepPrim_Direction + - symbol: BRepPrim_FaceBuilder + - symbol: BRepPrim_GWedge + - symbol: BRepPrim_OneAxis + - symbol: BRepPrim_Revolution + - symbol: BRepPrim_Sphere + - symbol: BRepPrim_Torus + - symbol: BRepPrim_Wedge + - symbol: BRepProj_Projection + - symbol: BRepSweep_Builder + - symbol: BRepSweep_Iterator + - symbol: BRepSweep_NumLinearRegularSweep + - symbol: BRepSweep_Prism + - symbol: BRepSweep_Revol + - symbol: BRepSweep_Rotation + - symbol: BRepSweep_Tool + - symbol: BRepSweep_Translation + - symbol: BRepSweep_Trsf + - symbol: BRepToIGESBRep_Entity + - symbol: BRepToIGES_BREntity + - symbol: BRepToIGES_BRShell + - symbol: BRepToIGES_BRSolid + - symbol: BRepToIGES_BRWire + - symbol: BRepTools + - symbol: BRepTools_CopyModification + - symbol: BRepTools_GTrsfModification + - symbol: BRepTools_History + - symbol: BRepTools_Modification + - symbol: BRepTools_Modifier + - symbol: BRepTools_NurbsConvertModification + - symbol: BRepTools_PurgeLocations + - symbol: BRepTools_Quilt + - symbol: BRepTools_ReShape + - symbol: BRepTools_ShapeSet + - symbol: BRepTools_Substitution + - symbol: BRepTools_TrsfModification + - symbol: BRepTools_WireExplorer + - symbol: BRepTopAdaptor_HVertex + - symbol: BRepTopAdaptor_Tool + - symbol: BRepTopAdaptor_TopolTool + - symbol: BRep_Builder + - symbol: BRep_Curve3D + - symbol: BRep_CurveOn2Surfaces + - symbol: BRep_CurveOnClosedSurface + - symbol: BRep_CurveOnSurface + - symbol: BRep_CurveRepresentation + - symbol: BRep_GCurve + - symbol: BRep_PointOnCurve + - symbol: BRep_PointOnCurveOnSurface + - symbol: BRep_PointOnSurface + - symbol: BRep_PointRepresentation + - symbol: BRep_PointsOnSurface + - symbol: BRep_Polygon3D + - symbol: BRep_PolygonOnClosedSurface + - symbol: BRep_PolygonOnClosedTriangulation + - symbol: BRep_PolygonOnSurface + - symbol: BRep_PolygonOnTriangulation + - symbol: BRep_TEdge + - symbol: BRep_TFace + - symbol: BRep_TVertex + - symbol: BRep_Tool + - symbol: BSplCLib_Cache + - symbol: BSplCLib_EvaluatorFunction + - symbol: BSplCLib_KnotDistribution + - symbol: BSplCLib_MultDistribution + - symbol: BSplSLib + - symbol: BSplSLib_Cache + - symbol: BSplSLib_EvaluatorFunction + - symbol: BVH_Array2d + - symbol: BVH_Array2f + - symbol: BVH_Array2i + - symbol: BVH_Array3d + - symbol: BVH_Array3f + - symbol: BVH_Array3i + - symbol: BVH_Array4d + - symbol: BVH_Array4f + - symbol: BVH_Array4i + - symbol: BVH_BinaryTree + - symbol: BVH_BitComparator + - symbol: BVH_BitPredicate + - symbol: BVH_BuildQueue + - symbol: BVH_BuildThread + - symbol: BVH_BuildTool + - symbol: BVH_BuilderTransient + - symbol: BVH_Mat4d + - symbol: BVH_Mat4f + - symbol: BVH_ObjectTransient + - symbol: BVH_Properties + - symbol: BVH_QuadTree + - symbol: BVH_RadixSorter + - symbol: BVH_TreeBaseTransient + - symbol: BVH_Vec2d + - symbol: BVH_Vec2f + - symbol: BVH_Vec2i + - symbol: BVH_Vec3d + - symbol: BVH_Vec3f + - symbol: BVH_Vec3i + - symbol: BVH_Vec4d + - symbol: BVH_Vec4f + - symbol: BVH_Vec4i + - symbol: BiTgte_Blend + - symbol: BiTgte_ContactType + - symbol: BiTgte_CurveOnEdge + - symbol: BiTgte_CurveOnVertex + - symbol: BinTools + - symbol: BinTools_Curve2dSet + - symbol: BinTools_CurveSet + - symbol: BinTools_FormatVersion + - symbol: BinTools_IStream + - symbol: BinTools_LocationSet + - symbol: BinTools_OStream + - symbol: BinTools_ObjectType + - symbol: BinTools_ShapeReader + - symbol: BinTools_ShapeSet + - symbol: BinTools_ShapeSetBase + - symbol: BinTools_ShapeWriter + - symbol: BinTools_SurfaceSet + - symbol: Bisector + - symbol: Bisector_Bisec + - symbol: Bisector_BisecAna + - symbol: Bisector_BisecCC + - symbol: Bisector_BisecPC + - symbol: Bisector_Curve + - symbol: Bisector_FunctionH + - symbol: Bisector_FunctionInter + - symbol: Bisector_Inter + - symbol: Bisector_PointOnBis + - symbol: Bisector_PolyBis + - symbol: BlendFunc + - symbol: BlendFunc_CSCircular + - symbol: BlendFunc_CSConstRad + - symbol: BlendFunc_ChAsym + - symbol: BlendFunc_ChAsymInv + - symbol: BlendFunc_ChamfInv + - symbol: BlendFunc_Chamfer + - symbol: BlendFunc_ConstRad + - symbol: BlendFunc_ConstRadInv + - symbol: BlendFunc_ConstThroat + - symbol: BlendFunc_ConstThroatInv + - symbol: BlendFunc_ConstThroatWithPenetration + - symbol: BlendFunc_ConstThroatWithPenetrationInv + - symbol: BlendFunc_Corde + - symbol: BlendFunc_EvolRad + - symbol: BlendFunc_EvolRadInv + - symbol: BlendFunc_GenChamfInv + - symbol: BlendFunc_GenChamfer + - symbol: BlendFunc_Ruled + - symbol: BlendFunc_RuledInv + - symbol: BlendFunc_SectionShape + - symbol: BlendFunc_Tensor + - symbol: Blend_AppFunction + - symbol: Blend_CSFunction + - symbol: Blend_CurvPointFuncInv + - symbol: Blend_DecrochStatus + - symbol: Blend_FuncInv + - symbol: Blend_Function + - symbol: Blend_Point + - symbol: Blend_RstRstFunction + - symbol: Blend_Status + - symbol: Blend_SurfCurvFuncInv + - symbol: Blend_SurfPointFuncInv + - symbol: Blend_SurfRstFunction + - symbol: BndLib + - symbol: BndLib_Add2dCurve + - symbol: BndLib_Add3dCurve + - symbol: BndLib_AddSurface + - symbol: Bnd_BoundSortBox + - symbol: Bnd_Box + - symbol: Bnd_Box2d + - symbol: Bnd_OBB + - symbol: Bnd_Range + - symbol: Bnd_Sphere + - symbol: Bnd_Tools + - symbol: CDF_Application + - symbol: CDF_Directory + - symbol: CDF_FWOSDriver + - symbol: CDF_MetaDataDriver + - symbol: CDF_MetaDataDriverFactory + - symbol: CDF_Store + - symbol: CDF_StoreList + - symbol: CDF_StoreSetNameStatus + - symbol: CDF_SubComponentStatus + - symbol: CDF_TryStoreStatus + - symbol: CDF_TypeOfActivation + - symbol: CDM_Application + - symbol: CDM_CanCloseStatus + - symbol: CDM_Document + - symbol: CDM_MetaData + - symbol: CDM_Reference + - symbol: CDM_ReferenceIterator + - symbol: CPnts_AbscissaPoint + - symbol: CPnts_MyGaussFunction + - symbol: CPnts_MyRootFunction + - symbol: CPnts_UniformDeflection + - symbol: CSLib + - symbol: CSLib_Class2d + - symbol: CSLib_DerivativeStatus + - symbol: CSLib_NormalPolyDef + - symbol: CSLib_NormalStatus + - symbol: ChFi2d + - symbol: ChFi2d_AnaFilletAlgo + - symbol: ChFi2d_Builder + - symbol: ChFi2d_ChamferAPI + - symbol: ChFi2d_ConstructionError + - symbol: ChFi2d_FilletAPI + - symbol: ChFi2d_FilletAlgo + - symbol: ChFi3d + - symbol: ChFi3d_Builder + - symbol: ChFi3d_ChBuilder + - symbol: ChFi3d_FilBuilder + - symbol: ChFi3d_FilletShape + - symbol: ChFi3d_SearchSing + - symbol: ChFiDS_ChamfMethod + - symbol: ChFiDS_ChamfMode + - symbol: ChFiDS_ChamfSpine + - symbol: ChFiDS_CircSection + - symbol: ChFiDS_CommonPoint + - symbol: ChFiDS_ElSpine + - symbol: ChFiDS_ErrorStatus + - symbol: ChFiDS_FaceInterference + - symbol: ChFiDS_FilSpine + - symbol: ChFiDS_Map + - symbol: ChFiDS_Regul + - symbol: ChFiDS_Spine + - symbol: ChFiDS_State + - symbol: ChFiDS_Stripe + - symbol: ChFiDS_StripeMap + - symbol: ChFiDS_SurfData + - symbol: ChFiDS_TypeOfConcavity + - symbol: ChFiKPart_ComputeData + - symbol: Contap_ArcFunction + - symbol: Contap_ContAna + - symbol: Contap_Contour + - symbol: Contap_HContTool + - symbol: Contap_HCurve2dTool + - symbol: Contap_IType + - symbol: Contap_Line + - symbol: Contap_Point + - symbol: Contap_SurfFunction + - symbol: Contap_SurfProps + - symbol: Contap_TFunction + - symbol: Contap_TheIWLineOfTheIWalking + - symbol: Contap_TheIWalking + - symbol: Contap_ThePathPointOfTheSearch + - symbol: Contap_TheSearch + - symbol: Contap_TheSearchInside + - symbol: Contap_TheSegmentOfTheSearch + - symbol: Convert_CircleToBSplineCurve + - symbol: Convert_CompBezierCurves2dToBSplineCurve2d + - symbol: Convert_CompBezierCurvesToBSplineCurve + - symbol: Convert_CompPolynomialToPoles + - symbol: Convert_ConeToBSplineSurface + - symbol: Convert_ConicToBSplineCurve + - symbol: Convert_CylinderToBSplineSurface + - symbol: Convert_ElementarySurfaceToBSplineSurface + - symbol: Convert_EllipseToBSplineCurve + - symbol: Convert_GridPolynomialToPoles + - symbol: Convert_HyperbolaToBSplineCurve + - symbol: Convert_ParabolaToBSplineCurve + - symbol: Convert_ParameterisationType + - symbol: Convert_SphereToBSplineSurface + - symbol: Convert_TorusToBSplineSurface + - symbol: DESTL_ConfigurationNode + - symbol: DE_Provider_ReadStreamNode + - symbol: DE_Provider_WriteStreamNode + - symbol: Draft + - symbol: Draft_EdgeInfo + - symbol: Draft_ErrorStatus + - symbol: Draft_FaceInfo + - symbol: Draft_Modification + - symbol: Draft_VertexInfo + - symbol: ElCLib + - symbol: ElSLib + - symbol: Expr + - symbol: ExprIntrp + - symbol: ExprIntrp_Analysis + - symbol: ExprIntrp_GenExp + - symbol: ExprIntrp_GenFct + - symbol: ExprIntrp_GenRel + - symbol: ExprIntrp_Generator + - symbol: ExprIntrp_SyntaxError + - symbol: Expr_Absolute + - symbol: Expr_ArcCosine + - symbol: Expr_ArcSine + - symbol: Expr_ArcTangent + - symbol: Expr_ArgCosh + - symbol: Expr_ArgSinh + - symbol: Expr_ArgTanh + - symbol: Expr_BinaryExpression + - symbol: Expr_BinaryFunction + - symbol: Expr_Cosh + - symbol: Expr_Cosine + - symbol: Expr_Difference + - symbol: Expr_Different + - symbol: Expr_Division + - symbol: Expr_Equal + - symbol: Expr_Exponential + - symbol: Expr_Exponentiate + - symbol: Expr_ExprFailure + - symbol: Expr_FunctionDerivative + - symbol: Expr_GeneralExpression + - symbol: Expr_GeneralFunction + - symbol: Expr_GeneralRelation + - symbol: Expr_GreaterThan + - symbol: Expr_GreaterThanOrEqual + - symbol: Expr_InvalidAssignment + - symbol: Expr_InvalidFunction + - symbol: Expr_InvalidOperand + - symbol: Expr_LessThan + - symbol: Expr_LessThanOrEqual + - symbol: Expr_LogOf10 + - symbol: Expr_LogOfe + - symbol: Expr_NamedConstant + - symbol: Expr_NamedExpression + - symbol: Expr_NamedFunction + - symbol: Expr_NamedUnknown + - symbol: Expr_NotAssigned + - symbol: Expr_NotEvaluable + - symbol: Expr_NumericValue + - symbol: Expr_PolyExpression + - symbol: Expr_PolyFunction + - symbol: Expr_Product + - symbol: Expr_RUIterator + - symbol: Expr_RelationIterator + - symbol: Expr_Sign + - symbol: Expr_Sine + - symbol: Expr_SingleRelation + - symbol: Expr_Sinh + - symbol: Expr_Square + - symbol: Expr_SquareRoot + - symbol: Expr_Sum + - symbol: Expr_SystemRelation + - symbol: Expr_Tangent + - symbol: Expr_Tanh + - symbol: Expr_UnaryExpression + - symbol: Expr_UnaryFunction + - symbol: Expr_UnaryMinus + - symbol: Expr_UnknownIterator + - symbol: ExtremaPC_BSplineCurve + - symbol: ExtremaPC_BezierCurve + - symbol: ExtremaPC_Circle + - symbol: ExtremaPC_Config + - symbol: ExtremaPC_Curve + - symbol: ExtremaPC_DistanceFunction + - symbol: ExtremaPC_Ellipse + - symbol: ExtremaPC_ExtremumResult + - symbol: ExtremaPC_GridEvaluator + - symbol: ExtremaPC_Hyperbola + - symbol: ExtremaPC_Line + - symbol: ExtremaPC_OffsetCurve + - symbol: ExtremaPC_OtherCurve + - symbol: ExtremaPC_Parabola + - symbol: ExtremaPC_Result + - symbol: ExtremaPC_SearchMode + - symbol: ExtremaPC_Status + - symbol: Extrema_Curve2dTool + - symbol: Extrema_CurveTool + - symbol: Extrema_ElementType + - symbol: Extrema_ExtAlgo + - symbol: Extrema_ExtCC + - symbol: Extrema_ExtCC2d + - symbol: Extrema_ExtCS + - symbol: Extrema_ExtElC + - symbol: Extrema_ExtElC2d + - symbol: Extrema_ExtElCS + - symbol: Extrema_ExtElSS + - symbol: Extrema_ExtFlag + - symbol: Extrema_ExtPElC + - symbol: Extrema_ExtPElC2d + - symbol: Extrema_ExtPElS + - symbol: Extrema_ExtPExtS + - symbol: Extrema_ExtPRevS + - symbol: Extrema_ExtPS + - symbol: Extrema_ExtSS + - symbol: Extrema_FuncExtCS + - symbol: Extrema_FuncExtSS + - symbol: Extrema_FuncPSDist + - symbol: Extrema_FuncPSNorm + - symbol: Extrema_GenExtCS + - symbol: Extrema_GenExtPS + - symbol: Extrema_GenExtSS + - symbol: Extrema_GenLocateExtCS + - symbol: Extrema_GenLocateExtPS + - symbol: Extrema_GenLocateExtSS + - symbol: Extrema_GlobOptFuncCCC0 + - symbol: Extrema_GlobOptFuncCCC1 + - symbol: Extrema_GlobOptFuncCCC2 + - symbol: Extrema_GlobOptFuncCQuadric + - symbol: Extrema_GlobOptFuncCS + - symbol: Extrema_GlobOptFuncConicS + - symbol: Extrema_LocateExtCC + - symbol: Extrema_LocateExtCC2d + - symbol: Extrema_POnCurv + - symbol: Extrema_POnCurv2d + - symbol: Extrema_POnSurf + - symbol: Extrema_POnSurfParams + - symbol: FEmTool_Assembly + - symbol: FEmTool_Curve + - symbol: FEmTool_ElementaryCriterion + - symbol: FEmTool_ElementsOfRefMatrix + - symbol: FEmTool_LinearFlexion + - symbol: FEmTool_LinearJerk + - symbol: FEmTool_LinearTension + - symbol: FEmTool_ProfileMatrix + - symbol: FEmTool_SparseMatrix + - symbol: FSD_Base64 + - symbol: FSD_CmpFile + - symbol: FSD_FileHeader + - symbol: FairCurve_AnalysisCode + - symbol: FairCurve_Batten + - symbol: FairCurve_BattenLaw + - symbol: FairCurve_DistributionOfEnergy + - symbol: FairCurve_DistributionOfJerk + - symbol: FairCurve_DistributionOfSagging + - symbol: FairCurve_DistributionOfTension + - symbol: FairCurve_Energy + - symbol: FairCurve_EnergyOfBatten + - symbol: FairCurve_EnergyOfMVC + - symbol: FairCurve_MinimalVariation + - symbol: FairCurve_Newton + - symbol: FilletPoint + - symbol: FilletSurf_Builder + - symbol: FilletSurf_ErrorTypeStatus + - symbol: FilletSurf_InternalBuilder + - symbol: FilletSurf_StatusDone + - symbol: FilletSurf_StatusType + - symbol: GCPnts_AbscissaPoint + - symbol: GCPnts_AbscissaType + - symbol: GCPnts_DeflectionType + - symbol: GCPnts_DistFunction2dMV + - symbol: GCPnts_DistFunctionMV + - symbol: GCPnts_QuasiUniformAbscissa + - symbol: GCPnts_QuasiUniformDeflection + - symbol: GCPnts_TangentialDeflection + - symbol: GCPnts_UniformAbscissa + - symbol: GCPnts_UniformDeflection + - symbol: GC_MakeArcOfCircle + - symbol: GC_MakeArcOfCircle2d + - symbol: GC_MakeArcOfEllipse + - symbol: GC_MakeArcOfEllipse2d + - symbol: GC_MakeArcOfHyperbola + - symbol: GC_MakeArcOfHyperbola2d + - symbol: GC_MakeArcOfParabola + - symbol: GC_MakeArcOfParabola2d + - symbol: GC_MakeCircle + - symbol: GC_MakeCircle2d + - symbol: GC_MakeConicalSurface + - symbol: GC_MakeCylindricalSurface + - symbol: GC_MakeEllipse + - symbol: GC_MakeEllipse2d + - symbol: GC_MakeHyperbola + - symbol: GC_MakeHyperbola2d + - symbol: GC_MakeLine + - symbol: GC_MakeLine2d + - symbol: GC_MakeMirror + - symbol: GC_MakeMirror2d + - symbol: GC_MakeParabola2d + - symbol: GC_MakePlane + - symbol: GC_MakeRotation + - symbol: GC_MakeRotation2d + - symbol: GC_MakeScale + - symbol: GC_MakeScale2d + - symbol: GC_MakeSegment + - symbol: GC_MakeSegment2d + - symbol: GC_MakeTranslation + - symbol: GC_MakeTranslation2d + - symbol: GC_MakeTrimmedCone + - symbol: GC_MakeTrimmedCylinder + - symbol: GC_Root + - symbol: GProp + - symbol: GProp_CelGProps + - symbol: GProp_GProps + - symbol: GProp_PEquation + - symbol: GProp_PGProps + - symbol: GProp_PrincipalProps + - symbol: GProp_SelGProps + - symbol: GProp_UndefinedAxis + - symbol: GProp_ValueType + - symbol: GProp_VelGProps + - symbol: GccAna_Circ2dBisec + - symbol: GccAna_CircLin2dBisec + - symbol: GccAna_CircPnt2dBisec + - symbol: GccAna_Lin2dBisec + - symbol: GccAna_LinPnt2dBisec + - symbol: GccAna_NoSolution + - symbol: GccAna_Pnt2dBisec + - symbol: GccEnt_BadQualifier + - symbol: GccEnt_Position + - symbol: GccEnt_QualifiedCirc + - symbol: GccEnt_QualifiedLin + - symbol: GccInt_BCirc + - symbol: GccInt_BElips + - symbol: GccInt_BHyper + - symbol: GccInt_BLine + - symbol: GccInt_BParab + - symbol: GccInt_BPoint + - symbol: GccInt_Bisec + - symbol: GccInt_IType + - symbol: Geom2dAPI_ExtremaCurveCurve + - symbol: Geom2dAPI_InterCurveCurve + - symbol: Geom2dAPI_Interpolate + - symbol: Geom2dAPI_PointsToBSpline + - symbol: Geom2dAPI_ProjectPointOnCurve + - symbol: Geom2dAdaptor + - symbol: Geom2dAdaptor_Curve + - symbol: Geom2dConvert + - symbol: Geom2dConvert_ApproxArcsSegments + - symbol: Geom2dConvert_ApproxCurve + - symbol: Geom2dConvert_BSplineCurveKnotSplitting + - symbol: Geom2dConvert_BSplineCurveToBezierCurve + - symbol: Geom2dConvert_CompCurveToBSplineCurve + - symbol: Geom2dConvert_PPoint + - symbol: Geom2dEval_AHTBezierCurve + - symbol: Geom2dEval_ArchimedeanSpiralCurve + - symbol: Geom2dEval_CircleInvoluteCurve + - symbol: Geom2dEval_LogarithmicSpiralCurve + - symbol: Geom2dEval_RepCurveDesc_Base + - symbol: Geom2dEval_RepCurveDesc_DerivBounded + - symbol: Geom2dEval_RepCurveDesc_Domain1d + - symbol: Geom2dEval_RepCurveDesc_Full + - symbol: Geom2dEval_RepCurveDesc_Map1d + - symbol: Geom2dEval_RepCurveDesc_Mapped + - symbol: Geom2dEval_SineWaveCurve + - symbol: Geom2dEval_TBezierCurve + - symbol: Geom2dGcc + - symbol: Geom2dGcc_CurveTool + - symbol: Geom2dGcc_FunctionTanCirCu + - symbol: Geom2dGcc_FunctionTanCuCu + - symbol: Geom2dGcc_FunctionTanCuCuOnCu + - symbol: Geom2dGcc_FunctionTanCuPnt + - symbol: Geom2dGcc_FunctionTanObl + - symbol: Geom2dGcc_IsParallel + - symbol: Geom2dGcc_QCurve + - symbol: Geom2dGcc_QualifiedCurve + - symbol: Geom2dGcc_Type1 + - symbol: Geom2dGcc_Type2 + - symbol: Geom2dGcc_Type3 + - symbol: Geom2dHash_CurveHasher + - symbol: Geom2dHatch_Classifier + - symbol: Geom2dHatch_Element + - symbol: Geom2dHatch_FClass2dOfClassifier + - symbol: Geom2dHatch_Hatcher + - symbol: Geom2dHatch_Hatching + - symbol: Geom2dHatch_Intersector + - symbol: Geom2dInt_ExactIntersectionPointOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_GInter + - symbol: Geom2dInt_Geom2dCurveTool + - symbol: Geom2dInt_IntConicCurveOfGInter + - symbol: Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter + - symbol: Geom2dInt_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheIntConicCurveOfGInter + - symbol: Geom2dInt_TheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheIntersectorOfTheIntConicCurveOfGInter + - symbol: Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheProjPCurOfGInter + - symbol: Geom2dToIGES_Geom2dCurve + - symbol: Geom2dToIGES_Geom2dEntity + - symbol: Geom2dToIGES_Geom2dPoint + - symbol: Geom2dToIGES_Geom2dVector + - symbol: Geom2d_AxisPlacement + - symbol: Geom2d_BSplineCurve + - symbol: Geom2d_BezierCurve + - symbol: Geom2d_BoundedCurve + - symbol: Geom2d_CartesianPoint + - symbol: Geom2d_Circle + - symbol: Geom2d_Conic + - symbol: Geom2d_Curve + - symbol: Geom2d_Direction + - symbol: Geom2d_Ellipse + - symbol: Geom2d_Geometry + - symbol: Geom2d_Hyperbola + - symbol: Geom2d_Line + - symbol: Geom2d_OffsetCurve + - symbol: Geom2d_Parabola + - symbol: Geom2d_Point + - symbol: Geom2d_Transformation + - symbol: Geom2d_TrimmedCurve + - symbol: Geom2d_UndefinedDerivative + - symbol: Geom2d_UndefinedValue + - symbol: Geom2d_Vector + - symbol: Geom2d_VectorWithMagnitude + - symbol: GeomAPI + - symbol: GeomAPI_ExtremaCurveCurve + - symbol: GeomAPI_ExtremaCurveSurface + - symbol: GeomAPI_ExtremaSurfaceSurface + - symbol: GeomAPI_IntCS + - symbol: GeomAPI_IntSS + - symbol: GeomAPI_Interpolate + - symbol: GeomAPI_PointsToBSpline + - symbol: GeomAPI_PointsToBSplineSurface + - symbol: GeomAPI_ProjectPointOnCurve + - symbol: GeomAPI_ProjectPointOnSurf + - symbol: GeomAbs_BSplKnotDistribution + - symbol: GeomAbs_CurveType + - symbol: GeomAbs_IsoType + - symbol: GeomAbs_JoinType + - symbol: GeomAbs_Shape + - symbol: GeomAbs_SurfaceType + - symbol: GeomAdaptor + - symbol: GeomAdaptor_Curve + - symbol: GeomAdaptor_Surface + - symbol: GeomAdaptor_SurfaceOfLinearExtrusion + - symbol: GeomAdaptor_SurfaceOfRevolution + - symbol: GeomAdaptor_TransformedCurve + - symbol: GeomAdaptor_TransformedSurface + - symbol: GeomBndLib_BSplineCurve + - symbol: GeomBndLib_BSplineCurve2d + - symbol: GeomBndLib_BSplineSurface + - symbol: GeomBndLib_BezierCurve + - symbol: GeomBndLib_BezierCurve2d + - symbol: GeomBndLib_BezierSurface + - symbol: GeomBndLib_Circle + - symbol: GeomBndLib_Circle2d + - symbol: GeomBndLib_Cone + - symbol: GeomBndLib_Curve + - symbol: GeomBndLib_Curve2d + - symbol: GeomBndLib_Cylinder + - symbol: GeomBndLib_Ellipse + - symbol: GeomBndLib_Ellipse2d + - symbol: GeomBndLib_Hyperbola + - symbol: GeomBndLib_Hyperbola2d + - symbol: GeomBndLib_Line + - symbol: GeomBndLib_Line2d + - symbol: GeomBndLib_OffsetCurve + - symbol: GeomBndLib_OffsetCurve2d + - symbol: GeomBndLib_OffsetSurface + - symbol: GeomBndLib_OtherCurve + - symbol: GeomBndLib_OtherCurve2d + - symbol: GeomBndLib_OtherSurface + - symbol: GeomBndLib_Parabola + - symbol: GeomBndLib_Parabola2d + - symbol: GeomBndLib_Plane + - symbol: GeomBndLib_Sphere + - symbol: GeomBndLib_Surface + - symbol: GeomBndLib_SurfaceOfExtrusion + - symbol: GeomBndLib_SurfaceOfRevolution + - symbol: GeomBndLib_Torus + - symbol: GeomConvert + - symbol: GeomConvert_ApproxCurve + - symbol: GeomConvert_ApproxSurface + - symbol: GeomConvert_BSplineCurveKnotSplitting + - symbol: GeomConvert_BSplineCurveToBezierCurve + - symbol: GeomConvert_BSplineSurfaceKnotSplitting + - symbol: GeomConvert_BSplineSurfaceToBezierSurface + - symbol: GeomConvert_CompBezierSurfacesToBSplineSurface + - symbol: GeomConvert_CompCurveToBSplineCurve + - symbol: GeomConvert_ConvType + - symbol: GeomConvert_CurveToAnaCurve + - symbol: GeomConvert_FuncConeLSDist + - symbol: GeomConvert_FuncCylinderLSDist + - symbol: GeomConvert_FuncSphereLSDist + - symbol: GeomConvert_SurfToAnaSurf + - symbol: GeomConvert_Units + - symbol: GeomEval_AHTBezierCurve + - symbol: GeomEval_AHTBezierSurface + - symbol: GeomEval_CircularHelicoidSurface + - symbol: GeomEval_CircularHelixCurve + - symbol: GeomEval_EllipsoidSurface + - symbol: GeomEval_HypParaboloidSurface + - symbol: GeomEval_HyperboloidSurface + - symbol: GeomEval_ParaboloidSurface + - symbol: GeomEval_RepCurveDesc_Base + - symbol: GeomEval_RepCurveDesc_DerivBounded + - symbol: GeomEval_RepCurveDesc_Domain1d + - symbol: GeomEval_RepCurveDesc_Full + - symbol: GeomEval_RepCurveDesc_Map1d + - symbol: GeomEval_RepCurveDesc_Mapped + - symbol: GeomEval_RepSurfaceDesc_Base + - symbol: GeomEval_RepSurfaceDesc_DerivBounded + - symbol: GeomEval_RepSurfaceDesc_Domain2d + - symbol: GeomEval_RepSurfaceDesc_Full + - symbol: GeomEval_RepSurfaceDesc_Map2d + - symbol: GeomEval_RepSurfaceDesc_Mapped + - symbol: GeomEval_SineWaveCurve + - symbol: GeomEval_TBezierCurve + - symbol: GeomEval_TBezierSurface + - symbol: GeomFill + - symbol: GeomFill_AppSurf + - symbol: GeomFill_AppSweep + - symbol: GeomFill_ApproxStyle + - symbol: GeomFill_BSplineCurves + - symbol: GeomFill_BezierCurves + - symbol: GeomFill_BoundWithSurf + - symbol: GeomFill_Boundary + - symbol: GeomFill_CircularBlendFunc + - symbol: GeomFill_ConstantBiNormal + - symbol: GeomFill_ConstrainedFilling + - symbol: GeomFill_Coons + - symbol: GeomFill_CoonsAlgPatch + - symbol: GeomFill_CornerState + - symbol: GeomFill_CorrectedFrenet + - symbol: GeomFill_CurveAndTrihedron + - symbol: GeomFill_Curved + - symbol: GeomFill_Darboux + - symbol: GeomFill_DegeneratedBound + - symbol: GeomFill_DiscreteTrihedron + - symbol: GeomFill_DraftTrihedron + - symbol: GeomFill_EvolvedSection + - symbol: GeomFill_Filling + - symbol: GeomFill_FillingStyle + - symbol: GeomFill_Fixed + - symbol: GeomFill_Frenet + - symbol: GeomFill_FunctionDraft + - symbol: GeomFill_FunctionGuide + - symbol: GeomFill_Generator + - symbol: GeomFill_Gordon + - symbol: GeomFill_GordonBuilder + - symbol: GeomFill_GuideTrihedronAC + - symbol: GeomFill_GuideTrihedronPlan + - symbol: GeomFill_Line + - symbol: GeomFill_LocFunction + - symbol: GeomFill_LocationDraft + - symbol: GeomFill_LocationGuide + - symbol: GeomFill_LocationLaw + - symbol: GeomFill_Pipe + - symbol: GeomFill_PipeError + - symbol: GeomFill_PlanFunc + - symbol: GeomFill_PolynomialConvertor + - symbol: GeomFill_Profiler + - symbol: GeomFill_QuasiAngularConvertor + - symbol: GeomFill_SectionGenerator + - symbol: GeomFill_SectionLaw + - symbol: GeomFill_SectionPlacement + - symbol: GeomFill_SimpleBound + - symbol: GeomFill_SnglrFunc + - symbol: GeomFill_Stretch + - symbol: GeomFill_Sweep + - symbol: GeomFill_SweepFunction + - symbol: GeomFill_Tensor + - symbol: GeomFill_TgtField + - symbol: GeomFill_TgtOnCoons + - symbol: GeomFill_Trihedron + - symbol: GeomFill_TrihedronLaw + - symbol: GeomFill_TrihedronWithGuide + - symbol: GeomFill_UniformSection + - symbol: GeomHash_CurveHasher + - symbol: GeomHash_SurfaceHasher + - symbol: GeomInt + - symbol: GeomInt_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_IntSS + - symbol: GeomInt_LineConstructor + - symbol: GeomInt_LineTool + - symbol: GeomInt_MyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_MyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_MyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParFunctionOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ParFunctionOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ParLeastSquareOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParameterAndOrientation + - symbol: GeomInt_ResConstraintOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ResConstraintOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_TheImpPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheInt2SOfThePrmPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheMultiLineOfWLApprox + - symbol: GeomInt_TheMultiLineToolOfWLApprox + - symbol: GeomInt_ThePrmPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheZerImpFuncOfTheImpPrmSvSurfacesOfWLApprox + - symbol: GeomInt_WLApprox + - symbol: GeomLProp + - symbol: GeomLProp_CLProps + - symbol: GeomLProp_CLProps2d + - symbol: GeomLProp_CurAndInf2d + - symbol: GeomLProp_SLProps + - symbol: GeomLib + - symbol: GeomLib_Check2dBSplineCurve + - symbol: GeomLib_CheckBSplineCurve + - symbol: GeomLib_CheckCurveOnSurface + - symbol: GeomLib_DenominatorMultiplier + - symbol: GeomLib_Interpolate + - symbol: GeomLib_InterpolationErrors + - symbol: GeomLib_IsPlanarSurface + - symbol: GeomLib_LogSample + - symbol: GeomLib_MakeCurvefromApprox + - symbol: GeomLib_PolyFunc + - symbol: GeomLib_Tool + - symbol: GeomProjLib + - symbol: GeomToIGES_GeomCurve + - symbol: GeomToIGES_GeomEntity + - symbol: GeomToIGES_GeomPoint + - symbol: GeomToIGES_GeomSurface + - symbol: GeomToIGES_GeomVector + - symbol: GeomToStep_MakeAxis1Placement + - symbol: GeomToStep_MakeAxis2Placement2d + - symbol: GeomToStep_MakeAxis2Placement3d + - symbol: GeomToStep_MakeBSplineCurveWithKnots + - symbol: GeomToStep_MakeBSplineCurveWithKnotsAndRationalBSplineCurve + - symbol: GeomToStep_MakeBSplineSurfaceWithKnots + - symbol: GeomToStep_MakeBSplineSurfaceWithKnotsAndRationalBSplineSurface + - symbol: GeomToStep_MakeBoundedCurve + - symbol: GeomToStep_MakeBoundedSurface + - symbol: GeomToStep_MakeCartesianPoint + - symbol: GeomToStep_MakeCartesianTransformationOperator + - symbol: GeomToStep_MakeCircle + - symbol: GeomToStep_MakeConic + - symbol: GeomToStep_MakeConicalSurface + - symbol: GeomToStep_MakeCurve + - symbol: GeomToStep_MakeCylindricalSurface + - symbol: GeomToStep_MakeDirection + - symbol: GeomToStep_MakeElementarySurface + - symbol: GeomToStep_MakeEllipse + - symbol: GeomToStep_MakeHyperbola + - symbol: GeomToStep_MakeLine + - symbol: GeomToStep_MakeParabola + - symbol: GeomToStep_MakePlane + - symbol: GeomToStep_MakePolyline + - symbol: GeomToStep_MakeRectangularTrimmedSurface + - symbol: GeomToStep_MakeSphericalSurface + - symbol: GeomToStep_MakeSurface + - symbol: GeomToStep_MakeSurfaceOfLinearExtrusion + - symbol: GeomToStep_MakeSurfaceOfRevolution + - symbol: GeomToStep_MakeSweptSurface + - symbol: GeomToStep_MakeToroidalSurface + - symbol: GeomToStep_MakeVector + - symbol: GeomToStep_Root + - symbol: GeomTools + - symbol: GeomTools_Curve2dSet + - symbol: GeomTools_CurveSet + - symbol: GeomTools_SurfaceSet + - symbol: Geom_Axis1Placement + - symbol: Geom_Axis2Placement + - symbol: Geom_AxisPlacement + - symbol: Geom_BSplineCurve + - symbol: Geom_BSplineSurface + - symbol: Geom_BezierCurve + - symbol: Geom_BezierSurface + - symbol: Geom_BoundedCurve + - symbol: Geom_BoundedSurface + - symbol: Geom_CartesianPoint + - symbol: Geom_Circle + - symbol: Geom_Conic + - symbol: Geom_ConicalSurface + - symbol: Geom_Curve + - symbol: Geom_CylindricalSurface + - symbol: Geom_Direction + - symbol: Geom_ElementarySurface + - symbol: Geom_Ellipse + - symbol: Geom_Geometry + - symbol: Geom_Hyperbola + - symbol: Geom_Line + - symbol: Geom_OffsetCurve + - symbol: Geom_OffsetSurface + - symbol: Geom_Parabola + - symbol: Geom_Plane + - symbol: Geom_Point + - symbol: Geom_RectangularTrimmedSurface + - symbol: Geom_SphericalSurface + - symbol: Geom_Surface + - symbol: Geom_SurfaceOfLinearExtrusion + - symbol: Geom_SurfaceOfRevolution + - symbol: Geom_SweptSurface + - symbol: Geom_ToroidalSurface + - symbol: Geom_Transformation + - symbol: Geom_TrimmedCurve + - symbol: Geom_UndefinedDerivative + - symbol: Geom_UndefinedValue + - symbol: Geom_Vector + - symbol: Geom_VectorWithMagnitude + - symbol: HLRAlgo + - symbol: HLRAlgo_BiPoint + - symbol: HLRAlgo_BiPoint_PointsT + - symbol: HLRAlgo_EdgeIterator + - symbol: HLRAlgo_EdgeStatus + - symbol: HLRAlgo_EdgesBlock + - symbol: HLRAlgo_EdgesBlock_MinMaxIndices + - symbol: HLRAlgo_Interference + - symbol: HLRAlgo_Intersection + - symbol: HLRAlgo_PolyAlgo + - symbol: HLRAlgo_PolyData + - symbol: HLRAlgo_PolyHidingData + - symbol: HLRAlgo_PolyInternalNode + - symbol: HLRAlgo_PolyInternalSegment + - symbol: HLRAlgo_PolyMask + - symbol: HLRAlgo_PolyShellData + - symbol: HLRAlgo_Projector + - symbol: HLRAlgo_TriangleData + - symbol: HLRAlgo_WiresBlock + - symbol: HLRAppli_ReflectLines + - symbol: HLRBRep + - symbol: HLRBRep_Algo + - symbol: HLRBRep_AreaLimit + - symbol: HLRBRep_BCurveTool + - symbol: HLRBRep_BiPnt2D + - symbol: HLRBRep_BiPoint + - symbol: HLRBRep_CInter + - symbol: HLRBRep_CLPropsATool + - symbol: HLRBRep_Curve + - symbol: HLRBRep_CurveTool + - symbol: HLRBRep_EdgeBuilder + - symbol: HLRBRep_EdgeData + - symbol: HLRBRep_EdgeFaceTool + - symbol: HLRBRep_EdgeIList + - symbol: HLRBRep_EdgeInterferenceTool + - symbol: HLRBRep_ExactIntersectionPointOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_FaceData + - symbol: HLRBRep_FaceIterator + - symbol: HLRBRep_HLRToShape + - symbol: HLRBRep_Hider + - symbol: HLRBRep_IntConicCurveOfCInter + - symbol: HLRBRep_InterCSurf + - symbol: HLRBRep_InternalAlgo + - symbol: HLRBRep_LineTool + - symbol: HLRBRep_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfCInter + - symbol: HLRBRep_PolyAlgo + - symbol: HLRBRep_PolyHLRToShape + - symbol: HLRBRep_SLProps + - symbol: HLRBRep_SLPropsATool + - symbol: HLRBRep_ShapeBounds + - symbol: HLRBRep_ShapeToHLR + - symbol: HLRBRep_SurfaceTool + - symbol: HLRBRep_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_TheExactInterCSurf + - symbol: HLRBRep_TheIntConicCurveOfCInter + - symbol: HLRBRep_TheIntPCurvePCurveOfCInter + - symbol: HLRBRep_TheInterferenceOfInterCSurf + - symbol: HLRBRep_TheIntersectorOfTheIntConicCurveOfCInter + - symbol: HLRBRep_ThePolygon2dOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_ThePolygonOfInterCSurf + - symbol: HLRBRep_ThePolygonToolOfInterCSurf + - symbol: HLRBRep_ThePolyhedronToolOfInterCSurf + - symbol: HLRBRep_TheProjPCurOfCInter + - symbol: HLRBRep_TheQuadCurvExactInterCSurf + - symbol: HLRBRep_TheQuadCurvFuncOfTheQuadCurvExactInterCSurf + - symbol: HLRBRep_TypeOfResultingEdge + - symbol: HLRBRep_VertexList + - symbol: HLRTopoBRep_DSFiller + - symbol: HLRTopoBRep_Data + - symbol: HLRTopoBRep_FaceData + - symbol: HLRTopoBRep_FaceIsoLiner + - symbol: HLRTopoBRep_OutLiner + - symbol: HLRTopoBRep_VData + - symbol: HatchGen_Domain + - symbol: HatchGen_ErrorStatus + - symbol: HatchGen_IntersectionPoint + - symbol: HatchGen_IntersectionType + - symbol: HatchGen_PointOnElement + - symbol: HatchGen_PointOnHatching + - symbol: Hatch_Hatcher + - symbol: Hatch_Line + - symbol: Hatch_LineForm + - symbol: Hatch_Parameter + - symbol: HelixBRep_BuilderHelix + - symbol: HelixGeom_BuilderApproxCurve + - symbol: HelixGeom_BuilderHelix + - symbol: HelixGeom_BuilderHelixCoil + - symbol: HelixGeom_BuilderHelixGen + - symbol: HelixGeom_HelixCurve + - symbol: HelixGeom_Tools + - symbol: Hermit + - symbol: IFGraph_AllConnected + - symbol: IFGraph_AllShared + - symbol: IFGraph_Articulations + - symbol: IFGraph_Compare + - symbol: IFGraph_ConnectedComponants + - symbol: IFGraph_Cumulate + - symbol: IFGraph_Cycles + - symbol: IFGraph_ExternalSources + - symbol: IFGraph_SCRoots + - symbol: IFGraph_StrongComponants + - symbol: IFGraph_SubPartsIterator + - symbol: IFSelect + - symbol: IFSelect_Act + - symbol: IFSelect_Activator + - symbol: IFSelect_AppliedModifiers + - symbol: IFSelect_BasicDumper + - symbol: IFSelect_CheckCounter + - symbol: IFSelect_ContextWrite + - symbol: IFSelect_DispGlobal + - symbol: IFSelect_DispPerCount + - symbol: IFSelect_DispPerFiles + - symbol: IFSelect_DispPerOne + - symbol: IFSelect_DispPerSignature + - symbol: IFSelect_Dispatch + - symbol: IFSelect_EditValue + - symbol: IFSelect_Editor + - symbol: IFSelect_Functions + - symbol: IFSelect_GeneralModifier + - symbol: IFSelect_GraphCounter + - symbol: IFSelect_ListEditor + - symbol: IFSelect_ModelCopier + - symbol: IFSelect_ModifEditForm + - symbol: IFSelect_ModifReorder + - symbol: IFSelect_Modifier + - symbol: IFSelect_PacketList + - symbol: IFSelect_ParamEditor + - symbol: IFSelect_PrintCount + - symbol: IFSelect_PrintFail + - symbol: IFSelect_RemainMode + - symbol: IFSelect_ReturnStatus + - symbol: IFSelect_SelectAnyList + - symbol: IFSelect_SelectAnyType + - symbol: IFSelect_SelectBase + - symbol: IFSelect_SelectCombine + - symbol: IFSelect_SelectControl + - symbol: IFSelect_SelectDeduct + - symbol: IFSelect_SelectDiff + - symbol: IFSelect_SelectEntityNumber + - symbol: IFSelect_SelectErrorEntities + - symbol: IFSelect_SelectExplore + - symbol: IFSelect_SelectExtract + - symbol: IFSelect_SelectFlag + - symbol: IFSelect_SelectInList + - symbol: IFSelect_SelectIncorrectEntities + - symbol: IFSelect_SelectIntersection + - symbol: IFSelect_SelectModelEntities + - symbol: IFSelect_SelectModelRoots + - symbol: IFSelect_SelectPointed + - symbol: IFSelect_SelectRange + - symbol: IFSelect_SelectRootComps + - symbol: IFSelect_SelectRoots + - symbol: IFSelect_SelectSent + - symbol: IFSelect_SelectShared + - symbol: IFSelect_SelectSharing + - symbol: IFSelect_SelectSignature + - symbol: IFSelect_SelectSignedShared + - symbol: IFSelect_SelectSignedSharing + - symbol: IFSelect_SelectSuite + - symbol: IFSelect_SelectType + - symbol: IFSelect_SelectUnion + - symbol: IFSelect_SelectUnknownEntities + - symbol: IFSelect_Selection + - symbol: IFSelect_SelectionIterator + - symbol: IFSelect_SessionDumper + - symbol: IFSelect_SessionFile + - symbol: IFSelect_SessionPilot + - symbol: IFSelect_ShareOut + - symbol: IFSelect_ShareOutResult + - symbol: IFSelect_SignAncestor + - symbol: IFSelect_SignCategory + - symbol: IFSelect_SignCounter + - symbol: IFSelect_SignMultiple + - symbol: IFSelect_SignType + - symbol: IFSelect_SignValidity + - symbol: IFSelect_Signature + - symbol: IFSelect_SignatureList + - symbol: IFSelect_TransformStandard + - symbol: IFSelect_Transformer + - symbol: IFSelect_WorkLibrary + - symbol: IFSelect_WorkSession + - symbol: IGESAppli + - symbol: IGESAppli_DrilledHole + - symbol: IGESAppli_ElementResults + - symbol: IGESAppli_FiniteElement + - symbol: IGESAppli_Flow + - symbol: IGESAppli_FlowLineSpec + - symbol: IGESAppli_GeneralModule + - symbol: IGESAppli_LevelFunction + - symbol: IGESAppli_LevelToPWBLayerMap + - symbol: IGESAppli_LineWidening + - symbol: IGESAppli_NodalConstraint + - symbol: IGESAppli_NodalDisplAndRot + - symbol: IGESAppli_NodalResults + - symbol: IGESAppli_Node + - symbol: IGESAppli_PWBArtworkStackup + - symbol: IGESAppli_PWBDrilledHole + - symbol: IGESAppli_PartNumber + - symbol: IGESAppli_PinNumber + - symbol: IGESAppli_PipingFlow + - symbol: IGESAppli_Protocol + - symbol: IGESAppli_ReadWriteModule + - symbol: IGESAppli_ReferenceDesignator + - symbol: IGESAppli_RegionRestriction + - symbol: IGESAppli_SpecificModule + - symbol: IGESAppli_ToolDrilledHole + - symbol: IGESAppli_ToolElementResults + - symbol: IGESAppli_ToolFiniteElement + - symbol: IGESAppli_ToolFlow + - symbol: IGESAppli_ToolFlowLineSpec + - symbol: IGESAppli_ToolLevelFunction + - symbol: IGESAppli_ToolLevelToPWBLayerMap + - symbol: IGESAppli_ToolLineWidening + - symbol: IGESAppli_ToolNodalConstraint + - symbol: IGESAppli_ToolNodalDisplAndRot + - symbol: IGESAppli_ToolNodalResults + - symbol: IGESAppli_ToolNode + - symbol: IGESAppli_ToolPWBArtworkStackup + - symbol: IGESAppli_ToolPWBDrilledHole + - symbol: IGESAppli_ToolPartNumber + - symbol: IGESAppli_ToolPinNumber + - symbol: IGESAppli_ToolPipingFlow + - symbol: IGESAppli_ToolReferenceDesignator + - symbol: IGESAppli_ToolRegionRestriction + - symbol: IGESBasic + - symbol: IGESBasic_AssocGroupType + - symbol: IGESBasic_ExternalRefFile + - symbol: IGESBasic_ExternalRefFileIndex + - symbol: IGESBasic_ExternalRefFileName + - symbol: IGESBasic_ExternalRefLibName + - symbol: IGESBasic_ExternalRefName + - symbol: IGESBasic_ExternalReferenceFile + - symbol: IGESBasic_GeneralModule + - symbol: IGESBasic_Group + - symbol: IGESBasic_GroupWithoutBackP + - symbol: IGESBasic_HArray1OfHArray1OfIGESEntity + - symbol: IGESBasic_HArray1OfHArray1OfInteger + - symbol: IGESBasic_HArray1OfHArray1OfReal + - symbol: IGESBasic_HArray1OfHArray1OfXY + - symbol: IGESBasic_HArray1OfHArray1OfXYZ + - symbol: IGESBasic_Hierarchy + - symbol: IGESBasic_Name + - symbol: IGESBasic_OrderedGroup + - symbol: IGESBasic_OrderedGroupWithoutBackP + - symbol: IGESBasic_Protocol + - symbol: IGESBasic_ReadWriteModule + - symbol: IGESBasic_SingleParent + - symbol: IGESBasic_SingularSubfigure + - symbol: IGESBasic_SpecificModule + - symbol: IGESBasic_SubfigureDef + - symbol: IGESBasic_ToolAssocGroupType + - symbol: IGESBasic_ToolExternalRefFile + - symbol: IGESBasic_ToolExternalRefFileIndex + - symbol: IGESBasic_ToolExternalRefFileName + - symbol: IGESBasic_ToolExternalRefLibName + - symbol: IGESBasic_ToolExternalRefName + - symbol: IGESBasic_ToolExternalReferenceFile + - symbol: IGESBasic_ToolGroup + - symbol: IGESBasic_ToolGroupWithoutBackP + - symbol: IGESBasic_ToolHierarchy + - symbol: IGESBasic_ToolName + - symbol: IGESBasic_ToolOrderedGroup + - symbol: IGESBasic_ToolOrderedGroupWithoutBackP + - symbol: IGESBasic_ToolSingleParent + - symbol: IGESBasic_ToolSingularSubfigure + - symbol: IGESBasic_ToolSubfigureDef + - symbol: IGESCAFControl + - symbol: IGESCAFControl_Reader + - symbol: IGESCAFControl_Writer + - symbol: IGESControl_ActorWrite + - symbol: IGESControl_AlgoContainer + - symbol: IGESControl_Controller + - symbol: IGESControl_IGESBoundary + - symbol: IGESControl_Reader + - symbol: IGESControl_ToolContainer + - symbol: IGESControl_Writer + - symbol: IGESConvGeom + - symbol: IGESConvGeom_GeomBuilder + - symbol: IGESData + - symbol: IGESData_BasicEditor + - symbol: IGESData_ColorEntity + - symbol: IGESData_DefList + - symbol: IGESData_DefSwitch + - symbol: IGESData_DefType + - symbol: IGESData_DefaultGeneral + - symbol: IGESData_DefaultSpecific + - symbol: IGESData_DirChecker + - symbol: IGESData_DirPart + - symbol: IGESData_FileProtocol + - symbol: IGESData_FileRecognizer + - symbol: IGESData_GeneralModule + - symbol: IGESData_GlobalNodeOfSpecificLib + - symbol: IGESData_GlobalNodeOfWriterLib + - symbol: IGESData_GlobalSection + - symbol: IGESData_IGESDumper + - symbol: IGESData_IGESEntity + - symbol: IGESData_IGESModel + - symbol: IGESData_IGESReaderTool + - symbol: IGESData_IGESType + - symbol: IGESData_IGESWriter + - symbol: IGESData_LabelDisplayEntity + - symbol: IGESData_LevelListEntity + - symbol: IGESData_LineFontEntity + - symbol: IGESData_NameEntity + - symbol: IGESData_NodeOfSpecificLib + - symbol: IGESData_NodeOfWriterLib + - symbol: IGESData_ParamCursor + - symbol: IGESData_Protocol + - symbol: IGESData_ReadStage + - symbol: IGESData_ReadWriteModule + - symbol: IGESData_SingleParentEntity + - symbol: IGESData_SpecificLib + - symbol: IGESData_SpecificModule + - symbol: IGESData_Status + - symbol: IGESData_ToolLocation + - symbol: IGESData_TransfEntity + - symbol: IGESData_UndefinedEntity + - symbol: IGESData_ViewKindEntity + - symbol: IGESData_WriterLib + - symbol: IGESDefs + - symbol: IGESDefs_AssociativityDef + - symbol: IGESDefs_AttributeDef + - symbol: IGESDefs_AttributeTable + - symbol: IGESDefs_GeneralModule + - symbol: IGESDefs_GenericData + - symbol: IGESDefs_HArray1OfHArray1OfTextDisplayTemplate + - symbol: IGESDefs_MacroDef + - symbol: IGESDefs_Protocol + - symbol: IGESDefs_ReadWriteModule + - symbol: IGESDefs_SpecificModule + - symbol: IGESDefs_TabularData + - symbol: IGESDefs_ToolAssociativityDef + - symbol: IGESDefs_ToolAttributeDef + - symbol: IGESDefs_ToolAttributeTable + - symbol: IGESDefs_ToolGenericData + - symbol: IGESDefs_ToolMacroDef + - symbol: IGESDefs_ToolTabularData + - symbol: IGESDefs_ToolUnitsData + - symbol: IGESDefs_UnitsData + - symbol: IGESDimen + - symbol: IGESDimen_AngularDimension + - symbol: IGESDimen_BasicDimension + - symbol: IGESDimen_CenterLine + - symbol: IGESDimen_CurveDimension + - symbol: IGESDimen_DiameterDimension + - symbol: IGESDimen_DimensionDisplayData + - symbol: IGESDimen_DimensionTolerance + - symbol: IGESDimen_DimensionUnits + - symbol: IGESDimen_DimensionedGeometry + - symbol: IGESDimen_FlagNote + - symbol: IGESDimen_GeneralLabel + - symbol: IGESDimen_GeneralModule + - symbol: IGESDimen_GeneralNote + - symbol: IGESDimen_GeneralSymbol + - symbol: IGESDimen_LeaderArrow + - symbol: IGESDimen_LinearDimension + - symbol: IGESDimen_NewDimensionedGeometry + - symbol: IGESDimen_NewGeneralNote + - symbol: IGESDimen_OrdinateDimension + - symbol: IGESDimen_PointDimension + - symbol: IGESDimen_Protocol + - symbol: IGESDimen_RadiusDimension + - symbol: IGESDimen_ReadWriteModule + - symbol: IGESDimen_Section + - symbol: IGESDimen_SectionedArea + - symbol: IGESDimen_SpecificModule + - symbol: IGESDimen_ToolAngularDimension + - symbol: IGESDimen_ToolBasicDimension + - symbol: IGESDimen_ToolCenterLine + - symbol: IGESDimen_ToolCurveDimension + - symbol: IGESDimen_ToolDiameterDimension + - symbol: IGESDimen_ToolDimensionDisplayData + - symbol: IGESDimen_ToolDimensionTolerance + - symbol: IGESDimen_ToolDimensionUnits + - symbol: IGESDimen_ToolDimensionedGeometry + - symbol: IGESDimen_ToolFlagNote + - symbol: IGESDimen_ToolGeneralLabel + - symbol: IGESDimen_ToolGeneralNote + - symbol: IGESDimen_ToolGeneralSymbol + - symbol: IGESDimen_ToolLeaderArrow + - symbol: IGESDimen_ToolLinearDimension + - symbol: IGESDimen_ToolNewDimensionedGeometry + - symbol: IGESDimen_ToolNewGeneralNote + - symbol: IGESDimen_ToolOrdinateDimension + - symbol: IGESDimen_ToolPointDimension + - symbol: IGESDimen_ToolRadiusDimension + - symbol: IGESDimen_ToolSection + - symbol: IGESDimen_ToolSectionedArea + - symbol: IGESDimen_ToolWitnessLine + - symbol: IGESDimen_WitnessLine + - symbol: IGESDraw + - symbol: IGESDraw_CircArraySubfigure + - symbol: IGESDraw_ConnectPoint + - symbol: IGESDraw_Drawing + - symbol: IGESDraw_DrawingWithRotation + - symbol: IGESDraw_GeneralModule + - symbol: IGESDraw_LabelDisplay + - symbol: IGESDraw_NetworkSubfigure + - symbol: IGESDraw_NetworkSubfigureDef + - symbol: IGESDraw_PerspectiveView + - symbol: IGESDraw_Planar + - symbol: IGESDraw_Protocol + - symbol: IGESDraw_ReadWriteModule + - symbol: IGESDraw_RectArraySubfigure + - symbol: IGESDraw_SegmentedViewsVisible + - symbol: IGESDraw_SpecificModule + - symbol: IGESDraw_ToolCircArraySubfigure + - symbol: IGESDraw_ToolConnectPoint + - symbol: IGESDraw_ToolDrawing + - symbol: IGESDraw_ToolDrawingWithRotation + - symbol: IGESDraw_ToolLabelDisplay + - symbol: IGESDraw_ToolNetworkSubfigure + - symbol: IGESDraw_ToolNetworkSubfigureDef + - symbol: IGESDraw_ToolPerspectiveView + - symbol: IGESDraw_ToolPlanar + - symbol: IGESDraw_ToolRectArraySubfigure + - symbol: IGESDraw_ToolSegmentedViewsVisible + - symbol: IGESDraw_ToolView + - symbol: IGESDraw_ToolViewsVisible + - symbol: IGESDraw_ToolViewsVisibleWithAttr + - symbol: IGESDraw_View + - symbol: IGESDraw_ViewsVisible + - symbol: IGESDraw_ViewsVisibleWithAttr + - symbol: IGESGeom + - symbol: IGESGeom_BSplineCurve + - symbol: IGESGeom_BSplineSurface + - symbol: IGESGeom_Boundary + - symbol: IGESGeom_BoundedSurface + - symbol: IGESGeom_CircularArc + - symbol: IGESGeom_CompositeCurve + - symbol: IGESGeom_ConicArc + - symbol: IGESGeom_CopiousData + - symbol: IGESGeom_CurveOnSurface + - symbol: IGESGeom_Direction + - symbol: IGESGeom_Flash + - symbol: IGESGeom_GeneralModule + - symbol: IGESGeom_Line + - symbol: IGESGeom_OffsetCurve + - symbol: IGESGeom_OffsetSurface + - symbol: IGESGeom_Plane + - symbol: IGESGeom_Point + - symbol: IGESGeom_Protocol + - symbol: IGESGeom_ReadWriteModule + - symbol: IGESGeom_RuledSurface + - symbol: IGESGeom_SpecificModule + - symbol: IGESGeom_SplineCurve + - symbol: IGESGeom_SplineSurface + - symbol: IGESGeom_SurfaceOfRevolution + - symbol: IGESGeom_TabulatedCylinder + - symbol: IGESGeom_ToolBSplineCurve + - symbol: IGESGeom_ToolBSplineSurface + - symbol: IGESGeom_ToolBoundary + - symbol: IGESGeom_ToolBoundedSurface + - symbol: IGESGeom_ToolCircularArc + - symbol: IGESGeom_ToolCompositeCurve + - symbol: IGESGeom_ToolConicArc + - symbol: IGESGeom_ToolCopiousData + - symbol: IGESGeom_ToolCurveOnSurface + - symbol: IGESGeom_ToolDirection + - symbol: IGESGeom_ToolFlash + - symbol: IGESGeom_ToolLine + - symbol: IGESGeom_ToolOffsetCurve + - symbol: IGESGeom_ToolOffsetSurface + - symbol: IGESGeom_ToolPlane + - symbol: IGESGeom_ToolPoint + - symbol: IGESGeom_ToolRuledSurface + - symbol: IGESGeom_ToolSplineCurve + - symbol: IGESGeom_ToolSplineSurface + - symbol: IGESGeom_ToolSurfaceOfRevolution + - symbol: IGESGeom_ToolTabulatedCylinder + - symbol: IGESGeom_ToolTransformationMatrix + - symbol: IGESGeom_ToolTrimmedSurface + - symbol: IGESGeom_TransformationMatrix + - symbol: IGESGeom_TrimmedSurface + - symbol: IGESGraph + - symbol: IGESGraph_Color + - symbol: IGESGraph_DefinitionLevel + - symbol: IGESGraph_DrawingSize + - symbol: IGESGraph_DrawingUnits + - symbol: IGESGraph_GeneralModule + - symbol: IGESGraph_HighLight + - symbol: IGESGraph_IntercharacterSpacing + - symbol: IGESGraph_LineFontDefPattern + - symbol: IGESGraph_LineFontDefTemplate + - symbol: IGESGraph_LineFontPredefined + - symbol: IGESGraph_NominalSize + - symbol: IGESGraph_Pick + - symbol: IGESGraph_Protocol + - symbol: IGESGraph_ReadWriteModule + - symbol: IGESGraph_SpecificModule + - symbol: IGESGraph_TextDisplayTemplate + - symbol: IGESGraph_TextFontDef + - symbol: IGESGraph_ToolColor + - symbol: IGESGraph_ToolDefinitionLevel + - symbol: IGESGraph_ToolDrawingSize + - symbol: IGESGraph_ToolDrawingUnits + - symbol: IGESGraph_ToolHighLight + - symbol: IGESGraph_ToolIntercharacterSpacing + - symbol: IGESGraph_ToolLineFontDefPattern + - symbol: IGESGraph_ToolLineFontDefTemplate + - symbol: IGESGraph_ToolLineFontPredefined + - symbol: IGESGraph_ToolNominalSize + - symbol: IGESGraph_ToolPick + - symbol: IGESGraph_ToolTextDisplayTemplate + - symbol: IGESGraph_ToolTextFontDef + - symbol: IGESGraph_ToolUniformRectGrid + - symbol: IGESGraph_UniformRectGrid + - symbol: IGESSelect + - symbol: IGESSelect_Activator + - symbol: IGESSelect_AddFileComment + - symbol: IGESSelect_AddGroup + - symbol: IGESSelect_AutoCorrect + - symbol: IGESSelect_ChangeLevelList + - symbol: IGESSelect_ChangeLevelNumber + - symbol: IGESSelect_ComputeStatus + - symbol: IGESSelect_CounterOfLevelNumber + - symbol: IGESSelect_DispPerDrawing + - symbol: IGESSelect_DispPerSingleView + - symbol: IGESSelect_Dumper + - symbol: IGESSelect_EditDirPart + - symbol: IGESSelect_EditHeader + - symbol: IGESSelect_FileModifier + - symbol: IGESSelect_FloatFormat + - symbol: IGESSelect_IGESName + - symbol: IGESSelect_IGESTypeForm + - symbol: IGESSelect_ModelModifier + - symbol: IGESSelect_RebuildDrawings + - symbol: IGESSelect_RebuildGroups + - symbol: IGESSelect_RemoveCurves + - symbol: IGESSelect_SelectBypassGroup + - symbol: IGESSelect_SelectBypassSubfigure + - symbol: IGESSelect_SelectDrawingFrom + - symbol: IGESSelect_SelectFaces + - symbol: IGESSelect_SelectFromDrawing + - symbol: IGESSelect_SelectFromSingleView + - symbol: IGESSelect_SelectLevelNumber + - symbol: IGESSelect_SelectName + - symbol: IGESSelect_SelectPCurves + - symbol: IGESSelect_SelectSingleViewFrom + - symbol: IGESSelect_SelectSubordinate + - symbol: IGESSelect_SelectVisibleStatus + - symbol: IGESSelect_SetGlobalParameter + - symbol: IGESSelect_SetLabel + - symbol: IGESSelect_SetVersion5 + - symbol: IGESSelect_SignColor + - symbol: IGESSelect_SignLevelNumber + - symbol: IGESSelect_SignStatus + - symbol: IGESSelect_SplineToBSpline + - symbol: IGESSelect_UpdateCreationDate + - symbol: IGESSelect_UpdateFileName + - symbol: IGESSelect_UpdateLastChange + - symbol: IGESSelect_ViewSorter + - symbol: IGESSelect_WorkLibrary + - symbol: IGESSolid + - symbol: IGESSolid_Block + - symbol: IGESSolid_BooleanTree + - symbol: IGESSolid_ConeFrustum + - symbol: IGESSolid_ConicalSurface + - symbol: IGESSolid_Cylinder + - symbol: IGESSolid_CylindricalSurface + - symbol: IGESSolid_EdgeList + - symbol: IGESSolid_Ellipsoid + - symbol: IGESSolid_Face + - symbol: IGESSolid_GeneralModule + - symbol: IGESSolid_Loop + - symbol: IGESSolid_ManifoldSolid + - symbol: IGESSolid_PlaneSurface + - symbol: IGESSolid_Protocol + - symbol: IGESSolid_ReadWriteModule + - symbol: IGESSolid_RightAngularWedge + - symbol: IGESSolid_SelectedComponent + - symbol: IGESSolid_Shell + - symbol: IGESSolid_SolidAssembly + - symbol: IGESSolid_SolidInstance + - symbol: IGESSolid_SolidOfLinearExtrusion + - symbol: IGESSolid_SolidOfRevolution + - symbol: IGESSolid_SpecificModule + - symbol: IGESSolid_Sphere + - symbol: IGESSolid_SphericalSurface + - symbol: IGESSolid_ToolBlock + - symbol: IGESSolid_ToolBooleanTree + - symbol: IGESSolid_ToolConeFrustum + - symbol: IGESSolid_ToolConicalSurface + - symbol: IGESSolid_ToolCylinder + - symbol: IGESSolid_ToolCylindricalSurface + - symbol: IGESSolid_ToolEdgeList + - symbol: IGESSolid_ToolEllipsoid + - symbol: IGESSolid_ToolFace + - symbol: IGESSolid_ToolLoop + - symbol: IGESSolid_ToolManifoldSolid + - symbol: IGESSolid_ToolPlaneSurface + - symbol: IGESSolid_ToolRightAngularWedge + - symbol: IGESSolid_ToolSelectedComponent + - symbol: IGESSolid_ToolShell + - symbol: IGESSolid_ToolSolidAssembly + - symbol: IGESSolid_ToolSolidInstance + - symbol: IGESSolid_ToolSolidOfLinearExtrusion + - symbol: IGESSolid_ToolSolidOfRevolution + - symbol: IGESSolid_ToolSphere + - symbol: IGESSolid_ToolSphericalSurface + - symbol: IGESSolid_ToolToroidalSurface + - symbol: IGESSolid_ToolTorus + - symbol: IGESSolid_ToolVertexList + - symbol: IGESSolid_TopoBuilder + - symbol: IGESSolid_ToroidalSurface + - symbol: IGESSolid_Torus + - symbol: IGESSolid_VertexList + - symbol: IGESToBRep + - symbol: IGESToBRep_Actor + - symbol: IGESToBRep_AlgoContainer + - symbol: IGESToBRep_BRepEntity + - symbol: IGESToBRep_BasicCurve + - symbol: IGESToBRep_BasicSurface + - symbol: IGESToBRep_CurveAndSurface + - symbol: IGESToBRep_IGESBoundary + - symbol: IGESToBRep_Reader + - symbol: IGESToBRep_ToolContainer + - symbol: IGESToBRep_TopoCurve + - symbol: IMeshData_Array1OfInteger + - symbol: IMeshData_Array1OfVertexOfDelaun + - symbol: IMeshData_BndBox2dTree + - symbol: IMeshData_BndBox2dTreeFiller + - symbol: IMeshData_CircleCellFilter + - symbol: IMeshData_Curve + - symbol: IMeshData_DMapOfIFacePtrsListOfInteger + - symbol: IMeshData_DMapOfIFacePtrsMapOfIEdgePtrs + - symbol: IMeshData_DMapOfIntegerListOfInteger + - symbol: IMeshData_DMapOfShapeInteger + - symbol: IMeshData_IDMapOfIFacePtrsListOfIPCurves + - symbol: IMeshData_IDMapOfLink + - symbol: IMeshData_IMapOfReal + - symbol: IMeshData_ListOfIPCurves + - symbol: IMeshData_ListOfInteger + - symbol: IMeshData_ListOfPnt2d + - symbol: IMeshData_MapOfIEdgePtr + - symbol: IMeshData_MapOfIFacePtr + - symbol: IMeshData_MapOfInteger + - symbol: IMeshData_MapOfIntegerInteger + - symbol: IMeshData_MapOfOrientedEdges + - symbol: IMeshData_MapOfReal + - symbol: IMeshData_Model + - symbol: IMeshData_PCurve + - symbol: IMeshData_ParametersList + - symbol: IMeshData_SequenceOfBndB2d + - symbol: IMeshData_SequenceOfInteger + - symbol: IMeshData_SequenceOfReal + - symbol: IMeshData_Shape + - symbol: IMeshData_Status + - symbol: IMeshData_StatusOwner + - symbol: IMeshData_TessellatedShape + - symbol: IMeshData_VectorOfBoolean + - symbol: IMeshData_VectorOfCircle + - symbol: IMeshData_VectorOfElements + - symbol: IMeshData_VectorOfIEdgeHandles + - symbol: IMeshData_VectorOfIEdgePtrs + - symbol: IMeshData_VectorOfIFaceHandles + - symbol: IMeshData_VectorOfIPCurveHandles + - symbol: IMeshData_VectorOfIWireHandles + - symbol: IMeshData_VectorOfInteger + - symbol: IMeshData_VectorOfOrientation + - symbol: IMeshData_VectorOfVertex + - symbol: IMeshData_VertexCellFilter + - symbol: IMeshTools_Context + - symbol: IMeshTools_CurveTessellator + - symbol: IMeshTools_MeshAlgo + - symbol: IMeshTools_MeshAlgoFactory + - symbol: IMeshTools_MeshAlgoType + - symbol: IMeshTools_MeshBuilder + - symbol: IMeshTools_ModelAlgo + - symbol: IMeshTools_ModelBuilder + - symbol: IMeshTools_Parameters + - symbol: IMeshTools_ShapeExplorer + - symbol: IMeshTools_ShapeVisitor + - symbol: IntAna2d_AnaIntersection + - symbol: IntAna2d_Conic + - symbol: IntAna2d_IntPoint + - symbol: IntAna_Curve + - symbol: IntAna_Int3Pln + - symbol: IntAna_IntConicQuad + - symbol: IntAna_IntLinTorus + - symbol: IntAna_IntQuadQuad + - symbol: IntAna_QuadQuadGeo + - symbol: IntAna_Quadric + - symbol: IntAna_ResultType + - symbol: IntCurveSurface_HInter + - symbol: IntCurveSurface_Intersection + - symbol: IntCurveSurface_IntersectionSegment + - symbol: IntCurveSurface_TheCSFunctionOfHInter + - symbol: IntCurveSurface_TheExactHInter + - symbol: IntCurveSurface_TheHCurveTool + - symbol: IntCurveSurface_TheInterferenceOfHInter + - symbol: IntCurveSurface_ThePolygonOfHInter + - symbol: IntCurveSurface_ThePolygonToolOfHInter + - symbol: IntCurveSurface_ThePolyhedronToolOfHInter + - symbol: IntCurveSurface_TheQuadCurvExactHInter + - symbol: IntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter + - symbol: IntCurveSurface_TransitionOnCurve + - symbol: IntCurve_IConicTool + - symbol: IntCurve_IntConicConic + - symbol: IntCurve_IntImpConicParConic + - symbol: IntCurve_MyImpParToolOfIntImpConicParConic + - symbol: IntCurve_PConic + - symbol: IntCurve_PConicTool + - symbol: IntCurve_ProjectOnPConicTool + - symbol: IntCurvesFace_Intersector + - symbol: IntCurvesFace_ShapeIntersector + - symbol: IntImp_ConstIsoparametric + - symbol: IntPatch_ALine + - symbol: IntPatch_ALineToWLine + - symbol: IntPatch_ArcFunction + - symbol: IntPatch_BVHTraversal + - symbol: IntPatch_BVHTraversal_TrianglePair + - symbol: IntPatch_CSFunction + - symbol: IntPatch_CurvIntSurf + - symbol: IntPatch_GLine + - symbol: IntPatch_HCurve2dTool + - symbol: IntPatch_HInterTool + - symbol: IntPatch_IType + - symbol: IntPatch_ImpImpIntersection + - symbol: IntPatch_ImpPrmIntersection + - symbol: IntPatch_InterferencePolyhedron + - symbol: IntPatch_Intersection + - symbol: IntPatch_Line + - symbol: IntPatch_LineConstructor + - symbol: IntPatch_Point + - symbol: IntPatch_PointLine + - symbol: IntPatch_PolyArc + - symbol: IntPatch_PolyLine + - symbol: IntPatch_Polygo + - symbol: IntPatch_PolyhedronBVH + - symbol: IntPatch_PolyhedronTool + - symbol: IntPatch_PrmPrmIntersection + - symbol: IntPatch_PrmPrmIntersection_T3Bits + - symbol: IntPatch_RstInt + - symbol: IntPatch_SpecPntType + - symbol: IntPatch_SpecialPoints + - symbol: IntPatch_TheIWLineOfTheIWalking + - symbol: IntPatch_TheIWalking + - symbol: IntPatch_ThePathPointOfTheSOnBounds + - symbol: IntPatch_TheSOnBounds + - symbol: IntPatch_TheSearchInside + - symbol: IntPatch_TheSegmentOfTheSOnBounds + - symbol: IntPatch_TheSurfFunction + - symbol: IntPatch_WLine + - symbol: IntPatch_WLineTool + - symbol: IntPolyh_Couple + - symbol: IntPolyh_Edge + - symbol: IntPolyh_Intersection + - symbol: IntPolyh_Point + - symbol: IntPolyh_PointNormal + - symbol: IntPolyh_SectionLine + - symbol: IntPolyh_StartPoint + - symbol: IntPolyh_Tools + - symbol: IntPolyh_Triangle + - symbol: IntRes2d_Domain + - symbol: IntRes2d_Intersection + - symbol: IntRes2d_IntersectionPoint + - symbol: IntRes2d_IntersectionSegment + - symbol: IntRes2d_Position + - symbol: IntRes2d_Situation + - symbol: IntRes2d_Transition + - symbol: IntRes2d_TypeTrans + - symbol: IntStart_SITopolTool + - symbol: IntSurf + - symbol: IntSurf_Couple + - symbol: IntSurf_InteriorPoint + - symbol: IntSurf_InteriorPointTool + - symbol: IntSurf_LineOn2S + - symbol: IntSurf_PathPoint + - symbol: IntSurf_PathPointTool + - symbol: IntSurf_PntOn2S + - symbol: IntSurf_Quadric + - symbol: IntSurf_QuadricTool + - symbol: IntSurf_Situation + - symbol: IntSurf_Transition + - symbol: IntSurf_TypeTrans + - symbol: IntTools + - symbol: IntTools_BaseRangeSample + - symbol: IntTools_BeanFaceIntersector + - symbol: IntTools_CommonPrt + - symbol: IntTools_Context + - symbol: IntTools_Curve + - symbol: IntTools_CurveRangeLocalizeData + - symbol: IntTools_CurveRangeSample + - symbol: IntTools_EdgeEdge + - symbol: IntTools_EdgeFace + - symbol: IntTools_FClass2d + - symbol: IntTools_FaceFace + - symbol: IntTools_MarkedRangeSet + - symbol: IntTools_PntOn2Faces + - symbol: IntTools_Range + - symbol: IntTools_Root + - symbol: IntTools_ShrunkRange + - symbol: IntTools_SurfaceRangeLocalizeData + - symbol: IntTools_SurfaceRangeSample + - symbol: IntTools_Tools + - symbol: IntTools_TopolTool + - symbol: IntTools_WLineTool + - symbol: IntWalk_StatusDeflection + - symbol: IntWalk_TheInt2S + - symbol: IntWalk_VectorOfInteger + - symbol: IntWalk_VectorOfWalkingData + - symbol: IntWalk_WalkingData + - symbol: Interface_BitMap + - symbol: Interface_Category + - symbol: Interface_Check + - symbol: Interface_CheckFailure + - symbol: Interface_CheckIterator + - symbol: Interface_CheckStatus + - symbol: Interface_CheckTool + - symbol: Interface_CopyControl + - symbol: Interface_CopyMap + - symbol: Interface_CopyTool + - symbol: Interface_DataState + - symbol: Interface_EntityCluster + - symbol: Interface_EntityIterator + - symbol: Interface_EntityList + - symbol: Interface_FileParameter + - symbol: Interface_FileReaderTool + - symbol: Interface_FloatWriter + - symbol: Interface_GTool + - symbol: Interface_GeneralLib + - symbol: Interface_GlobalNodeOfGeneralLib + - symbol: Interface_GlobalNodeOfReaderLib + - symbol: Interface_GraphContent + - symbol: Interface_IntList + - symbol: Interface_IntVal + - symbol: Interface_InterfaceError + - symbol: Interface_InterfaceMismatch + - symbol: Interface_InterfaceModel + - symbol: Interface_LineBuffer + - symbol: Interface_MSG + - symbol: Interface_NodeOfGeneralLib + - symbol: Interface_NodeOfReaderLib + - symbol: Interface_ParamList + - symbol: Interface_ParamSet + - symbol: Interface_ParamType + - symbol: Interface_Protocol + - symbol: Interface_ReaderLib + - symbol: Interface_ReaderModule + - symbol: Interface_ReportEntity + - symbol: Interface_STAT + - symbol: Interface_ShareFlags + - symbol: Interface_ShareTool + - symbol: Interface_SignLabel + - symbol: Interface_SignType + - symbol: Interface_Static + - symbol: Interface_TypedValue + - symbol: Interval + - symbol: Intf + - symbol: Intf_Interference + - symbol: Intf_InterferencePolygon2d + - symbol: Intf_PIType + - symbol: Intf_Polygon2d + - symbol: Intf_SectionLine + - symbol: Intf_TangentZone + - symbol: Intf_Tool + - symbol: Intrv_Interval + - symbol: Intrv_Intervals + - symbol: Intrv_Position + - symbol: LDOMBasicString + - symbol: LDOMParser + - symbol: LDOMString + - symbol: LDOM_Attr + - symbol: LDOM_BasicAttribute + - symbol: LDOM_BasicElement + - symbol: LDOM_BasicNode + - symbol: LDOM_BasicText + - symbol: LDOM_CDATASection + - symbol: LDOM_CharReference + - symbol: LDOM_CharacterData + - symbol: LDOM_Comment + - symbol: LDOM_Document + - symbol: LDOM_DocumentType + - symbol: LDOM_Element + - symbol: LDOM_LDOMImplementation + - symbol: LDOM_MemManager + - symbol: LDOM_Node + - symbol: LDOM_NodeList + - symbol: LDOM_OSStream + - symbol: LDOM_SBuffer + - symbol: LDOM_Text + - symbol: LDOM_XmlWriter + - symbol: LProp_BadContinuity + - symbol: LProp_CIType + - symbol: LProp_CLProps3d + - symbol: LProp_CurAndInf + - symbol: LProp_CurveUtils_DirectAccess + - symbol: LProp_NotDefined + - symbol: LProp_SLProps3d + - symbol: LProp_Status + - symbol: LProp_SurfaceUtils_DirectAccess + - symbol: Law + - symbol: Law_BSpFunc + - symbol: Law_BSpline + - symbol: Law_BSplineKnotSplitting + - symbol: Law_Composite + - symbol: Law_Constant + - symbol: Law_Function + - symbol: Law_Interpol + - symbol: Law_Interpolate + - symbol: Law_Linear + - symbol: Law_S + - symbol: LocOpe + - symbol: LocOpe_BuildShape + - symbol: LocOpe_BuildWires + - symbol: LocOpe_DPrism + - symbol: LocOpe_FindEdges + - symbol: LocOpe_FindEdgesInFace + - symbol: LocOpe_GeneratedShape + - symbol: LocOpe_Generator + - symbol: LocOpe_GluedShape + - symbol: LocOpe_Gluer + - symbol: LocOpe_LinearForm + - symbol: LocOpe_Operation + - symbol: LocOpe_Pipe + - symbol: LocOpe_PntFace + - symbol: LocOpe_Prism + - symbol: LocOpe_SplitDrafts + - symbol: LocOpe_SplitShape + - symbol: LocOpe_Spliter + - symbol: LocOpe_WiresOnShape + - symbol: LocalAnalysis + - symbol: LocalAnalysis_CurveContinuity + - symbol: LocalAnalysis_StatusErrorType + - symbol: LocalAnalysis_SurfaceContinuity + - symbol: MAT2d_BiInt + - symbol: MAT2d_Circuit + - symbol: MAT2d_Connexion + - symbol: MAT2d_Mat2d + - symbol: MAT2d_MiniPath + - symbol: MAT2d_Tool2d + - symbol: MAT_Arc + - symbol: MAT_BasicElt + - symbol: MAT_Bisector + - symbol: MAT_Edge + - symbol: MAT_Graph + - symbol: MAT_ListOfBisector + - symbol: MAT_ListOfEdge + - symbol: MAT_Node + - symbol: MAT_Side + - symbol: MAT_TListNodeOfListOfBisector + - symbol: MAT_TListNodeOfListOfEdge + - symbol: MAT_Zone + - symbol: MathInteg_DoubleExpConfig + - symbol: MathInteg_KronrodConfig + - symbol: MathInteg_MultipleConfig + - symbol: MathInteg_SetResult + - symbol: MathLin_CroutResult + - symbol: MathLin_EigenResult + - symbol: MathLin_LUResult + - symbol: MathLin_LeastSquaresMethod + - symbol: MathLin_LeastSquaresResult + - symbol: MathLin_QRResult + - symbol: MathLin_SVDResult + - symbol: MathOpt_ConjugateGradientFormula + - symbol: MathOpt_FRPRConfig + - symbol: MathOpt_GlobalConfig + - symbol: MathOpt_GlobalStrategy + - symbol: MathOpt_NewtonConfig + - symbol: MathOpt_PSOBoundaryMode + - symbol: MathOpt_PSOConfig + - symbol: MathOpt_PSOInertiaSchedule + - symbol: MathOpt_PSOInitMode + - symbol: MathOpt_PSOSeedParticle + - symbol: MathOpt_PSOStats + - symbol: MathOpt_UzawaConfig + - symbol: MathOpt_UzawaResult + - symbol: MathPoly_GeneralPolyResult + - symbol: MathRoot_AllRootsResult + - symbol: MathRoot_MultipleConfig + - symbol: MathRoot_MultipleNoExtraHandler + - symbol: MathRoot_MultipleResult + - symbol: MathRoot_NullInterval + - symbol: MathRoot_TrigResult + - symbol: MathSys_LMConfig + - symbol: MathSys_NewtonOptions + - symbol: MathUtils_Ackley + - symbol: MathUtils_Beale + - symbol: MathUtils_Booth + - symbol: MathUtils_BoundedConfig + - symbol: MathUtils_BracketResult + - symbol: MathUtils_Config + - symbol: MathUtils_Constant + - symbol: MathUtils_Cosine + - symbol: MathUtils_DecompResult + - symbol: MathUtils_Domain1D + - symbol: MathUtils_Domain2D + - symbol: MathUtils_EigenResult + - symbol: MathUtils_Exponential + - symbol: MathUtils_Gaussian + - symbol: MathUtils_Himmelblau + - symbol: MathUtils_IntegConfig + - symbol: MathUtils_IntegResult + - symbol: MathUtils_InverseResult + - symbol: MathUtils_LinConfig + - symbol: MathUtils_LineSearchResult + - symbol: MathUtils_Linear + - symbol: MathUtils_LinearMultipleResult + - symbol: MathUtils_LinearResidual + - symbol: MathUtils_LinearResult + - symbol: MathUtils_MinBracketOptions + - symbol: MathUtils_MinBracketResult + - symbol: MathUtils_NDimConfig + - symbol: MathUtils_PolyResult + - symbol: MathUtils_Polynomial + - symbol: MathUtils_Power + - symbol: MathUtils_QuadraticForm + - symbol: MathUtils_RandomGenerator + - symbol: MathUtils_Rastrigin + - symbol: MathUtils_Rational + - symbol: MathUtils_Rosenbrock + - symbol: MathUtils_ScalarResult + - symbol: MathUtils_Sine + - symbol: MathUtils_Sphere + - symbol: MathUtils_Status + - symbol: MathUtils_VectorResult + - symbol: Message_Alert + - symbol: Message_AlertExtended + - symbol: Message_Algorithm + - symbol: Message_Attribute + - symbol: Message_AttributeMeter + - symbol: Message_AttributeObject + - symbol: Message_AttributeStream + - symbol: Message_CompositeAlerts + - symbol: Message_ExecStatus + - symbol: Message_Gravity + - symbol: Message_Level + - symbol: Message_MetricType + - symbol: Message_Msg + - symbol: Message_MsgFile + - symbol: Message_Printer + - symbol: Message_PrinterOStream + - symbol: Message_PrinterToReport + - symbol: Message_ProgressIndicator + - symbol: Message_ProgressRange + - symbol: Message_ProgressScope + - symbol: Message_ProgressSentry + - symbol: Message_Report + - symbol: Message_Status + - symbol: Message_StatusType + - symbol: MoniTool_AttrList + - symbol: MoniTool_CaseData + - symbol: MoniTool_DataInfo + - symbol: MoniTool_Element + - symbol: MoniTool_IntVal + - symbol: MoniTool_RealVal + - symbol: MoniTool_SignShape + - symbol: MoniTool_SignText + - symbol: MoniTool_Stat + - symbol: MoniTool_Timer + - symbol: MoniTool_TimerSentry + - symbol: MoniTool_TransientElem + - symbol: MoniTool_TypedValue + - symbol: MoniTool_ValueType + - symbol: MyDirectPolynomialRoots + - symbol: NCollection_AccAllocator + - symbol: NCollection_AlignedAllocator + - symbol: NCollection_BaseAllocator + - symbol: NCollection_BaseList + - symbol: NCollection_BaseList_Iterator + - symbol: NCollection_BaseMap + - symbol: NCollection_BaseMap_Iterator + - symbol: NCollection_BaseSequence + - symbol: NCollection_BaseSequence_Iterator + - symbol: NCollection_Buffer + - symbol: NCollection_CellFilter_Action + - symbol: NCollection_ForwardRangeSentinel + - symbol: NCollection_HeapAllocator + - symbol: NCollection_IncAllocator + - symbol: NCollection_IncAllocator_IBlock + - symbol: NCollection_SparseArrayBase + - symbol: NCollection_SparseArrayBase_Iterator + - symbol: NCollection_String + - symbol: NCollection_UtfStringTool + - symbol: NCollection_WinHeapAllocator + - symbol: NLPlate_HGPPConstraint + - symbol: NLPlate_HPG0Constraint + - symbol: NLPlate_HPG0G1Constraint + - symbol: NLPlate_HPG0G2Constraint + - symbol: NLPlate_HPG0G3Constraint + - symbol: NLPlate_HPG1Constraint + - symbol: NLPlate_HPG2Constraint + - symbol: NLPlate_HPG3Constraint + - symbol: NLPlate_NLPlate + - symbol: OSD + - symbol: OSD_Parallel + - symbol: OSD_Thread + - symbol: OSD_ThreadPool + - symbol: OSD_ThreadPool_Launcher + - symbol: PCDM + - symbol: PCDM_DOMHeaderParser + - symbol: PCDM_Document + - symbol: PCDM_DriverError + - symbol: PCDM_ReadWriter + - symbol: PCDM_ReadWriter_1 + - symbol: PCDM_Reader + - symbol: PCDM_ReaderStatus + - symbol: PCDM_Reference + - symbol: PCDM_ReferenceIterator + - symbol: PCDM_RetrievalDriver + - symbol: PCDM_StorageDriver + - symbol: PCDM_StoreStatus + - symbol: PCDM_TypeOfFileDriver + - symbol: PCDM_Writer + - symbol: PLib + - symbol: PLib_HermitJacobi + - symbol: PLib_JacobiPolynomial + - symbol: PSO_Particle + - symbol: PeriodicInterval + - symbol: PeriodicityInfo + - symbol: Plate_D1 + - symbol: Plate_D2 + - symbol: Plate_D3 + - symbol: Plate_FreeGtoCConstraint + - symbol: Plate_GlobalTranslationConstraint + - symbol: Plate_GtoCConstraint + - symbol: Plate_LineConstraint + - symbol: Plate_LinearScalarConstraint + - symbol: Plate_LinearXYZConstraint + - symbol: Plate_PinpointConstraint + - symbol: Plate_PlaneConstraint + - symbol: Plate_Plate + - symbol: Plate_SampledCurveConstraint + - symbol: Poly + - symbol: Poly_ArrayOfNodes + - symbol: Poly_ArrayOfUVNodes + - symbol: Poly_CoherentLink + - symbol: Poly_CoherentNode + - symbol: Poly_CoherentTriPtr_Iterator + - symbol: Poly_CoherentTriangle + - symbol: Poly_CoherentTriangulation + - symbol: Poly_CoherentTriangulation_IteratorOfLink + - symbol: Poly_CoherentTriangulation_IteratorOfNode + - symbol: Poly_CoherentTriangulation_IteratorOfTriangle + - symbol: Poly_Connect + - symbol: Poly_MakeLoops + - symbol: Poly_MakeLoops2D_Helper + - symbol: Poly_MakeLoops3D_Helper + - symbol: Poly_MakeLoops_Hasher + - symbol: Poly_MakeLoops_HeapOfInteger + - symbol: Poly_MakeLoops_Helper + - symbol: Poly_MakeLoops_Link + - symbol: Poly_MergeNodesTool + - symbol: Poly_Polygon2D + - symbol: Poly_Polygon3D + - symbol: Poly_PolygonOnTriangulation + - symbol: Poly_Triangle + - symbol: Poly_Triangulation + - symbol: Poly_TriangulationParameters + - symbol: Precision + - symbol: Quantity_Color + - symbol: Quantity_ColorRGBA + - symbol: Quantity_NameOfColor + - symbol: Quantity_TypeOfColor + - symbol: RWGltf_CafReader + - symbol: RWGltf_CafWriter + - symbol: RWGltf_DracoParameters + - symbol: RWGltf_GltfAccessor + - symbol: RWGltf_GltfAccessorCompType + - symbol: RWGltf_GltfAccessorLayout + - symbol: RWGltf_GltfAlphaMode + - symbol: RWGltf_GltfArrayType + - symbol: RWGltf_GltfBufferView + - symbol: RWGltf_GltfBufferViewTarget + - symbol: RWGltf_GltfFace + - symbol: RWGltf_GltfJsonParser + - symbol: RWGltf_GltfLatePrimitiveArray + - symbol: RWGltf_GltfMaterialMap + - symbol: RWGltf_GltfOStreamWriter + - symbol: RWGltf_GltfPrimArrayData + - symbol: RWGltf_GltfPrimitiveMode + - symbol: RWGltf_GltfRootElement + - symbol: RWGltf_GltfSceneNodeMap + - symbol: RWGltf_MaterialCommon + - symbol: RWGltf_MaterialMetallicRoughness + - symbol: RWGltf_TriangulationReader + - symbol: RWGltf_WriterTrsfFormat + - symbol: RWHeaderSection + - symbol: RWHeaderSection_RWFileDescription + - symbol: RWHeaderSection_RWFileName + - symbol: RWHeaderSection_RWFileSchema + - symbol: RWHeaderSection_ReadWriteModule + - symbol: RWMesh + - symbol: RWMesh_CafReader + - symbol: RWMesh_CafReaderStatusEx + - symbol: RWMesh_CoordinateSystem + - symbol: RWMesh_CoordinateSystemConverter + - symbol: RWMesh_EdgeIterator + - symbol: RWMesh_FaceIterator + - symbol: RWMesh_MaterialMap + - symbol: RWMesh_NameFormat + - symbol: RWMesh_NodeAttributes + - symbol: RWMesh_ShapeIterator + - symbol: RWMesh_TriangulationReader + - symbol: RWMesh_TriangulationReader_LoadingStatistic + - symbol: RWMesh_TriangulationSource + - symbol: RWMesh_VertexIterator + - symbol: RWObj + - symbol: RWObj_CafReader + - symbol: RWObj_CafWriter + - symbol: RWObj_IShapeReceiver + - symbol: RWObj_Material + - symbol: RWObj_MtlReader + - symbol: RWObj_ObjMaterialMap + - symbol: RWObj_ObjWriterContext + - symbol: RWObj_Reader + - symbol: RWObj_SubMesh + - symbol: RWObj_SubMeshReason + - symbol: RWObj_TriangulationReader + - symbol: RWPly_CafWriter + - symbol: RWPly_PlyWriterContext + - symbol: RWStl + - symbol: RWStl_Reader + - symbol: Resource_FormatType + - symbol: Resource_LexicalCompare + - symbol: Resource_Manager + - symbol: Resource_NoSuchResource + - symbol: Resource_Unicode + - symbol: STEPCAFControl_ActorWrite + - symbol: STEPCAFControl_Controller + - symbol: STEPCAFControl_ExternFile + - symbol: STEPCAFControl_Reader + - symbol: STEPCAFControl_Writer + - symbol: STEPConstruct + - symbol: STEPConstruct_AP203Context + - symbol: STEPConstruct_Assembly + - symbol: STEPConstruct_ContextTool + - symbol: STEPConstruct_ExternRefs + - symbol: STEPConstruct_Part + - symbol: STEPConstruct_RenderingProperties + - symbol: STEPConstruct_Styles + - symbol: STEPConstruct_Tool + - symbol: STEPConstruct_UnitContext + - symbol: STEPConstruct_ValidationProps + - symbol: STEPControl_ActorRead + - symbol: STEPControl_ActorWrite + - symbol: STEPControl_Controller + - symbol: STEPControl_Reader + - symbol: STEPControl_StepModelType + - symbol: STEPControl_Writer + - symbol: STEPEdit + - symbol: STEPEdit_EditContext + - symbol: STEPEdit_EditSDR + - symbol: STEPSelections_AssemblyComponent + - symbol: STEPSelections_AssemblyExplorer + - symbol: STEPSelections_AssemblyLink + - symbol: STEPSelections_SelectAssembly + - symbol: STEPSelections_SelectDerived + - symbol: STEPSelections_SelectFaces + - symbol: STEPSelections_SelectForTransfer + - symbol: STEPSelections_SelectGSCurves + - symbol: STEPSelections_SelectInstances + - symbol: ShapeAlgo + - symbol: ShapeAlgo_AlgoContainer + - symbol: ShapeAlgo_ToolContainer + - symbol: ShapeAnalysis + - symbol: ShapeAnalysis_BoxBndTreeSelector + - symbol: ShapeAnalysis_CanonicalRecognition + - symbol: ShapeAnalysis_CheckSmallFace + - symbol: ShapeAnalysis_Curve + - symbol: ShapeAnalysis_Edge + - symbol: ShapeAnalysis_FreeBoundData + - symbol: ShapeAnalysis_FreeBounds + - symbol: ShapeAnalysis_FreeBoundsProperties + - symbol: ShapeAnalysis_Geom + - symbol: ShapeAnalysis_ShapeContents + - symbol: ShapeAnalysis_ShapeTolerance + - symbol: ShapeAnalysis_Shell + - symbol: ShapeAnalysis_Surface + - symbol: ShapeAnalysis_TransferParameters + - symbol: ShapeAnalysis_TransferParametersProj + - symbol: ShapeAnalysis_Wire + - symbol: ShapeAnalysis_WireOrder + - symbol: ShapeAnalysis_WireVertex + - symbol: ShapeBuild + - symbol: ShapeBuild_Edge + - symbol: ShapeBuild_ReShape + - symbol: ShapeBuild_Vertex + - symbol: ShapeConstruct + - symbol: ShapeConstruct_Curve + - symbol: ShapeConstruct_MakeTriangulation + - symbol: ShapeConstruct_ProjectCurveOnSurface + - symbol: ShapeCustom + - symbol: ShapeCustom_BSplineRestriction + - symbol: ShapeCustom_ConvertToBSpline + - symbol: ShapeCustom_ConvertToRevolution + - symbol: ShapeCustom_Curve + - symbol: ShapeCustom_Curve2d + - symbol: ShapeCustom_DirectModification + - symbol: ShapeCustom_Modification + - symbol: ShapeCustom_RestrictionParameters + - symbol: ShapeCustom_Surface + - symbol: ShapeCustom_SweptToElementary + - symbol: ShapeCustom_TrsfModification + - symbol: ShapeExtend + - symbol: ShapeExtend_BasicMsgRegistrator + - symbol: ShapeExtend_ComplexCurve + - symbol: ShapeExtend_CompositeSurface + - symbol: ShapeExtend_Explorer + - symbol: ShapeExtend_MsgRegistrator + - symbol: ShapeExtend_Parametrisation + - symbol: ShapeExtend_Status + - symbol: ShapeExtend_WireData + - symbol: ShapeFix + - symbol: ShapeFix_ComposeShell + - symbol: ShapeFix_Edge + - symbol: ShapeFix_EdgeConnect + - symbol: ShapeFix_EdgeProjAux + - symbol: ShapeFix_Face + - symbol: ShapeFix_FaceConnect + - symbol: ShapeFix_FixSmallFace + - symbol: ShapeFix_FixSmallSolid + - symbol: ShapeFix_FreeBounds + - symbol: ShapeFix_IntersectionTool + - symbol: ShapeFix_Root + - symbol: ShapeFix_Shape + - symbol: ShapeFix_ShapeTolerance + - symbol: ShapeFix_Shell + - symbol: ShapeFix_Solid + - symbol: ShapeFix_SplitCommonVertex + - symbol: ShapeFix_SplitTool + - symbol: ShapeFix_Wire + - symbol: ShapeFix_WireVertex + - symbol: ShapeFix_Wireframe + - symbol: ShapeProcess + - symbol: ShapeProcessAPI_ApplySequence + - symbol: ShapeProcess_Context + - symbol: ShapeProcess_OperLibrary + - symbol: ShapeProcess_Operator + - symbol: ShapeProcess_ShapeContext + - symbol: ShapeProcess_UOperator + - symbol: ShapeUpgrade + - symbol: ShapeUpgrade_ClosedEdgeDivide + - symbol: ShapeUpgrade_ClosedFaceDivide + - symbol: ShapeUpgrade_ConvertCurve2dToBezier + - symbol: ShapeUpgrade_ConvertCurve3dToBezier + - symbol: ShapeUpgrade_ConvertSurfaceToBezierBasis + - symbol: ShapeUpgrade_EdgeDivide + - symbol: ShapeUpgrade_FaceDivide + - symbol: ShapeUpgrade_FaceDivideArea + - symbol: ShapeUpgrade_FixSmallBezierCurves + - symbol: ShapeUpgrade_FixSmallCurves + - symbol: ShapeUpgrade_RemoveInternalWires + - symbol: ShapeUpgrade_RemoveLocations + - symbol: ShapeUpgrade_ShapeConvertToBezier + - symbol: ShapeUpgrade_ShapeDivide + - symbol: ShapeUpgrade_ShapeDivideAngle + - symbol: ShapeUpgrade_ShapeDivideArea + - symbol: ShapeUpgrade_ShapeDivideClosed + - symbol: ShapeUpgrade_ShapeDivideClosedEdges + - symbol: ShapeUpgrade_ShapeDivideContinuity + - symbol: ShapeUpgrade_ShellSewing + - symbol: ShapeUpgrade_SplitCurve + - symbol: ShapeUpgrade_SplitCurve2d + - symbol: ShapeUpgrade_SplitCurve2dContinuity + - symbol: ShapeUpgrade_SplitCurve3d + - symbol: ShapeUpgrade_SplitCurve3dContinuity + - symbol: ShapeUpgrade_SplitSurface + - symbol: ShapeUpgrade_SplitSurfaceAngle + - symbol: ShapeUpgrade_SplitSurfaceArea + - symbol: ShapeUpgrade_SplitSurfaceContinuity + - symbol: ShapeUpgrade_Tool + - symbol: ShapeUpgrade_UnifySameDomain + - symbol: ShapeUpgrade_WireDivide + - symbol: Standard + - symbol: Standard_ArrayStreamBuffer + - symbol: Standard_CLocaleSentry + - symbol: Standard_CStringHasher + - symbol: Standard_Condition + - symbol: Standard_ConstructionError + - symbol: Standard_DimensionError + - symbol: Standard_DimensionMismatch + - symbol: Standard_DivideByZero + - symbol: Standard_DomainError + - symbol: Standard_DumpValue + - symbol: Standard_ErrorHandler_Callback + - symbol: Standard_Failure + - symbol: Standard_GUID + - symbol: Standard_HMutex + - symbol: Standard_JsonKey + - symbol: Standard_MultiplyDefined + - symbol: Standard_Mutex + - symbol: Standard_Mutex_Sentry + - symbol: Standard_NegativeValue + - symbol: Standard_NoMoreObject + - symbol: Standard_NoSuchObject + - symbol: Standard_NotImplemented + - symbol: Standard_NullObject + - symbol: Standard_NullValue + - symbol: Standard_NumericError + - symbol: Standard_OutOfMemory + - symbol: Standard_OutOfRange + - symbol: Standard_Overflow + - symbol: Standard_Persistent + - symbol: Standard_ProgramError + - symbol: Standard_RangeError + - symbol: Standard_ReadBuffer + - symbol: Standard_ReadLineBuffer + - symbol: Standard_Transient + - symbol: Standard_Type + - symbol: Standard_TypeMismatch + - symbol: Standard_UUID + - symbol: Standard_Underflow + - symbol: StdFail_InfiniteSolutions + - symbol: StdFail_NotDone + - symbol: StdFail_Undefined + - symbol: StdFail_UndefinedDerivative + - symbol: StdFail_UndefinedValue + - symbol: StepAP203_ApprovedItem + - symbol: StepAP203_CcDesignApproval + - symbol: StepAP203_CcDesignCertification + - symbol: StepAP203_CcDesignContract + - symbol: StepAP203_CcDesignDateAndTimeAssignment + - symbol: StepAP203_CcDesignPersonAndOrganizationAssignment + - symbol: StepAP203_CcDesignSecurityClassification + - symbol: StepAP203_CcDesignSpecificationReference + - symbol: StepAP203_CertifiedItem + - symbol: StepAP203_Change + - symbol: StepAP203_ChangeRequest + - symbol: StepAP203_ChangeRequestItem + - symbol: StepAP203_ClassifiedItem + - symbol: StepAP203_ContractedItem + - symbol: StepAP203_DateTimeItem + - symbol: StepAP203_PersonOrganizationItem + - symbol: StepAP203_SpecifiedItem + - symbol: StepAP203_StartRequest + - symbol: StepAP203_StartRequestItem + - symbol: StepAP203_StartWork + - symbol: StepAP203_WorkItem + - symbol: StepAP209_Construct + - symbol: StepAP214 + - symbol: StepAP214_AppliedApprovalAssignment + - symbol: StepAP214_AppliedDateAndTimeAssignment + - symbol: StepAP214_AppliedDateAssignment + - symbol: StepAP214_AppliedDocumentReference + - symbol: StepAP214_AppliedExternalIdentificationAssignment + - symbol: StepAP214_AppliedGroupAssignment + - symbol: StepAP214_AppliedOrganizationAssignment + - symbol: StepAP214_AppliedPersonAndOrganizationAssignment + - symbol: StepAP214_AppliedPresentedItem + - symbol: StepAP214_AppliedSecurityClassificationAssignment + - symbol: StepAP214_ApprovalItem + - symbol: StepAP214_AutoDesignActualDateAndTimeAssignment + - symbol: StepAP214_AutoDesignActualDateAssignment + - symbol: StepAP214_AutoDesignApprovalAssignment + - symbol: StepAP214_AutoDesignDateAndPersonAssignment + - symbol: StepAP214_AutoDesignDateAndPersonItem + - symbol: StepAP214_AutoDesignDateAndTimeItem + - symbol: StepAP214_AutoDesignDatedItem + - symbol: StepAP214_AutoDesignDocumentReference + - symbol: StepAP214_AutoDesignGeneralOrgItem + - symbol: StepAP214_AutoDesignGroupAssignment + - symbol: StepAP214_AutoDesignGroupedItem + - symbol: StepAP214_AutoDesignNominalDateAndTimeAssignment + - symbol: StepAP214_AutoDesignNominalDateAssignment + - symbol: StepAP214_AutoDesignOrganizationAssignment + - symbol: StepAP214_AutoDesignOrganizationItem + - symbol: StepAP214_AutoDesignPersonAndOrganizationAssignment + - symbol: StepAP214_AutoDesignPresentedItem + - symbol: StepAP214_AutoDesignPresentedItemSelect + - symbol: StepAP214_AutoDesignReferencingItem + - symbol: StepAP214_AutoDesignSecurityClassificationAssignment + - symbol: StepAP214_Class + - symbol: StepAP214_DateAndTimeItem + - symbol: StepAP214_DateItem + - symbol: StepAP214_DocumentReferenceItem + - symbol: StepAP214_ExternalIdentificationItem + - symbol: StepAP214_ExternallyDefinedClass + - symbol: StepAP214_ExternallyDefinedGeneralProperty + - symbol: StepAP214_GroupItem + - symbol: StepAP214_OrganizationItem + - symbol: StepAP214_PersonAndOrganizationItem + - symbol: StepAP214_PresentedItemSelect + - symbol: StepAP214_Protocol + - symbol: StepAP214_RepItemGroup + - symbol: StepAP214_SecurityClassificationItem + - symbol: StepAP242_DraughtingModelItemAssociation + - symbol: StepAP242_GeometricItemSpecificUsage + - symbol: StepAP242_IdAttribute + - symbol: StepAP242_IdAttributeSelect + - symbol: StepAP242_ItemIdentifiedRepresentationUsage + - symbol: StepAP242_ItemIdentifiedRepresentationUsageDefinition + - symbol: StepBasic_Action + - symbol: StepBasic_ActionAssignment + - symbol: StepBasic_ActionMethod + - symbol: StepBasic_ActionRequestAssignment + - symbol: StepBasic_ActionRequestSolution + - symbol: StepBasic_Address + - symbol: StepBasic_AheadOrBehind + - symbol: StepBasic_ApplicationContext + - symbol: StepBasic_ApplicationContextElement + - symbol: StepBasic_ApplicationProtocolDefinition + - symbol: StepBasic_Approval + - symbol: StepBasic_ApprovalAssignment + - symbol: StepBasic_ApprovalDateTime + - symbol: StepBasic_ApprovalPersonOrganization + - symbol: StepBasic_ApprovalRelationship + - symbol: StepBasic_ApprovalRole + - symbol: StepBasic_ApprovalStatus + - symbol: StepBasic_AreaUnit + - symbol: StepBasic_CalendarDate + - symbol: StepBasic_Certification + - symbol: StepBasic_CertificationAssignment + - symbol: StepBasic_CertificationType + - symbol: StepBasic_CharacterizedObject + - symbol: StepBasic_Contract + - symbol: StepBasic_ContractAssignment + - symbol: StepBasic_ContractType + - symbol: StepBasic_ConversionBasedUnit + - symbol: StepBasic_ConversionBasedUnitAndAreaUnit + - symbol: StepBasic_ConversionBasedUnitAndLengthUnit + - symbol: StepBasic_ConversionBasedUnitAndMassUnit + - symbol: StepBasic_ConversionBasedUnitAndPlaneAngleUnit + - symbol: StepBasic_ConversionBasedUnitAndRatioUnit + - symbol: StepBasic_ConversionBasedUnitAndSolidAngleUnit + - symbol: StepBasic_ConversionBasedUnitAndTimeUnit + - symbol: StepBasic_ConversionBasedUnitAndVolumeUnit + - symbol: StepBasic_CoordinatedUniversalTimeOffset + - symbol: StepBasic_Date + - symbol: StepBasic_DateAndTime + - symbol: StepBasic_DateAndTimeAssignment + - symbol: StepBasic_DateAssignment + - symbol: StepBasic_DateRole + - symbol: StepBasic_DateTimeRole + - symbol: StepBasic_DateTimeSelect + - symbol: StepBasic_DerivedUnit + - symbol: StepBasic_DerivedUnitElement + - symbol: StepBasic_DesignContext + - symbol: StepBasic_DigitalDocument + - symbol: StepBasic_DimensionalExponents + - symbol: StepBasic_Document + - symbol: StepBasic_DocumentFile + - symbol: StepBasic_DocumentProductAssociation + - symbol: StepBasic_DocumentProductEquivalence + - symbol: StepBasic_DocumentReference + - symbol: StepBasic_DocumentRelationship + - symbol: StepBasic_DocumentRepresentationType + - symbol: StepBasic_DocumentType + - symbol: StepBasic_DocumentUsageConstraint + - symbol: StepBasic_Effectivity + - symbol: StepBasic_EffectivityAssignment + - symbol: StepBasic_EulerAngles + - symbol: StepBasic_ExternalIdentificationAssignment + - symbol: StepBasic_ExternalSource + - symbol: StepBasic_ExternallyDefinedItem + - symbol: StepBasic_GeneralProperty + - symbol: StepBasic_GeneralPropertyAssociation + - symbol: StepBasic_GeneralPropertyRelationship + - symbol: StepBasic_Group + - symbol: StepBasic_GroupAssignment + - symbol: StepBasic_GroupRelationship + - symbol: StepBasic_IdentificationAssignment + - symbol: StepBasic_IdentificationRole + - symbol: StepBasic_LengthMeasureWithUnit + - symbol: StepBasic_LengthUnit + - symbol: StepBasic_LocalTime + - symbol: StepBasic_MassMeasureWithUnit + - symbol: StepBasic_MassUnit + - symbol: StepBasic_MeasureValueMember + - symbol: StepBasic_MeasureWithUnit + - symbol: StepBasic_MechanicalContext + - symbol: StepBasic_NameAssignment + - symbol: StepBasic_NamedUnit + - symbol: StepBasic_ObjectRole + - symbol: StepBasic_OrdinalDate + - symbol: StepBasic_Organization + - symbol: StepBasic_OrganizationAssignment + - symbol: StepBasic_OrganizationRole + - symbol: StepBasic_OrganizationalAddress + - symbol: StepBasic_Person + - symbol: StepBasic_PersonAndOrganization + - symbol: StepBasic_PersonAndOrganizationAssignment + - symbol: StepBasic_PersonAndOrganizationRole + - symbol: StepBasic_PersonOrganizationSelect + - symbol: StepBasic_PersonalAddress + - symbol: StepBasic_PhysicallyModeledProductDefinition + - symbol: StepBasic_PlaneAngleMeasureWithUnit + - symbol: StepBasic_PlaneAngleUnit + - symbol: StepBasic_Product + - symbol: StepBasic_ProductCategory + - symbol: StepBasic_ProductCategoryRelationship + - symbol: StepBasic_ProductConceptContext + - symbol: StepBasic_ProductContext + - symbol: StepBasic_ProductDefinition + - symbol: StepBasic_ProductDefinitionContext + - symbol: StepBasic_ProductDefinitionEffectivity + - symbol: StepBasic_ProductDefinitionFormation + - symbol: StepBasic_ProductDefinitionFormationRelationship + - symbol: StepBasic_ProductDefinitionFormationWithSpecifiedSource + - symbol: StepBasic_ProductDefinitionOrReference + - symbol: StepBasic_ProductDefinitionReference + - symbol: StepBasic_ProductDefinitionReferenceWithLocalRepresentation + - symbol: StepBasic_ProductDefinitionRelationship + - symbol: StepBasic_ProductDefinitionWithAssociatedDocuments + - symbol: StepBasic_ProductOrFormationOrDefinition + - symbol: StepBasic_ProductRelatedProductCategory + - symbol: StepBasic_ProductType + - symbol: StepBasic_RatioMeasureWithUnit + - symbol: StepBasic_RatioUnit + - symbol: StepBasic_RoleAssociation + - symbol: StepBasic_RoleSelect + - symbol: StepBasic_SecurityClassification + - symbol: StepBasic_SecurityClassificationAssignment + - symbol: StepBasic_SecurityClassificationLevel + - symbol: StepBasic_SiPrefix + - symbol: StepBasic_SiUnit + - symbol: StepBasic_SiUnitAndAreaUnit + - symbol: StepBasic_SiUnitAndLengthUnit + - symbol: StepBasic_SiUnitAndMassUnit + - symbol: StepBasic_SiUnitAndPlaneAngleUnit + - symbol: StepBasic_SiUnitAndRatioUnit + - symbol: StepBasic_SiUnitAndSolidAngleUnit + - symbol: StepBasic_SiUnitAndThermodynamicTemperatureUnit + - symbol: StepBasic_SiUnitAndTimeUnit + - symbol: StepBasic_SiUnitAndVolumeUnit + - symbol: StepBasic_SiUnitName + - symbol: StepBasic_SizeMember + - symbol: StepBasic_SizeSelect + - symbol: StepBasic_SolidAngleMeasureWithUnit + - symbol: StepBasic_SolidAngleUnit + - symbol: StepBasic_Source + - symbol: StepBasic_SourceItem + - symbol: StepBasic_ThermodynamicTemperatureUnit + - symbol: StepBasic_TimeMeasureWithUnit + - symbol: StepBasic_TimeUnit + - symbol: StepBasic_UncertaintyMeasureWithUnit + - symbol: StepBasic_Unit + - symbol: StepBasic_VersionedActionRequest + - symbol: StepBasic_VolumeUnit + - symbol: StepBasic_WeekOfYearAndDayDate + - symbol: StepData + - symbol: StepData_Described + - symbol: StepData_ECDescr + - symbol: StepData_EDescr + - symbol: StepData_ESDescr + - symbol: StepData_EnumTool + - symbol: StepData_Factors + - symbol: StepData_Field + - symbol: StepData_FieldList + - symbol: StepData_FieldList1 + - symbol: StepData_FieldListD + - symbol: StepData_FieldListN + - symbol: StepData_FileProtocol + - symbol: StepData_FileRecognizer + - symbol: StepData_GlobalNodeOfWriterLib + - symbol: StepData_Logical + - symbol: StepData_NodeOfWriterLib + - symbol: StepData_PDescr + - symbol: StepData_Plex + - symbol: StepData_Protocol + - symbol: StepData_ReadWriteModule + - symbol: StepData_SelectArrReal + - symbol: StepData_SelectInt + - symbol: StepData_SelectMember + - symbol: StepData_SelectNamed + - symbol: StepData_SelectReal + - symbol: StepData_SelectType + - symbol: StepData_Simple + - symbol: StepData_StepDumper + - symbol: StepData_StepModel + - symbol: StepData_StepReaderTool + - symbol: StepData_StepWriter + - symbol: StepData_WriterLib + - symbol: StepDimTol_AngularityTolerance + - symbol: StepDimTol_AreaUnitType + - symbol: StepDimTol_CircularRunoutTolerance + - symbol: StepDimTol_CoaxialityTolerance + - symbol: StepDimTol_CommonDatum + - symbol: StepDimTol_ConcentricityTolerance + - symbol: StepDimTol_CylindricityTolerance + - symbol: StepDimTol_Datum + - symbol: StepDimTol_DatumFeature + - symbol: StepDimTol_DatumOrCommonDatum + - symbol: StepDimTol_DatumReference + - symbol: StepDimTol_DatumReferenceCompartment + - symbol: StepDimTol_DatumReferenceElement + - symbol: StepDimTol_DatumReferenceModifier + - symbol: StepDimTol_DatumReferenceModifierType + - symbol: StepDimTol_DatumReferenceModifierWithValue + - symbol: StepDimTol_DatumSystem + - symbol: StepDimTol_DatumSystemOrReference + - symbol: StepDimTol_DatumTarget + - symbol: StepDimTol_FlatnessTolerance + - symbol: StepDimTol_GeneralDatumReference + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRef + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndUneqDisGeoTol + - symbol: StepDimTol_GeoTolAndGeoTolWthMaxTol + - symbol: StepDimTol_GeoTolAndGeoTolWthMod + - symbol: StepDimTol_GeometricTolerance + - symbol: StepDimTol_GeometricToleranceModifier + - symbol: StepDimTol_GeometricToleranceRelationship + - symbol: StepDimTol_GeometricToleranceTarget + - symbol: StepDimTol_GeometricToleranceType + - symbol: StepDimTol_GeometricToleranceWithDatumReference + - symbol: StepDimTol_GeometricToleranceWithDefinedAreaUnit + - symbol: StepDimTol_GeometricToleranceWithDefinedUnit + - symbol: StepDimTol_GeometricToleranceWithMaximumTolerance + - symbol: StepDimTol_GeometricToleranceWithModifiers + - symbol: StepDimTol_LimitCondition + - symbol: StepDimTol_LineProfileTolerance + - symbol: StepDimTol_ModifiedGeometricTolerance + - symbol: StepDimTol_NonUniformZoneDefinition + - symbol: StepDimTol_ParallelismTolerance + - symbol: StepDimTol_PerpendicularityTolerance + - symbol: StepDimTol_PlacedDatumTargetFeature + - symbol: StepDimTol_PositionTolerance + - symbol: StepDimTol_ProjectedZoneDefinition + - symbol: StepDimTol_RoundnessTolerance + - symbol: StepDimTol_RunoutZoneDefinition + - symbol: StepDimTol_RunoutZoneOrientation + - symbol: StepDimTol_ShapeToleranceSelect + - symbol: StepDimTol_SimpleDatumReferenceModifier + - symbol: StepDimTol_SimpleDatumReferenceModifierMember + - symbol: StepDimTol_StraightnessTolerance + - symbol: StepDimTol_SurfaceProfileTolerance + - symbol: StepDimTol_SymmetryTolerance + - symbol: StepDimTol_ToleranceZone + - symbol: StepDimTol_ToleranceZoneDefinition + - symbol: StepDimTol_ToleranceZoneForm + - symbol: StepDimTol_ToleranceZoneTarget + - symbol: StepDimTol_TotalRunoutTolerance + - symbol: StepDimTol_UnequallyDisposedGeometricTolerance + - symbol: StepElement_AnalysisItemWithinRepresentation + - symbol: StepElement_Curve3dElementDescriptor + - symbol: StepElement_CurveEdge + - symbol: StepElement_CurveElementEndReleasePacket + - symbol: StepElement_CurveElementFreedom + - symbol: StepElement_CurveElementFreedomMember + - symbol: StepElement_CurveElementPurpose + - symbol: StepElement_CurveElementPurposeMember + - symbol: StepElement_CurveElementSectionDefinition + - symbol: StepElement_CurveElementSectionDerivedDefinitions + - symbol: StepElement_Element2dShape + - symbol: StepElement_ElementAspect + - symbol: StepElement_ElementAspectMember + - symbol: StepElement_ElementDescriptor + - symbol: StepElement_ElementMaterial + - symbol: StepElement_ElementOrder + - symbol: StepElement_ElementVolume + - symbol: StepElement_EnumeratedCurveElementFreedom + - symbol: StepElement_EnumeratedCurveElementPurpose + - symbol: StepElement_EnumeratedSurfaceElementPurpose + - symbol: StepElement_EnumeratedVolumeElementPurpose + - symbol: StepElement_MeasureOrUnspecifiedValue + - symbol: StepElement_MeasureOrUnspecifiedValueMember + - symbol: StepElement_Surface3dElementDescriptor + - symbol: StepElement_SurfaceElementProperty + - symbol: StepElement_SurfaceElementPurpose + - symbol: StepElement_SurfaceElementPurposeMember + - symbol: StepElement_SurfaceSection + - symbol: StepElement_SurfaceSectionField + - symbol: StepElement_SurfaceSectionFieldConstant + - symbol: StepElement_SurfaceSectionFieldVarying + - symbol: StepElement_UniformSurfaceSection + - symbol: StepElement_UnspecifiedValue + - symbol: StepElement_Volume3dElementDescriptor + - symbol: StepElement_Volume3dElementShape + - symbol: StepElement_VolumeElementPurpose + - symbol: StepElement_VolumeElementPurposeMember + - symbol: StepFEA_AlignedCurve3dElementCoordinateSystem + - symbol: StepFEA_AlignedSurface3dElementCoordinateSystem + - symbol: StepFEA_ArbitraryVolume3dElementCoordinateSystem + - symbol: StepFEA_ConstantSurface3dElementCoordinateSystem + - symbol: StepFEA_CoordinateSystemType + - symbol: StepFEA_Curve3dElementProperty + - symbol: StepFEA_Curve3dElementRepresentation + - symbol: StepFEA_CurveEdge + - symbol: StepFEA_CurveElementEndCoordinateSystem + - symbol: StepFEA_CurveElementEndOffset + - symbol: StepFEA_CurveElementEndRelease + - symbol: StepFEA_CurveElementInterval + - symbol: StepFEA_CurveElementIntervalConstant + - symbol: StepFEA_CurveElementIntervalLinearlyVarying + - symbol: StepFEA_CurveElementLocation + - symbol: StepFEA_DegreeOfFreedom + - symbol: StepFEA_DegreeOfFreedomMember + - symbol: StepFEA_DummyNode + - symbol: StepFEA_ElementGeometricRelationship + - symbol: StepFEA_ElementGroup + - symbol: StepFEA_ElementOrElementGroup + - symbol: StepFEA_ElementRepresentation + - symbol: StepFEA_ElementVolume + - symbol: StepFEA_EnumeratedDegreeOfFreedom + - symbol: StepFEA_FeaAreaDensity + - symbol: StepFEA_FeaAxis2Placement3d + - symbol: StepFEA_FeaCurveSectionGeometricRelationship + - symbol: StepFEA_FeaGroup + - symbol: StepFEA_FeaLinearElasticity + - symbol: StepFEA_FeaMassDensity + - symbol: StepFEA_FeaMaterialPropertyRepresentation + - symbol: StepFEA_FeaMaterialPropertyRepresentationItem + - symbol: StepFEA_FeaModel + - symbol: StepFEA_FeaModel3d + - symbol: StepFEA_FeaModelDefinition + - symbol: StepFEA_FeaMoistureAbsorption + - symbol: StepFEA_FeaParametricPoint + - symbol: StepFEA_FeaRepresentationItem + - symbol: StepFEA_FeaSecantCoefficientOfLinearThermalExpansion + - symbol: StepFEA_FeaShellBendingStiffness + - symbol: StepFEA_FeaShellMembraneBendingCouplingStiffness + - symbol: StepFEA_FeaShellMembraneStiffness + - symbol: StepFEA_FeaShellShearStiffness + - symbol: StepFEA_FeaSurfaceSectionGeometricRelationship + - symbol: StepFEA_FeaTangentialCoefficientOfLinearThermalExpansion + - symbol: StepFEA_FreedomAndCoefficient + - symbol: StepFEA_FreedomsList + - symbol: StepFEA_GeometricNode + - symbol: StepFEA_Node + - symbol: StepFEA_NodeDefinition + - symbol: StepFEA_NodeGroup + - symbol: StepFEA_NodeRepresentation + - symbol: StepFEA_NodeSet + - symbol: StepFEA_NodeWithSolutionCoordinateSystem + - symbol: StepFEA_NodeWithVector + - symbol: StepFEA_ParametricCurve3dElementCoordinateDirection + - symbol: StepFEA_ParametricCurve3dElementCoordinateSystem + - symbol: StepFEA_ParametricSurface3dElementCoordinateSystem + - symbol: StepFEA_Surface3dElementRepresentation + - symbol: StepFEA_SymmetricTensor22d + - symbol: StepFEA_SymmetricTensor23d + - symbol: StepFEA_SymmetricTensor23dMember + - symbol: StepFEA_SymmetricTensor42d + - symbol: StepFEA_SymmetricTensor43dMember + - symbol: StepFEA_UnspecifiedValue + - symbol: StepFEA_Volume3dElementRepresentation + - symbol: StepFile_ReadData + - symbol: StepGeom_Axis1Placement + - symbol: StepGeom_Axis2Placement + - symbol: StepGeom_Axis2Placement2d + - symbol: StepGeom_Axis2Placement3d + - symbol: StepGeom_BSplineCurve + - symbol: StepGeom_BSplineCurveForm + - symbol: StepGeom_BSplineCurveWithKnots + - symbol: StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve + - symbol: StepGeom_BSplineSurface + - symbol: StepGeom_BSplineSurfaceForm + - symbol: StepGeom_BSplineSurfaceWithKnots + - symbol: StepGeom_BSplineSurfaceWithKnotsAndRationalBSplineSurface + - symbol: StepGeom_BezierCurve + - symbol: StepGeom_BezierCurveAndRationalBSplineCurve + - symbol: StepGeom_BezierSurface + - symbol: StepGeom_BezierSurfaceAndRationalBSplineSurface + - symbol: StepGeom_BoundaryCurve + - symbol: StepGeom_BoundedCurve + - symbol: StepGeom_BoundedSurface + - symbol: StepGeom_CartesianPoint + - symbol: StepGeom_CartesianTransformationOperator + - symbol: StepGeom_CartesianTransformationOperator2d + - symbol: StepGeom_CartesianTransformationOperator3d + - symbol: StepGeom_Circle + - symbol: StepGeom_CompositeCurve + - symbol: StepGeom_CompositeCurveOnSurface + - symbol: StepGeom_CompositeCurveSegment + - symbol: StepGeom_Conic + - symbol: StepGeom_ConicalSurface + - symbol: StepGeom_Curve + - symbol: StepGeom_CurveBoundedSurface + - symbol: StepGeom_CurveOnSurface + - symbol: StepGeom_CurveReplica + - symbol: StepGeom_CylindricalSurface + - symbol: StepGeom_DegeneratePcurve + - symbol: StepGeom_DegenerateToroidalSurface + - symbol: StepGeom_Direction + - symbol: StepGeom_ElementarySurface + - symbol: StepGeom_Ellipse + - symbol: StepGeom_EvaluatedDegeneratePcurve + - symbol: StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx + - symbol: StepGeom_GeometricRepresentationContext + - symbol: StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext + - symbol: StepGeom_GeometricRepresentationContextAndParametricRepresentationContext + - symbol: StepGeom_GeometricRepresentationItem + - symbol: StepGeom_Hyperbola + - symbol: StepGeom_IntersectionCurve + - symbol: StepGeom_KnotType + - symbol: StepGeom_Line + - symbol: StepGeom_OffsetCurve3d + - symbol: StepGeom_OffsetSurface + - symbol: StepGeom_OrientedSurface + - symbol: StepGeom_OuterBoundaryCurve + - symbol: StepGeom_Parabola + - symbol: StepGeom_Pcurve + - symbol: StepGeom_PcurveOrSurface + - symbol: StepGeom_Placement + - symbol: StepGeom_Plane + - symbol: StepGeom_Point + - symbol: StepGeom_PointOnCurve + - symbol: StepGeom_PointOnSurface + - symbol: StepGeom_PointReplica + - symbol: StepGeom_Polyline + - symbol: StepGeom_PreferredSurfaceCurveRepresentation + - symbol: StepGeom_QuasiUniformCurve + - symbol: StepGeom_QuasiUniformCurveAndRationalBSplineCurve + - symbol: StepGeom_QuasiUniformSurface + - symbol: StepGeom_QuasiUniformSurfaceAndRationalBSplineSurface + - symbol: StepGeom_RationalBSplineCurve + - symbol: StepGeom_RationalBSplineSurface + - symbol: StepGeom_RectangularCompositeSurface + - symbol: StepGeom_RectangularTrimmedSurface + - symbol: StepGeom_ReparametrisedCompositeCurveSegment + - symbol: StepGeom_SeamCurve + - symbol: StepGeom_SphericalSurface + - symbol: StepGeom_SuParameters + - symbol: StepGeom_Surface + - symbol: StepGeom_SurfaceBoundary + - symbol: StepGeom_SurfaceCurve + - symbol: StepGeom_SurfaceCurveAndBoundedCurve + - symbol: StepGeom_SurfaceOfLinearExtrusion + - symbol: StepGeom_SurfaceOfRevolution + - symbol: StepGeom_SurfacePatch + - symbol: StepGeom_SurfaceReplica + - symbol: StepGeom_SweptSurface + - symbol: StepGeom_ToroidalSurface + - symbol: StepGeom_TransitionCode + - symbol: StepGeom_TrimmedCurve + - symbol: StepGeom_TrimmingMember + - symbol: StepGeom_TrimmingPreference + - symbol: StepGeom_TrimmingSelect + - symbol: StepGeom_UniformCurve + - symbol: StepGeom_UniformCurveAndRationalBSplineCurve + - symbol: StepGeom_UniformSurface + - symbol: StepGeom_UniformSurfaceAndRationalBSplineSurface + - symbol: StepGeom_Vector + - symbol: StepGeom_VectorOrDirection + - symbol: StepKinematics_ActuatedDirection + - symbol: StepKinematics_ActuatedKinPairAndOrderKinPair + - symbol: StepKinematics_ActuatedKinematicPair + - symbol: StepKinematics_ContextDependentKinematicLinkRepresentation + - symbol: StepKinematics_CylindricalPair + - symbol: StepKinematics_CylindricalPairValue + - symbol: StepKinematics_CylindricalPairWithRange + - symbol: StepKinematics_FullyConstrainedPair + - symbol: StepKinematics_GearPair + - symbol: StepKinematics_GearPairValue + - symbol: StepKinematics_GearPairWithRange + - symbol: StepKinematics_HighOrderKinematicPair + - symbol: StepKinematics_HomokineticPair + - symbol: StepKinematics_KinematicJoint + - symbol: StepKinematics_KinematicLink + - symbol: StepKinematics_KinematicLinkRepresentation + - symbol: StepKinematics_KinematicLinkRepresentationAssociation + - symbol: StepKinematics_KinematicPair + - symbol: StepKinematics_KinematicPropertyDefinitionRepresentation + - symbol: StepKinematics_KinematicPropertyMechanismRepresentation + - symbol: StepKinematics_KinematicTopologyDirectedStructure + - symbol: StepKinematics_KinematicTopologyNetworkStructure + - symbol: StepKinematics_KinematicTopologyRepresentationSelect + - symbol: StepKinematics_KinematicTopologyStructure + - symbol: StepKinematics_LinearFlexibleAndPinionPair + - symbol: StepKinematics_LinearFlexibleAndPlanarCurvePair + - symbol: StepKinematics_LinearFlexibleLinkRepresentation + - symbol: StepKinematics_LowOrderKinematicPair + - symbol: StepKinematics_LowOrderKinematicPairValue + - symbol: StepKinematics_LowOrderKinematicPairWithMotionCoupling + - symbol: StepKinematics_LowOrderKinematicPairWithRange + - symbol: StepKinematics_MechanismRepresentation + - symbol: StepKinematics_MechanismStateRepresentation + - symbol: StepKinematics_OrientedJoint + - symbol: StepKinematics_PairRepresentationRelationship + - symbol: StepKinematics_PairValue + - symbol: StepKinematics_PlanarCurvePair + - symbol: StepKinematics_PlanarCurvePairRange + - symbol: StepKinematics_PlanarPair + - symbol: StepKinematics_PlanarPairValue + - symbol: StepKinematics_PlanarPairWithRange + - symbol: StepKinematics_PointOnPlanarCurvePair + - symbol: StepKinematics_PointOnPlanarCurvePairValue + - symbol: StepKinematics_PointOnPlanarCurvePairWithRange + - symbol: StepKinematics_PointOnSurfacePair + - symbol: StepKinematics_PointOnSurfacePairValue + - symbol: StepKinematics_PointOnSurfacePairWithRange + - symbol: StepKinematics_PrismaticPair + - symbol: StepKinematics_PrismaticPairValue + - symbol: StepKinematics_PrismaticPairWithRange + - symbol: StepKinematics_ProductDefinitionKinematics + - symbol: StepKinematics_ProductDefinitionRelationshipKinematics + - symbol: StepKinematics_RackAndPinionPair + - symbol: StepKinematics_RackAndPinionPairValue + - symbol: StepKinematics_RackAndPinionPairWithRange + - symbol: StepKinematics_RevolutePair + - symbol: StepKinematics_RevolutePairValue + - symbol: StepKinematics_RevolutePairWithRange + - symbol: StepKinematics_RigidLinkRepresentation + - symbol: StepKinematics_RigidPlacement + - symbol: StepKinematics_RollingCurvePair + - symbol: StepKinematics_RollingCurvePairValue + - symbol: StepKinematics_RollingSurfacePair + - symbol: StepKinematics_RollingSurfacePairValue + - symbol: StepKinematics_RotationAboutDirection + - symbol: StepKinematics_ScrewPair + - symbol: StepKinematics_ScrewPairValue + - symbol: StepKinematics_ScrewPairWithRange + - symbol: StepKinematics_SlidingCurvePair + - symbol: StepKinematics_SlidingCurvePairValue + - symbol: StepKinematics_SlidingSurfacePair + - symbol: StepKinematics_SlidingSurfacePairValue + - symbol: StepKinematics_SpatialRotation + - symbol: StepKinematics_SphericalPair + - symbol: StepKinematics_SphericalPairSelect + - symbol: StepKinematics_SphericalPairValue + - symbol: StepKinematics_SphericalPairWithPin + - symbol: StepKinematics_SphericalPairWithPinAndRange + - symbol: StepKinematics_SphericalPairWithRange + - symbol: StepKinematics_SurfacePair + - symbol: StepKinematics_SurfacePairWithRange + - symbol: StepKinematics_UniversalPair + - symbol: StepKinematics_UniversalPairValue + - symbol: StepKinematics_UniversalPairWithRange + - symbol: StepRepr_AllAroundShapeAspect + - symbol: StepRepr_Apex + - symbol: StepRepr_AssemblyComponentUsage + - symbol: StepRepr_AssemblyComponentUsageSubstitute + - symbol: StepRepr_BetweenShapeAspect + - symbol: StepRepr_BooleanRepresentationItem + - symbol: StepRepr_CentreOfSymmetry + - symbol: StepRepr_CharacterizedDefinition + - symbol: StepRepr_CharacterizedRepresentation + - symbol: StepRepr_CompGroupShAspAndCompShAspAndDatumFeatAndShAsp + - symbol: StepRepr_CompShAspAndDatumFeatAndShAsp + - symbol: StepRepr_CompositeGroupShapeAspect + - symbol: StepRepr_CompositeShapeAspect + - symbol: StepRepr_CompoundRepresentationItem + - symbol: StepRepr_ConfigurationDesign + - symbol: StepRepr_ConfigurationDesignItem + - symbol: StepRepr_ConfigurationEffectivity + - symbol: StepRepr_ConfigurationItem + - symbol: StepRepr_ConstructiveGeometryRepresentation + - symbol: StepRepr_ConstructiveGeometryRepresentationRelationship + - symbol: StepRepr_ContinuosShapeAspect + - symbol: StepRepr_DataEnvironment + - symbol: StepRepr_DefinitionalRepresentation + - symbol: StepRepr_DerivedShapeAspect + - symbol: StepRepr_DescriptiveRepresentationItem + - symbol: StepRepr_Extension + - symbol: StepRepr_ExternallyDefinedRepresentation + - symbol: StepRepr_FeatureForDatumTargetRelationship + - symbol: StepRepr_FunctionallyDefinedTransformation + - symbol: StepRepr_GeometricAlignment + - symbol: StepRepr_GlobalUncertaintyAssignedContext + - symbol: StepRepr_GlobalUnitAssignedContext + - symbol: StepRepr_IntegerRepresentationItem + - symbol: StepRepr_ItemDefinedTransformation + - symbol: StepRepr_MakeFromUsageOption + - symbol: StepRepr_MappedItem + - symbol: StepRepr_MaterialDesignation + - symbol: StepRepr_MaterialProperty + - symbol: StepRepr_MaterialPropertyRepresentation + - symbol: StepRepr_MeasureRepresentationItem + - symbol: StepRepr_MechanicalDesignAndDraughtingRelationship + - symbol: StepRepr_NextAssemblyUsageOccurrence + - symbol: StepRepr_ParallelOffset + - symbol: StepRepr_ParametricRepresentationContext + - symbol: StepRepr_PerpendicularTo + - symbol: StepRepr_ProductConcept + - symbol: StepRepr_ProductDefinitionShape + - symbol: StepRepr_ProductDefinitionUsage + - symbol: StepRepr_PromissoryUsageOccurrence + - symbol: StepRepr_PropertyDefinition + - symbol: StepRepr_PropertyDefinitionRelationship + - symbol: StepRepr_PropertyDefinitionRepresentation + - symbol: StepRepr_QuantifiedAssemblyComponentUsage + - symbol: StepRepr_RealRepresentationItem + - symbol: StepRepr_ReprItemAndLengthMeasureWithUnit + - symbol: StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI + - symbol: StepRepr_ReprItemAndMeasureWithUnit + - symbol: StepRepr_ReprItemAndMeasureWithUnitAndQRI + - symbol: StepRepr_ReprItemAndPlaneAngleMeasureWithUnit + - symbol: StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI + - symbol: StepRepr_Representation + - symbol: StepRepr_RepresentationContext + - symbol: StepRepr_RepresentationContextReference + - symbol: StepRepr_RepresentationItem + - symbol: StepRepr_RepresentationMap + - symbol: StepRepr_RepresentationOrRepresentationReference + - symbol: StepRepr_RepresentationReference + - symbol: StepRepr_RepresentationRelationship + - symbol: StepRepr_RepresentationRelationshipWithTransformation + - symbol: StepRepr_RepresentedDefinition + - symbol: StepRepr_ShapeAspect + - symbol: StepRepr_ShapeAspectDerivingRelationship + - symbol: StepRepr_ShapeAspectRelationship + - symbol: StepRepr_ShapeAspectTransition + - symbol: StepRepr_ShapeDefinition + - symbol: StepRepr_ShapeRepresentationRelationship + - symbol: StepRepr_ShapeRepresentationRelationshipWithTransformation + - symbol: StepRepr_SpecifiedHigherUsageOccurrence + - symbol: StepRepr_StructuralResponseProperty + - symbol: StepRepr_StructuralResponsePropertyDefinitionRepresentation + - symbol: StepRepr_SuppliedPartRelationship + - symbol: StepRepr_Tangent + - symbol: StepRepr_Transformation + - symbol: StepRepr_ValueRange + - symbol: StepRepr_ValueRepresentationItem + - symbol: StepSelect_Activator + - symbol: StepSelect_FileModifier + - symbol: StepSelect_FloatFormat + - symbol: StepSelect_ModelModifier + - symbol: StepSelect_StepType + - symbol: StepSelect_WorkLibrary + - symbol: StepShape_AdvancedBrepShapeRepresentation + - symbol: StepShape_AdvancedFace + - symbol: StepShape_AngleRelator + - symbol: StepShape_AngularLocation + - symbol: StepShape_AngularSize + - symbol: StepShape_Block + - symbol: StepShape_BooleanOperand + - symbol: StepShape_BooleanOperator + - symbol: StepShape_BooleanResult + - symbol: StepShape_BoxDomain + - symbol: StepShape_BoxedHalfSpace + - symbol: StepShape_BrepWithVoids + - symbol: StepShape_ClosedShell + - symbol: StepShape_CompoundShapeRepresentation + - symbol: StepShape_ConnectedEdgeSet + - symbol: StepShape_ConnectedFaceSet + - symbol: StepShape_ConnectedFaceShapeRepresentation + - symbol: StepShape_ConnectedFaceSubSet + - symbol: StepShape_ContextDependentShapeRepresentation + - symbol: StepShape_CsgPrimitive + - symbol: StepShape_CsgSelect + - symbol: StepShape_CsgShapeRepresentation + - symbol: StepShape_CsgSolid + - symbol: StepShape_DefinitionalRepresentationAndShapeRepresentation + - symbol: StepShape_DimensionalCharacteristic + - symbol: StepShape_DimensionalCharacteristicRepresentation + - symbol: StepShape_DimensionalLocation + - symbol: StepShape_DimensionalLocationWithPath + - symbol: StepShape_DimensionalSize + - symbol: StepShape_DimensionalSizeWithPath + - symbol: StepShape_DirectedDimensionalLocation + - symbol: StepShape_Edge + - symbol: StepShape_EdgeBasedWireframeModel + - symbol: StepShape_EdgeBasedWireframeShapeRepresentation + - symbol: StepShape_EdgeCurve + - symbol: StepShape_EdgeLoop + - symbol: StepShape_ExtrudedAreaSolid + - symbol: StepShape_ExtrudedFaceSolid + - symbol: StepShape_Face + - symbol: StepShape_FaceBasedSurfaceModel + - symbol: StepShape_FaceBound + - symbol: StepShape_FaceOuterBound + - symbol: StepShape_FaceSurface + - symbol: StepShape_FacetedBrep + - symbol: StepShape_FacetedBrepAndBrepWithVoids + - symbol: StepShape_FacetedBrepShapeRepresentation + - symbol: StepShape_GeometricCurveSet + - symbol: StepShape_GeometricSet + - symbol: StepShape_GeometricSetSelect + - symbol: StepShape_GeometricallyBoundedSurfaceShapeRepresentation + - symbol: StepShape_GeometricallyBoundedWireframeShapeRepresentation + - symbol: StepShape_HalfSpaceSolid + - symbol: StepShape_LimitsAndFits + - symbol: StepShape_Loop + - symbol: StepShape_LoopAndPath + - symbol: StepShape_ManifoldSolidBrep + - symbol: StepShape_ManifoldSurfaceShapeRepresentation + - symbol: StepShape_MeasureQualification + - symbol: StepShape_MeasureRepresentationItemAndQualifiedRepresentationItem + - symbol: StepShape_NonManifoldSurfaceShapeRepresentation + - symbol: StepShape_OpenShell + - symbol: StepShape_OrientedClosedShell + - symbol: StepShape_OrientedEdge + - symbol: StepShape_OrientedFace + - symbol: StepShape_OrientedOpenShell + - symbol: StepShape_OrientedPath + - symbol: StepShape_Path + - symbol: StepShape_PlusMinusTolerance + - symbol: StepShape_PointRepresentation + - symbol: StepShape_PolyLoop + - symbol: StepShape_PrecisionQualifier + - symbol: StepShape_QualifiedRepresentationItem + - symbol: StepShape_ReversibleTopologyItem + - symbol: StepShape_RevolvedAreaSolid + - symbol: StepShape_RevolvedFaceSolid + - symbol: StepShape_RightAngularWedge + - symbol: StepShape_RightCircularCone + - symbol: StepShape_RightCircularCylinder + - symbol: StepShape_SeamEdge + - symbol: StepShape_ShapeDefinitionRepresentation + - symbol: StepShape_ShapeDimensionRepresentation + - symbol: StepShape_ShapeDimensionRepresentationItem + - symbol: StepShape_ShapeRepresentation + - symbol: StepShape_ShapeRepresentationWithParameters + - symbol: StepShape_Shell + - symbol: StepShape_ShellBasedSurfaceModel + - symbol: StepShape_SolidModel + - symbol: StepShape_SolidReplica + - symbol: StepShape_Sphere + - symbol: StepShape_Subedge + - symbol: StepShape_Subface + - symbol: StepShape_SurfaceModel + - symbol: StepShape_SweptAreaSolid + - symbol: StepShape_SweptFaceSolid + - symbol: StepShape_ToleranceMethodDefinition + - symbol: StepShape_ToleranceValue + - symbol: StepShape_TopologicalRepresentationItem + - symbol: StepShape_Torus + - symbol: StepShape_TransitionalShapeRepresentation + - symbol: StepShape_TypeQualifier + - symbol: StepShape_ValueFormatTypeQualifier + - symbol: StepShape_ValueQualifier + - symbol: StepShape_Vertex + - symbol: StepShape_VertexLoop + - symbol: StepShape_VertexPoint + - symbol: StepTidy_DuplicateCleaner + - symbol: StepToGeom + - symbol: StepToTopoDS + - symbol: StepToTopoDS_Builder + - symbol: StepToTopoDS_BuilderError + - symbol: StepToTopoDS_GeometricTool + - symbol: StepToTopoDS_GeometricToolError + - symbol: StepToTopoDS_MakeTransformed + - symbol: StepToTopoDS_NMTool + - symbol: StepToTopoDS_PointPair + - symbol: StepToTopoDS_Root + - symbol: StepToTopoDS_Tool + - symbol: StepToTopoDS_TranslateCompositeCurve + - symbol: StepToTopoDS_TranslateCurveBoundedSurface + - symbol: StepToTopoDS_TranslateEdge + - symbol: StepToTopoDS_TranslateEdgeError + - symbol: StepToTopoDS_TranslateEdgeLoop + - symbol: StepToTopoDS_TranslateEdgeLoopError + - symbol: StepToTopoDS_TranslateFaceError + - symbol: StepToTopoDS_TranslatePolyLoop + - symbol: StepToTopoDS_TranslatePolyLoopError + - symbol: StepToTopoDS_TranslateShell + - symbol: StepToTopoDS_TranslateShellError + - symbol: StepToTopoDS_TranslateSolid + - symbol: StepToTopoDS_TranslateSolidError + - symbol: StepToTopoDS_TranslateVertex + - symbol: StepToTopoDS_TranslateVertexError + - symbol: StepToTopoDS_TranslateVertexLoop + - symbol: StepToTopoDS_TranslateVertexLoopError + - symbol: StepVisual_AnnotationCurveOccurrence + - symbol: StepVisual_AnnotationCurveOccurrenceAndGeomReprItem + - symbol: StepVisual_AnnotationFillArea + - symbol: StepVisual_AnnotationFillAreaOccurrence + - symbol: StepVisual_AnnotationOccurrence + - symbol: StepVisual_AnnotationPlane + - symbol: StepVisual_AnnotationPlaneElement + - symbol: StepVisual_AnnotationText + - symbol: StepVisual_AnnotationTextOccurrence + - symbol: StepVisual_AreaInSet + - symbol: StepVisual_AreaOrView + - symbol: StepVisual_BackgroundColour + - symbol: StepVisual_BoxCharacteristicSelect + - symbol: StepVisual_CameraImage + - symbol: StepVisual_CameraImage2dWithScale + - symbol: StepVisual_CameraImage3dWithScale + - symbol: StepVisual_CameraModel + - symbol: StepVisual_CameraModelD2 + - symbol: StepVisual_CameraModelD3 + - symbol: StepVisual_CameraModelD3MultiClipping + - symbol: StepVisual_CameraModelD3MultiClippingInterectionSelect + - symbol: StepVisual_CameraModelD3MultiClippingIntersection + - symbol: StepVisual_CameraModelD3MultiClippingUnion + - symbol: StepVisual_CameraModelD3MultiClippingUnionSelect + - symbol: StepVisual_CameraUsage + - symbol: StepVisual_CentralOrParallel + - symbol: StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel + - symbol: StepVisual_Colour + - symbol: StepVisual_ColourRgb + - symbol: StepVisual_ColourSpecification + - symbol: StepVisual_ComplexTriangulatedFace + - symbol: StepVisual_ComplexTriangulatedSurfaceSet + - symbol: StepVisual_CompositeText + - symbol: StepVisual_CompositeTextWithExtent + - symbol: StepVisual_ContextDependentInvisibility + - symbol: StepVisual_ContextDependentOverRidingStyledItem + - symbol: StepVisual_CoordinatesList + - symbol: StepVisual_CubicBezierTessellatedEdge + - symbol: StepVisual_CubicBezierTriangulatedFace + - symbol: StepVisual_CurveStyle + - symbol: StepVisual_CurveStyleFont + - symbol: StepVisual_CurveStyleFontPattern + - symbol: StepVisual_CurveStyleFontSelect + - symbol: StepVisual_DirectionCountSelect + - symbol: StepVisual_DraughtingAnnotationOccurrence + - symbol: StepVisual_DraughtingCallout + - symbol: StepVisual_DraughtingCalloutElement + - symbol: StepVisual_DraughtingModel + - symbol: StepVisual_DraughtingPreDefinedColour + - symbol: StepVisual_DraughtingPreDefinedCurveFont + - symbol: StepVisual_EdgeOrCurve + - symbol: StepVisual_ExternallyDefinedCurveFont + - symbol: StepVisual_ExternallyDefinedTextFont + - symbol: StepVisual_FaceOrSurface + - symbol: StepVisual_FillAreaStyle + - symbol: StepVisual_FillAreaStyleColour + - symbol: StepVisual_FillStyleSelect + - symbol: StepVisual_FontSelect + - symbol: StepVisual_Invisibility + - symbol: StepVisual_InvisibilityContext + - symbol: StepVisual_InvisibleItem + - symbol: StepVisual_LayeredItem + - symbol: StepVisual_MarkerMember + - symbol: StepVisual_MarkerSelect + - symbol: StepVisual_MarkerType + - symbol: StepVisual_MechanicalDesignGeometricPresentationArea + - symbol: StepVisual_MechanicalDesignGeometricPresentationRepresentation + - symbol: StepVisual_NullStyle + - symbol: StepVisual_NullStyleMember + - symbol: StepVisual_OverRidingStyledItem + - symbol: StepVisual_PathOrCompositeCurve + - symbol: StepVisual_PlanarBox + - symbol: StepVisual_PlanarExtent + - symbol: StepVisual_PointStyle + - symbol: StepVisual_PreDefinedColour + - symbol: StepVisual_PreDefinedCurveFont + - symbol: StepVisual_PreDefinedItem + - symbol: StepVisual_PreDefinedTextFont + - symbol: StepVisual_PresentationArea + - symbol: StepVisual_PresentationLayerAssignment + - symbol: StepVisual_PresentationLayerUsage + - symbol: StepVisual_PresentationRepresentation + - symbol: StepVisual_PresentationRepresentationSelect + - symbol: StepVisual_PresentationSet + - symbol: StepVisual_PresentationSize + - symbol: StepVisual_PresentationSizeAssignmentSelect + - symbol: StepVisual_PresentationStyleAssignment + - symbol: StepVisual_PresentationStyleByContext + - symbol: StepVisual_PresentationStyleSelect + - symbol: StepVisual_PresentationView + - symbol: StepVisual_PresentedItem + - symbol: StepVisual_PresentedItemRepresentation + - symbol: StepVisual_RenderingPropertiesSelect + - symbol: StepVisual_RepositionedTessellatedGeometricSet + - symbol: StepVisual_RepositionedTessellatedItem + - symbol: StepVisual_ShadingSurfaceMethod + - symbol: StepVisual_StyleContextSelect + - symbol: StepVisual_StyledItem + - symbol: StepVisual_StyledItemTarget + - symbol: StepVisual_SurfaceSide + - symbol: StepVisual_SurfaceSideStyle + - symbol: StepVisual_SurfaceStyleBoundary + - symbol: StepVisual_SurfaceStyleControlGrid + - symbol: StepVisual_SurfaceStyleElementSelect + - symbol: StepVisual_SurfaceStyleFillArea + - symbol: StepVisual_SurfaceStyleParameterLine + - symbol: StepVisual_SurfaceStyleReflectanceAmbient + - symbol: StepVisual_SurfaceStyleReflectanceAmbientDiffuse + - symbol: StepVisual_SurfaceStyleReflectanceAmbientDiffuseSpecular + - symbol: StepVisual_SurfaceStyleRendering + - symbol: StepVisual_SurfaceStyleRenderingWithProperties + - symbol: StepVisual_SurfaceStyleSegmentationCurve + - symbol: StepVisual_SurfaceStyleSilhouette + - symbol: StepVisual_SurfaceStyleTransparent + - symbol: StepVisual_SurfaceStyleUsage + - symbol: StepVisual_Template + - symbol: StepVisual_TemplateInstance + - symbol: StepVisual_TessellatedAnnotationOccurrence + - symbol: StepVisual_TessellatedConnectingEdge + - symbol: StepVisual_TessellatedCurveSet + - symbol: StepVisual_TessellatedEdge + - symbol: StepVisual_TessellatedEdgeOrVertex + - symbol: StepVisual_TessellatedFace + - symbol: StepVisual_TessellatedGeometricSet + - symbol: StepVisual_TessellatedItem + - symbol: StepVisual_TessellatedPointSet + - symbol: StepVisual_TessellatedShapeRepresentation + - symbol: StepVisual_TessellatedShapeRepresentationWithAccuracyParameters + - symbol: StepVisual_TessellatedShell + - symbol: StepVisual_TessellatedSolid + - symbol: StepVisual_TessellatedStructuredItem + - symbol: StepVisual_TessellatedSurfaceSet + - symbol: StepVisual_TessellatedVertex + - symbol: StepVisual_TessellatedWire + - symbol: StepVisual_TextLiteral + - symbol: StepVisual_TextOrCharacter + - symbol: StepVisual_TextPath + - symbol: StepVisual_TextStyle + - symbol: StepVisual_TextStyleForDefinedFont + - symbol: StepVisual_TextStyleWithBoxCharacteristics + - symbol: StepVisual_TriangulatedFace + - symbol: StepVisual_TriangulatedSurfaceSet + - symbol: StepVisual_ViewVolume + - symbol: StlAPI + - symbol: StlAPI_Reader + - symbol: StlAPI_Writer + - symbol: Storage + - symbol: Storage_Bucket + - symbol: Storage_BucketIterator + - symbol: Storage_BucketOfPersistent + - symbol: Storage_CallBack + - symbol: Storage_Data + - symbol: Storage_DefaultCallBack + - symbol: Storage_Error + - symbol: Storage_HeaderData + - symbol: Storage_InternalData + - symbol: Storage_OpenMode + - symbol: Storage_Root + - symbol: Storage_RootData + - symbol: Storage_Schema + - symbol: Storage_SolveMode + - symbol: Storage_StreamExtCharParityError + - symbol: Storage_StreamFormatError + - symbol: Storage_StreamModeError + - symbol: Storage_StreamReadError + - symbol: Storage_StreamTypeMismatchError + - symbol: Storage_StreamUnknownTypeError + - symbol: Storage_StreamWriteError + - symbol: Storage_TypeData + - symbol: Storage_TypedCallBack + - symbol: Sweep_NumShape + - symbol: Sweep_NumShapeIterator + - symbol: Sweep_NumShapeTool + - symbol: TColStd_HPackedMapOfInteger + - symbol: TCollection + - symbol: TCollection_AsciiString + - symbol: TCollection_ExtendedString + - symbol: TCollection_HAsciiString + - symbol: TCollection_HExtendedString + - symbol: TDF + - symbol: TDF_Attribute + - symbol: TDF_AttributeDelta + - symbol: TDF_AttributeIterator + - symbol: TDF_ChildIDIterator + - symbol: TDF_ChildIterator + - symbol: TDF_ClosureMode + - symbol: TDF_ClosureTool + - symbol: TDF_ComparisonTool + - symbol: TDF_CopyLabel + - symbol: TDF_CopyTool + - symbol: TDF_Data + - symbol: TDF_DataSet + - symbol: TDF_DefaultDeltaOnModification + - symbol: TDF_DefaultDeltaOnRemoval + - symbol: TDF_Delta + - symbol: TDF_DeltaOnAddition + - symbol: TDF_DeltaOnForget + - symbol: TDF_DeltaOnModification + - symbol: TDF_DeltaOnRemoval + - symbol: TDF_DeltaOnResume + - symbol: TDF_IDFilter + - symbol: TDF_Label + - symbol: TDF_Reference + - symbol: TDF_RelocationTable + - symbol: TDF_TagSource + - symbol: TDF_Tool + - symbol: TDF_Transaction + - symbol: TDataStd + - symbol: TDataStd_AsciiString + - symbol: TDataStd_BooleanArray + - symbol: TDataStd_BooleanList + - symbol: TDataStd_ByteArray + - symbol: TDataStd_ChildNodeIterator + - symbol: TDataStd_Comment + - symbol: TDataStd_Current + - symbol: TDataStd_DeltaOnModificationOfByteArray + - symbol: TDataStd_DeltaOnModificationOfExtStringArray + - symbol: TDataStd_DeltaOnModificationOfIntArray + - symbol: TDataStd_DeltaOnModificationOfIntPackedMap + - symbol: TDataStd_DeltaOnModificationOfRealArray + - symbol: TDataStd_Directory + - symbol: TDataStd_Expression + - symbol: TDataStd_ExtStringArray + - symbol: TDataStd_ExtStringList + - symbol: TDataStd_GenericEmpty + - symbol: TDataStd_GenericExtString + - symbol: TDataStd_HDataMapOfStringByte + - symbol: TDataStd_HDataMapOfStringHArray1OfInteger + - symbol: TDataStd_HDataMapOfStringHArray1OfReal + - symbol: TDataStd_HDataMapOfStringInteger + - symbol: TDataStd_HDataMapOfStringReal + - symbol: TDataStd_HDataMapOfStringString + - symbol: TDataStd_IntPackedMap + - symbol: TDataStd_Integer + - symbol: TDataStd_IntegerArray + - symbol: TDataStd_IntegerList + - symbol: TDataStd_Name + - symbol: TDataStd_NamedData + - symbol: TDataStd_NoteBook + - symbol: TDataStd_Real + - symbol: TDataStd_RealArray + - symbol: TDataStd_RealEnum + - symbol: TDataStd_RealList + - symbol: TDataStd_ReferenceArray + - symbol: TDataStd_ReferenceList + - symbol: TDataStd_Relation + - symbol: TDataStd_Tick + - symbol: TDataStd_TreeNode + - symbol: TDataStd_UAttribute + - symbol: TDataStd_Variable + - symbol: TDataXtd + - symbol: TDataXtd_Axis + - symbol: TDataXtd_Constraint + - symbol: TDataXtd_ConstraintEnum + - symbol: TDataXtd_Geometry + - symbol: TDataXtd_GeometryEnum + - symbol: TDataXtd_Pattern + - symbol: TDataXtd_PatternStd + - symbol: TDataXtd_Placement + - symbol: TDataXtd_Plane + - symbol: TDataXtd_Point + - symbol: TDataXtd_Position + - symbol: TDataXtd_Presentation + - symbol: TDataXtd_Shape + - symbol: TDataXtd_Triangulation + - symbol: TDocStd + - symbol: TDocStd_Application + - symbol: TDocStd_ApplicationDelta + - symbol: TDocStd_CompoundDelta + - symbol: TDocStd_Context + - symbol: TDocStd_Document + - symbol: TDocStd_FormatVersion + - symbol: TDocStd_Modified + - symbol: TDocStd_MultiTransactionManager + - symbol: TDocStd_Owner + - symbol: TDocStd_PathParser + - symbol: TDocStd_XLink + - symbol: TDocStd_XLinkIterator + - symbol: TDocStd_XLinkRoot + - symbol: TDocStd_XLinkTool + - symbol: TFunction_Driver + - symbol: TFunction_DriverTable + - symbol: TFunction_ExecutionStatus + - symbol: TFunction_Function + - symbol: TFunction_GraphNode + - symbol: TFunction_IFunction + - symbol: TFunction_Iterator + - symbol: TFunction_Logbook + - symbol: TFunction_Scope + - symbol: TNaming + - symbol: TNaming_Builder + - symbol: TNaming_CopyShape + - symbol: TNaming_DeltaOnModification + - symbol: TNaming_DeltaOnRemoval + - symbol: TNaming_Evolution + - symbol: TNaming_Identifier + - symbol: TNaming_Iterator + - symbol: TNaming_IteratorOnShapesSet + - symbol: TNaming_Localizer + - symbol: TNaming_Name + - symbol: TNaming_NameType + - symbol: TNaming_NamedShape + - symbol: TNaming_Naming + - symbol: TNaming_NamingTool + - symbol: TNaming_NewShapeIterator + - symbol: TNaming_OldShapeIterator + - symbol: TNaming_RefShape + - symbol: TNaming_SameShapeIterator + - symbol: TNaming_Scope + - symbol: TNaming_Selector + - symbol: TNaming_ShapesSet + - symbol: TNaming_Tool + - symbol: TNaming_TranslateTool + - symbol: TNaming_Translator + - symbol: TNaming_UsedShapes + - symbol: TopAbs + - symbol: TopAbs_Orientation + - symbol: TopAbs_ShapeEnum + - symbol: TopAbs_State + - symbol: TopBas_TestInterference + - symbol: TopCnx_EdgeFaceTransition + - symbol: TopExp + - symbol: TopExp_Explorer + - symbol: TopLoc_Datum3D + - symbol: TopLoc_ItemLocation + - symbol: TopLoc_Location + - symbol: TopLoc_SListNodeOfItemLocation + - symbol: TopLoc_SListOfItemLocation + - symbol: TopTools + - symbol: TopTools_FormatVersion + - symbol: TopTools_LocationSet + - symbol: TopTools_ShapeMapHasher + - symbol: TopTools_ShapeSet + - symbol: TopTrans_CurveTransition + - symbol: TopTrans_SurfaceTransition + - symbol: TopoDSToStep + - symbol: TopoDSToStep_Builder + - symbol: TopoDSToStep_BuilderError + - symbol: TopoDSToStep_FacetedError + - symbol: TopoDSToStep_FacetedTool + - symbol: TopoDSToStep_MakeBrepWithVoids + - symbol: TopoDSToStep_MakeEdgeError + - symbol: TopoDSToStep_MakeFaceError + - symbol: TopoDSToStep_MakeFacetedBrep + - symbol: TopoDSToStep_MakeFacetedBrepAndBrepWithVoids + - symbol: TopoDSToStep_MakeGeometricCurveSet + - symbol: TopoDSToStep_MakeManifoldSolidBrep + - symbol: TopoDSToStep_MakeShellBasedSurfaceModel + - symbol: TopoDSToStep_MakeStepEdge + - symbol: TopoDSToStep_MakeStepFace + - symbol: TopoDSToStep_MakeStepVertex + - symbol: TopoDSToStep_MakeStepWire + - symbol: TopoDSToStep_MakeTessellatedItem + - symbol: TopoDSToStep_MakeVertexError + - symbol: TopoDSToStep_MakeWireError + - symbol: TopoDSToStep_Root + - symbol: TopoDSToStep_Tool + - symbol: TopoDSToStep_WireframeBuilder + - symbol: TopoDS_AlertAttribute + - symbol: TopoDS_AlertWithShape + - symbol: TopoDS_Builder + - symbol: TopoDS_CompSolid + - symbol: TopoDS_Compound + - symbol: TopoDS_Edge + - symbol: TopoDS_Face + - symbol: TopoDS_FrozenShape + - symbol: TopoDS_HShape + - symbol: TopoDS_Iterator + - symbol: TopoDS_LockedShape + - symbol: TopoDS_Shape + - symbol: TopoDS_Shell + - symbol: TopoDS_Solid + - symbol: TopoDS_TCompSolid + - symbol: TopoDS_TCompound + - symbol: TopoDS_TEdge + - symbol: TopoDS_TFace + - symbol: TopoDS_TShape + - symbol: TopoDS_TShell + - symbol: TopoDS_TSolid + - symbol: TopoDS_TVertex + - symbol: TopoDS_TWire + - symbol: TopoDS_UnCompatibleShapes + - symbol: TopoDS_Vertex + - symbol: TopoDS_Wire + - symbol: TransferBRep_BinderOfShape + - symbol: TransferBRep_Reader + - symbol: TransferBRep_ShapeBinder + - symbol: TransferBRep_ShapeInfo + - symbol: TransferBRep_ShapeListBinder + - symbol: TransferBRep_ShapeMapper + - symbol: TransferBRep_TransferResultInfo + - symbol: Transfer_ActorDispatch + - symbol: Transfer_ActorOfFinderProcess + - symbol: Transfer_ActorOfProcessForFinder + - symbol: Transfer_ActorOfProcessForTransient + - symbol: Transfer_ActorOfTransientProcess + - symbol: Transfer_Binder + - symbol: Transfer_BinderOfTransientInteger + - symbol: Transfer_DataInfo + - symbol: Transfer_DispatchControl + - symbol: Transfer_FindHasher + - symbol: Transfer_Finder + - symbol: Transfer_FinderProcess + - symbol: Transfer_IteratorOfProcessForFinder + - symbol: Transfer_IteratorOfProcessForTransient + - symbol: Transfer_MapContainer + - symbol: Transfer_MultipleBinder + - symbol: Transfer_ProcessForFinder + - symbol: Transfer_ProcessForTransient + - symbol: Transfer_ResultFromModel + - symbol: Transfer_ResultFromTransient + - symbol: Transfer_SimpleBinderOfTransient + - symbol: Transfer_StatusExec + - symbol: Transfer_StatusResult + - symbol: Transfer_TransferDeadLoop + - symbol: Transfer_TransferDispatch + - symbol: Transfer_TransferFailure + - symbol: Transfer_TransferInput + - symbol: Transfer_TransferIterator + - symbol: Transfer_TransferOutput + - symbol: Transfer_TransientListBinder + - symbol: Transfer_TransientMapper + - symbol: Transfer_TransientProcess + - symbol: Transfer_UndefMode + - symbol: Transfer_VoidBinder + - symbol: Units + - symbol: UnitsAPI + - symbol: UnitsAPI_SystemUnits + - symbol: UnitsMethods + - symbol: UnitsMethods_LengthUnit + - symbol: Units_Dimensions + - symbol: Units_Explorer + - symbol: Units_Lexicon + - symbol: Units_MathSentence + - symbol: Units_Measurement + - symbol: Units_NoSuchType + - symbol: Units_NoSuchUnit + - symbol: Units_Quantity + - symbol: Units_Sentence + - symbol: Units_ShiftedToken + - symbol: Units_ShiftedUnit + - symbol: Units_Token + - symbol: Units_Unit + - symbol: Units_UnitSentence + - symbol: Units_UnitsDictionary + - symbol: Units_UnitsLexicon + - symbol: Units_UnitsSystem + - symbol: XCAFApp_Application + - symbol: XCAFDimTolObjects_AngularQualifier + - symbol: XCAFDimTolObjects_DatumModifWithValue + - symbol: XCAFDimTolObjects_DatumObject + - symbol: XCAFDimTolObjects_DatumSingleModif + - symbol: XCAFDimTolObjects_DatumTargetType + - symbol: XCAFDimTolObjects_DimensionFormVariance + - symbol: XCAFDimTolObjects_DimensionGrade + - symbol: XCAFDimTolObjects_DimensionModif + - symbol: XCAFDimTolObjects_DimensionObject + - symbol: XCAFDimTolObjects_DimensionQualifier + - symbol: XCAFDimTolObjects_DimensionType + - symbol: XCAFDimTolObjects_GeomToleranceMatReqModif + - symbol: XCAFDimTolObjects_GeomToleranceModif + - symbol: XCAFDimTolObjects_GeomToleranceObject + - symbol: XCAFDimTolObjects_GeomToleranceType + - symbol: XCAFDimTolObjects_GeomToleranceTypeValue + - symbol: XCAFDimTolObjects_GeomToleranceZoneModif + - symbol: XCAFDimTolObjects_ToleranceZoneAffectedPlane + - symbol: XCAFDimTolObjects_Tool + - symbol: XCAFDoc + - symbol: XCAFDoc_Area + - symbol: XCAFDoc_AssemblyGraph + - symbol: XCAFDoc_AssemblyGraph_Iterator + - symbol: XCAFDoc_AssemblyItemId + - symbol: XCAFDoc_AssemblyItemRef + - symbol: XCAFDoc_AssemblyIterator + - symbol: XCAFDoc_AssemblyTool + - symbol: XCAFDoc_Centroid + - symbol: XCAFDoc_ClippingPlaneTool + - symbol: XCAFDoc_Color + - symbol: XCAFDoc_ColorTool + - symbol: XCAFDoc_ColorType + - symbol: XCAFDoc_Datum + - symbol: XCAFDoc_DimTol + - symbol: XCAFDoc_DimTolTool + - symbol: XCAFDoc_Dimension + - symbol: XCAFDoc_DocumentTool + - symbol: XCAFDoc_Editor + - symbol: XCAFDoc_GeomTolerance + - symbol: XCAFDoc_GraphNode + - symbol: XCAFDoc_LayerTool + - symbol: XCAFDoc_LengthUnit + - symbol: XCAFDoc_Location + - symbol: XCAFDoc_Material + - symbol: XCAFDoc_MaterialTool + - symbol: XCAFDoc_Note + - symbol: XCAFDoc_NoteBalloon + - symbol: XCAFDoc_NoteBinData + - symbol: XCAFDoc_NoteComment + - symbol: XCAFDoc_NotesTool + - symbol: XCAFDoc_ShapeMapTool + - symbol: XCAFDoc_ShapeTool + - symbol: XCAFDoc_View + - symbol: XCAFDoc_ViewTool + - symbol: XCAFDoc_VisMaterial + - symbol: XCAFDoc_VisMaterialCommon + - symbol: XCAFDoc_VisMaterialPBR + - symbol: XCAFDoc_VisMaterialTool + - symbol: XCAFDoc_Volume + - symbol: XCAFNoteObjects_NoteObject + - symbol: XCAFPrs + - symbol: XCAFPrs_DocumentExplorer + - symbol: XCAFPrs_DocumentIdIterator + - symbol: XCAFPrs_DocumentNode + - symbol: XCAFPrs_Style + - symbol: XCAFView_Object + - symbol: XCAFView_ProjectionType + - symbol: XSAlgo + - symbol: XSAlgo_AlgoContainer + - symbol: XSControl + - symbol: XSControl_ConnectedShapes + - symbol: XSControl_Controller + - symbol: XSControl_FuncShape + - symbol: XSControl_Functions + - symbol: XSControl_Reader + - symbol: XSControl_SelectForTransfer + - symbol: XSControl_SignTransferStatus + - symbol: XSControl_TransferReader + - symbol: XSControl_TransferWriter + - symbol: XSControl_Utils + - symbol: XSControl_Vars + - symbol: XSControl_WorkSession + - symbol: XSControl_WorkSessionMap + - symbol: XSControl_Writer + - symbol: gce_ErrorType + - symbol: gce_MakeCirc + - symbol: gce_MakeCirc2d + - symbol: gce_MakeCone + - symbol: gce_MakeCylinder + - symbol: gce_MakeDir + - symbol: gce_MakeDir2d + - symbol: gce_MakeElips + - symbol: gce_MakeElips2d + - symbol: gce_MakeHypr + - symbol: gce_MakeHypr2d + - symbol: gce_MakeLin + - symbol: gce_MakeLin2d + - symbol: gce_MakeMirror + - symbol: gce_MakeMirror2d + - symbol: gce_MakeParab + - symbol: gce_MakeParab2d + - symbol: gce_MakePln + - symbol: gce_MakeRotation + - symbol: gce_MakeRotation2d + - symbol: gce_MakeScale + - symbol: gce_MakeScale2d + - symbol: gce_MakeTranslation + - symbol: gce_MakeTranslation2d + - symbol: gce_Root + - symbol: gp + - symbol: gp_Ax1 + - symbol: gp_Ax2 + - symbol: gp_Ax22d + - symbol: gp_Ax2d + - symbol: gp_Ax3 + - symbol: gp_Circ + - symbol: gp_Circ2d + - symbol: gp_Cone + - symbol: gp_Cylinder + - symbol: gp_Dir + - symbol: gp_Dir2d + - symbol: gp_Elips + - symbol: gp_Elips2d + - symbol: gp_EulerSequence + - symbol: gp_GTrsf + - symbol: gp_GTrsf2d + - symbol: gp_Hypr + - symbol: gp_Hypr2d + - symbol: gp_Lin + - symbol: gp_Lin2d + - symbol: gp_Mat + - symbol: gp_Mat2d + - symbol: gp_Parab + - symbol: gp_Parab2d + - symbol: gp_Pln + - symbol: gp_Pnt + - symbol: gp_Pnt2d + - symbol: gp_Quaternion + - symbol: gp_QuaternionNLerp + - symbol: gp_QuaternionSLerp + - symbol: gp_Sphere + - symbol: gp_Torus + - symbol: gp_Trsf + - symbol: gp_Trsf2d + - symbol: gp_TrsfForm + - symbol: gp_Vec + - symbol: gp_Vec2d + - symbol: gp_XY + - symbol: gp_XYZ + - symbol: math + - symbol: math_BFGS + - symbol: math_BissecNewton + - symbol: math_BracketMinimum + - symbol: math_BracketedRoot + - symbol: math_BrentMinimum + - symbol: math_BullardGenerator + - symbol: math_ComputeGaussPointsAndWeights + - symbol: math_ComputeKronrodPointsAndWeights + - symbol: math_Crout + - symbol: math_DirectPolynomialRoots + - symbol: math_DoubleTab + - symbol: math_EigenValuesSearcher + - symbol: math_FRPR + - symbol: math_Function + - symbol: math_FunctionAllRoots + - symbol: math_FunctionRoot + - symbol: math_FunctionRoots + - symbol: math_FunctionSample + - symbol: math_FunctionSet + - symbol: math_FunctionSetRoot + - symbol: math_FunctionSetWithDerivatives + - symbol: math_FunctionWithDerivative + - symbol: math_Gauss + - symbol: math_GaussLeastSquare + - symbol: math_GaussMultipleIntegration + - symbol: math_GaussSetIntegration + - symbol: math_GaussSingleIntegration + - symbol: math_GlobOptMin + - symbol: math_Jacobi + - symbol: math_KronrodSingleIntegration + - symbol: math_Matrix + - symbol: math_MultipleVarFunction + - symbol: math_MultipleVarFunctionWithGradient + - symbol: math_MultipleVarFunctionWithHessian + - symbol: math_NewtonFunctionRoot + - symbol: math_NotSquare + - symbol: math_PSO + - symbol: math_PSOParticlesPool + - symbol: math_Powell + - symbol: math_SVD + - symbol: math_SingularMatrix + - symbol: math_Status + - symbol: math_TrigonometricEquationFunction + - symbol: math_TrigonometricFunctionRoots + - symbol: math_Uzawa + - symbol: math_ValueAndWeight + additionalBindCode: | + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + struct TopoDS_Cast {}; + using namespace emscripten; + EMSCRIPTEN_BINDINGS(ocjs_additional) { + function("FairCurve_Batten_Compute", optional_override([](FairCurve_Batten& self, int nbIter, double tol) -> int { + FairCurve_AnalysisCode code; + self.Compute(code, nbIter, tol); + return static_cast(code); + })); + function("FairCurve_MinimalVariation_Compute", optional_override([](FairCurve_MinimalVariation& self, int nbIter, double tol) -> int { + FairCurve_AnalysisCode code; + self.Compute(code, nbIter, tol); + return static_cast(code); + })); + class_("TopoDS_Cast") + .class_function("Edge", optional_override([](const TopoDS_Shape& s) -> TopoDS_Edge { return TopoDS::Edge(s); })) + .class_function("Wire", optional_override([](const TopoDS_Shape& s) -> TopoDS_Wire { return TopoDS::Wire(s); })) + .class_function("Face", optional_override([](const TopoDS_Shape& s) -> TopoDS_Face { return TopoDS::Face(s); })) + .class_function("Vertex", optional_override([](const TopoDS_Shape& s) -> TopoDS_Vertex { return TopoDS::Vertex(s); })) + .class_function("Shell", optional_override([](const TopoDS_Shape& s) -> TopoDS_Shell { return TopoDS::Shell(s); })) + .class_function("Solid", optional_override([](const TopoDS_Shape& s) -> TopoDS_Solid { return TopoDS::Solid(s); })) + .class_function("Compound", optional_override([](const TopoDS_Shape& s) -> TopoDS_Compound { return TopoDS::Compound(s); })) + ; + } + emccFlags: + - -fwasm-exceptions + - -sEXPORT_EXCEPTION_HANDLING_HELPERS + - -sEXPORT_ES6=1 + - -sMODULARIZE + - -sALLOW_MEMORY_GROWTH=1 + - -sEXPORTED_RUNTIME_METHODS=["FS"] + - -sINITIAL_MEMORY=128MB + - -sMAXIMUM_MEMORY=4GB + - -sUSE_FREETYPE=1 + - -sERROR_ON_UNDEFINED_SYMBOLS=0 + - --no-entry + - -Wl,--allow-undefined + - --emit-symbol-map + - -sSTACK_SIZE=8388608 + - -sWASM_BIGINT + - -msimd128 + - -O3 + # ── Multi-threading additions (delta from full.yml) ───────────── + # Recipe: docs-site/content/docs/package/guides/multi-threading.mdx (published /multi subpath). + # -sEVAL_CTORS=2 (present in full.yml) is DROPPED -- ctor evaluation + # order is non-deterministic under pthread workers. + - -pthread + - -sUSE_PTHREADS=1 + # Pre-spawn one worker per logical CPU on the host. The expression is evaluated by the + # generated JS glue at module-instantiation time, so a single binary adapts to whatever + # hardware loads it. See BENCHMARKS.md — Impact of R1 (PTHREAD_POOL_SIZE bump). + - -sPTHREAD_POOL_SIZE=navigator.hardwareConcurrency + - -sSHARED_MEMORY=1 + - -sENVIRONMENT=web,worker,node diff --git a/build-configs/full_multi_browser.yml b/build-configs/full_multi_browser.yml new file mode 100644 index 00000000..0ed19e29 --- /dev/null +++ b/build-configs/full_multi_browser.yml @@ -0,0 +1,4541 @@ +# R12 — Browser-only multi-threaded build (opt-in variant of full_multi.yml). +# +# This configuration adds `-sGROWABLE_ARRAYBUFFERS=1` to the multi-threaded +# base so consumers can avoid the per-call HEAP* re-fetch dance documented +# in `docs-site/content/docs/package/guides/multi-threading.mdx` (search +# for "Performance notes"). The flag tells Emscripten to emit JS glue that +# calls `WebAssembly.Memory.prototype.toResizableBuffer()` to wrap the +# pthread `SharedArrayBuffer` as a resizable view — eliminating the +# `-Wpthreads-mem-growth` advisory entirely. +# +# Runtime support matrix (May 2026 baseline): +# Supported: +# - Chrome / Edge >= 144 +# - Firefox >= 145 +# - Safari >= 26.2 (desktop + iOS) +# NOT supported (do NOT ship this build to these runtimes): +# - Node.js (all current LTS) — runtime TypeError on init: +# `TypeError: wasmMemory.toResizableBuffer is not a function` +# - Bun (all current versions) +# - Deno (all current versions) +# - Samsung Internet (lags behind upstream Chromium) +# +# Use `full_multi.yml` if you need to support any of the unsupported +# runtimes; the default multi-threaded build keeps `-sGROWABLE_ARRAYBUFFERS=0` +# precisely so it stays compatible with Node-based test harnesses, Bun, +# Deno, and legacy mobile browsers. +# +# Rollback recipe — to revert a consumer to the broadly-compatible build, +# swap their YAML's `link full_multi_browser.yml` for `link full_multi.yml` +# (no other changes needed; the artefact names are identical). +mainBuild: + name: opencascade_full_multi_browser.js + bindings: + - symbol: APIHeaderSection_EditHeader + - symbol: APIHeaderSection_MakeHeader + - symbol: Adaptor2d_Curve2d + - symbol: Adaptor2d_Line2d + - symbol: Adaptor2d_OffsetCurve + - symbol: Adaptor3d_Curve + - symbol: Adaptor3d_CurveOnSurface + - symbol: Adaptor3d_HSurfaceTool + - symbol: Adaptor3d_HVertex + - symbol: Adaptor3d_InterFunc + - symbol: Adaptor3d_IsoCurve + - symbol: Adaptor3d_Surface + - symbol: Adaptor3d_TopolTool + - symbol: AdvApprox_ApproxAFunction + - symbol: AdvApprox_Cutting + - symbol: AdvApprox_DichoCutting + - symbol: AdvApprox_EvaluatorFunction + - symbol: AdvApprox_PrefAndRec + - symbol: AdvApprox_PrefCutting + - symbol: AdvApprox_SimpleApprox + - symbol: AppBlend_Approx + - symbol: AppCont_Function + - symbol: AppCont_LeastSquare + - symbol: AppParCurves + - symbol: AppParCurves_Constraint + - symbol: AppParCurves_ConstraintCouple + - symbol: AppParCurves_MultiBSpCurve + - symbol: AppParCurves_MultiCurve + - symbol: AppParCurves_MultiPoint + - symbol: AppStdL_Application + - symbol: AppStd_Application + - symbol: ApproxInt_KnotTools + - symbol: ApproxInt_SvSurfaces + - symbol: Approx_BSplineApproxInterp + - symbol: Approx_Curve2d + - symbol: Approx_Curve3d + - symbol: Approx_CurveOnSurface + - symbol: Approx_CurvilinearParameter + - symbol: Approx_CurvlinFunc + - symbol: Approx_FitAndDivide + - symbol: Approx_FitAndDivide2d + - symbol: Approx_MCurvesToBSpCurve + - symbol: Approx_ParametrizationType + - symbol: Approx_SameParameter + - symbol: Approx_Status + - symbol: Approx_SweepApproximation + - symbol: Approx_SweepFunction + - symbol: BOPAlgo_AlertAcquiredSelfIntersection + - symbol: BOPAlgo_AlertBOPNotAllowed + - symbol: BOPAlgo_AlertBOPNotSet + - symbol: BOPAlgo_AlertBadPositioning + - symbol: BOPAlgo_AlertBuilderFailed + - symbol: BOPAlgo_AlertBuildingPCurveFailed + - symbol: BOPAlgo_AlertEmptyShape + - symbol: BOPAlgo_AlertFaceBuilderUnusedEdges + - symbol: BOPAlgo_AlertIntersectionFailed + - symbol: BOPAlgo_AlertIntersectionOfPairOfShapesFailed + - symbol: BOPAlgo_AlertMultiDimensionalArguments + - symbol: BOPAlgo_AlertMultipleArguments + - symbol: BOPAlgo_AlertNoFacesToRemove + - symbol: BOPAlgo_AlertNoFiller + - symbol: BOPAlgo_AlertNoPeriodicityRequired + - symbol: BOPAlgo_AlertNotSplittableEdge + - symbol: BOPAlgo_AlertNullInputShapes + - symbol: BOPAlgo_AlertPostTreatFF + - symbol: BOPAlgo_AlertRemovalOfIBForEdgesFailed + - symbol: BOPAlgo_AlertRemovalOfIBForFacesFailed + - symbol: BOPAlgo_AlertRemovalOfIBForMDimShapes + - symbol: BOPAlgo_AlertRemovalOfIBForSolidsFailed + - symbol: BOPAlgo_AlertRemoveFeaturesFailed + - symbol: BOPAlgo_AlertSelfInterferingShape + - symbol: BOPAlgo_AlertShapeIsNotPeriodic + - symbol: BOPAlgo_AlertShellSplitterFailed + - symbol: BOPAlgo_AlertSolidBuilderFailed + - symbol: BOPAlgo_AlertSolidBuilderUnusedFaces + - symbol: BOPAlgo_AlertTooFewArguments + - symbol: BOPAlgo_AlertTooSmallEdge + - symbol: BOPAlgo_AlertUnableToGlue + - symbol: BOPAlgo_AlertUnableToMakeClosedEdgeOnFace + - symbol: BOPAlgo_AlertUnableToMakeIdentical + - symbol: BOPAlgo_AlertUnableToMakePeriodic + - symbol: BOPAlgo_AlertUnableToOrientTheShape + - symbol: BOPAlgo_AlertUnableToRemoveTheFeature + - symbol: BOPAlgo_AlertUnableToRepeat + - symbol: BOPAlgo_AlertUnableToTrim + - symbol: BOPAlgo_AlertUnknownShape + - symbol: BOPAlgo_AlertUnsupportedType + - symbol: BOPAlgo_AlertUserBreak + - symbol: BOPAlgo_Algo + - symbol: BOPAlgo_ArgumentAnalyzer + - symbol: BOPAlgo_BOP + - symbol: BOPAlgo_Builder + - symbol: BOPAlgo_BuilderArea + - symbol: BOPAlgo_BuilderFace + - symbol: BOPAlgo_BuilderShape + - symbol: BOPAlgo_BuilderSolid + - symbol: BOPAlgo_CellsBuilder + - symbol: BOPAlgo_CheckResult + - symbol: BOPAlgo_CheckStatus + - symbol: BOPAlgo_CheckerSI + - symbol: BOPAlgo_EdgeInfo + - symbol: BOPAlgo_GlueEnum + - symbol: BOPAlgo_MakeConnected + - symbol: BOPAlgo_MakePeriodic + - symbol: BOPAlgo_MakePeriodic_PeriodicityParams + - symbol: BOPAlgo_MakerVolume + - symbol: BOPAlgo_Operation + - symbol: BOPAlgo_Options + - symbol: BOPAlgo_PISteps + - symbol: BOPAlgo_ParallelAlgo + - symbol: BOPAlgo_RemoveFeatures + - symbol: BOPAlgo_Section + - symbol: BOPAlgo_SectionAttribute + - symbol: BOPAlgo_ShellSplitter + - symbol: BOPAlgo_Splitter + - symbol: BOPAlgo_Tools + - symbol: BOPAlgo_ToolsProvider + - symbol: BOPAlgo_WireEdgeSet + - symbol: BOPAlgo_WireSplitter + - symbol: BOPDS_CommonBlock + - symbol: BOPDS_CoupleOfPaveBlocks + - symbol: BOPDS_Curve + - symbol: BOPDS_DS + - symbol: BOPDS_FaceInfo + - symbol: BOPDS_IndexRange + - symbol: BOPDS_Interf + - symbol: BOPDS_InterfEE + - symbol: BOPDS_InterfEF + - symbol: BOPDS_InterfEZ + - symbol: BOPDS_InterfFF + - symbol: BOPDS_InterfFZ + - symbol: BOPDS_InterfVE + - symbol: BOPDS_InterfVF + - symbol: BOPDS_InterfVV + - symbol: BOPDS_InterfVZ + - symbol: BOPDS_InterfZZ + - symbol: BOPDS_Pair + - symbol: BOPDS_Pave + - symbol: BOPDS_PaveBlock + - symbol: BOPDS_Point + - symbol: BOPDS_ShapeInfo + - symbol: BOPDS_SubIterator + - symbol: BOPDS_Tools + - symbol: BOPTools_AlgoTools + - symbol: BOPTools_AlgoTools2D + - symbol: BOPTools_AlgoTools3D + - symbol: BOPTools_ConnexityBlock + - symbol: BOPTools_CoupleOfShape + - symbol: BOPTools_Set + - symbol: BRepAdaptor_CompCurve + - symbol: BRepAdaptor_Curve + - symbol: BRepAdaptor_Curve2d + - symbol: BRepAdaptor_Surface + - symbol: BRepAlgo + - symbol: BRepAlgoAPI_Algo + - symbol: BRepAlgoAPI_BooleanOperation + - symbol: BRepAlgoAPI_BuilderAlgo + - symbol: BRepAlgoAPI_Check + - symbol: BRepAlgoAPI_Common + - symbol: BRepAlgoAPI_Cut + - symbol: BRepAlgoAPI_Defeaturing + - symbol: BRepAlgoAPI_Fuse + - symbol: BRepAlgoAPI_Section + - symbol: BRepAlgoAPI_Splitter + - symbol: BRepAlgo_AsDes + - symbol: BRepAlgo_FaceRestrictor + - symbol: BRepAlgo_Image + - symbol: BRepAlgo_Loop + - symbol: BRepAlgo_NormalProjection + - symbol: BRepApprox_ApproxLine + - symbol: BRepApprox_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_MyBSplGradientOfTheComputeLineOfApprox + - symbol: BRepApprox_MyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_MyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_ParFunctionOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_ParFunctionOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfApprox + - symbol: BRepApprox_ParLeastSquareOfMyGradientbisOfTheComputeLineOfApprox + - symbol: BRepApprox_SurfaceTool + - symbol: BRepApprox_TheImpPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheInt2SOfThePrmPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheMultiLineOfApprox + - symbol: BRepApprox_TheMultiLineToolOfApprox + - symbol: BRepApprox_ThePrmPrmSvSurfacesOfApprox + - symbol: BRepApprox_TheZerImpFuncOfTheImpPrmSvSurfacesOfApprox + - symbol: BRepBlend_AppFunc + - symbol: BRepBlend_AppFuncRoot + - symbol: BRepBlend_AppFuncRst + - symbol: BRepBlend_AppFuncRstRst + - symbol: BRepBlend_AppSurf + - symbol: BRepBlend_AppSurface + - symbol: BRepBlend_BlendTool + - symbol: BRepBlend_CSWalking + - symbol: BRepBlend_CurvPointRadInv + - symbol: BRepBlend_Extremity + - symbol: BRepBlend_HCurve2dTool + - symbol: BRepBlend_HCurveTool + - symbol: BRepBlend_Line + - symbol: BRepBlend_PointOnRst + - symbol: BRepBlend_RstRstConstRad + - symbol: BRepBlend_RstRstEvolRad + - symbol: BRepBlend_RstRstLineBuilder + - symbol: BRepBlend_SurfCurvConstRadInv + - symbol: BRepBlend_SurfCurvEvolRadInv + - symbol: BRepBlend_SurfPointConstRadInv + - symbol: BRepBlend_SurfPointEvolRadInv + - symbol: BRepBlend_SurfRstConstRad + - symbol: BRepBlend_SurfRstEvolRad + - symbol: BRepBlend_SurfRstLineBuilder + - symbol: BRepBndLib + - symbol: BRepBuilderAPI + - symbol: BRepBuilderAPI_BndBoxTreeSelector + - symbol: BRepBuilderAPI_Collect + - symbol: BRepBuilderAPI_Command + - symbol: BRepBuilderAPI_Copy + - symbol: BRepBuilderAPI_EdgeError + - symbol: BRepBuilderAPI_FaceError + - symbol: BRepBuilderAPI_FastSewing + - symbol: BRepBuilderAPI_FindPlane + - symbol: BRepBuilderAPI_GTransform + - symbol: BRepBuilderAPI_MakeEdge + - symbol: BRepBuilderAPI_MakeEdge2d + - symbol: BRepBuilderAPI_MakeFace + - symbol: BRepBuilderAPI_MakePolygon + - symbol: BRepBuilderAPI_MakeShape + - symbol: BRepBuilderAPI_MakeShapeOnMesh + - symbol: BRepBuilderAPI_MakeShell + - symbol: BRepBuilderAPI_MakeSolid + - symbol: BRepBuilderAPI_MakeVertex + - symbol: BRepBuilderAPI_MakeWire + - symbol: BRepBuilderAPI_ModifyShape + - symbol: BRepBuilderAPI_NurbsConvert + - symbol: BRepBuilderAPI_PipeError + - symbol: BRepBuilderAPI_Sewing + - symbol: BRepBuilderAPI_ShapeModification + - symbol: BRepBuilderAPI_ShellError + - symbol: BRepBuilderAPI_Transform + - symbol: BRepBuilderAPI_TransitionMode + - symbol: BRepBuilderAPI_VertexInspector + - symbol: BRepBuilderAPI_WireError + - symbol: BRepCheck + - symbol: BRepCheck_Analyzer + - symbol: BRepCheck_Edge + - symbol: BRepCheck_Face + - symbol: BRepCheck_Result + - symbol: BRepCheck_Shell + - symbol: BRepCheck_Solid + - symbol: BRepCheck_Status + - symbol: BRepCheck_Vertex + - symbol: BRepCheck_Wire + - symbol: BRepClass3d + - symbol: BRepClass3d_BndBoxTreeSelectorLine + - symbol: BRepClass3d_BndBoxTreeSelectorPoint + - symbol: BRepClass3d_Intersector3d + - symbol: BRepClass3d_SClassifier + - symbol: BRepClass3d_SolidClassifier + - symbol: BRepClass3d_SolidExplorer + - symbol: BRepClass3d_SolidPassiveClassifier + - symbol: BRepClass_Edge + - symbol: BRepClass_FClass2dOfFClassifier + - symbol: BRepClass_FClassifier + - symbol: BRepClass_FaceClassifier + - symbol: BRepClass_FacePassiveClassifier + - symbol: BRepClass_Intersector + - symbol: BRepExtrema_DistShapeShape + - symbol: BRepExtrema_DistanceSS + - symbol: BRepExtrema_ElementFilter + - symbol: BRepExtrema_ExtCC + - symbol: BRepExtrema_ExtCF + - symbol: BRepExtrema_ExtFF + - symbol: BRepExtrema_ExtPC + - symbol: BRepExtrema_ExtPF + - symbol: BRepExtrema_OverlapTool + - symbol: BRepExtrema_Poly + - symbol: BRepExtrema_ProximityDistTool_PrjState + - symbol: BRepExtrema_SelfIntersection + - symbol: BRepExtrema_ShapeProximity + - symbol: BRepExtrema_SolutionElem + - symbol: BRepExtrema_SupportType + - symbol: BRepExtrema_TriangleSet + - symbol: BRepExtrema_UnCompatibleShape + - symbol: BRepExtrema_VertexInspector + - symbol: BRepFeat_Builder + - symbol: BRepFeat_Form + - symbol: BRepFeat_Gluer + - symbol: BRepFeat_MakeCylindricalHole + - symbol: BRepFeat_MakeDPrism + - symbol: BRepFeat_MakePipe + - symbol: BRepFeat_MakePrism + - symbol: BRepFeat_MakeRevol + - symbol: BRepFeat_PerfSelection + - symbol: BRepFeat_RibSlot + - symbol: BRepFeat_SplitShape + - symbol: BRepFeat_Status + - symbol: BRepFeat_StatusError + - symbol: BRepFill + - symbol: BRepFill_ACRLaw + - symbol: BRepFill_AdvancedEvolved + - symbol: BRepFill_ApproxSeewing + - symbol: BRepFill_CompatibleWires + - symbol: BRepFill_ComputeCLine + - symbol: BRepFill_CurveConstraint + - symbol: BRepFill_Draft + - symbol: BRepFill_DraftLaw + - symbol: BRepFill_Edge3DLaw + - symbol: BRepFill_EdgeFaceAndOrder + - symbol: BRepFill_EdgeOnSurfLaw + - symbol: BRepFill_Evolved + - symbol: BRepFill_FaceAndOrder + - symbol: BRepFill_Filling + - symbol: BRepFill_Generator + - symbol: BRepFill_LocationLaw + - symbol: BRepFill_MultiLine + - symbol: BRepFill_NSections + - symbol: BRepFill_OffsetAncestors + - symbol: BRepFill_OffsetWire + - symbol: BRepFill_Pipe + - symbol: BRepFill_PipeShell + - symbol: BRepFill_Section + - symbol: BRepFill_SectionLaw + - symbol: BRepFill_SectionPlacement + - symbol: BRepFill_ShapeLaw + - symbol: BRepFill_Sweep + - symbol: BRepFill_ThruSectionErrorStatus + - symbol: BRepFill_TransitionStyle + - symbol: BRepFill_TrimEdgeTool + - symbol: BRepFill_TrimShellCorner + - symbol: BRepFill_TypeOfContact + - symbol: BRepFilletAPI_LocalOperation + - symbol: BRepFilletAPI_MakeChamfer + - symbol: BRepFilletAPI_MakeFillet + - symbol: BRepFilletAPI_MakeFillet2d + - symbol: BRepGProp + - symbol: BRepGProp_Cinert + - symbol: BRepGProp_Domain + - symbol: BRepGProp_EdgeTool + - symbol: BRepGProp_Face + - symbol: BRepGProp_MeshCinert + - symbol: BRepGProp_Sinert + - symbol: BRepGProp_TFunction + - symbol: BRepGProp_UFunction + - symbol: BRepGProp_Vinert + - symbol: BRepGraph + - symbol: BRepGraphInc_BaseDef + - symbol: BRepGraphInc_BaseRef + - symbol: BRepGraphInc_BaseRep + - symbol: BRepGraphInc_ChildRef + - symbol: BRepGraphInc_CoEdgeDef + - symbol: BRepGraphInc_CoEdgeRef + - symbol: BRepGraphInc_CompSolidDef + - symbol: BRepGraphInc_CompoundDef + - symbol: BRepGraphInc_Curve2DRep + - symbol: BRepGraphInc_Curve3DRep + - symbol: BRepGraphInc_EdgeDef + - symbol: BRepGraphInc_FaceDef + - symbol: BRepGraphInc_FaceRef + - symbol: BRepGraphInc_OccurrenceDef + - symbol: BRepGraphInc_OccurrenceRef + - symbol: BRepGraphInc_Polygon2DRep + - symbol: BRepGraphInc_Polygon3DRep + - symbol: BRepGraphInc_PolygonOnTriRep + - symbol: BRepGraphInc_Populate + - symbol: BRepGraphInc_ProductDef + - symbol: BRepGraphInc_Reconstruct + - symbol: BRepGraphInc_Reconstruct_Cache + - symbol: BRepGraphInc_Reconstruct_Cache_TempScope + - symbol: BRepGraphInc_ReverseIndex + - symbol: BRepGraphInc_ShellDef + - symbol: BRepGraphInc_ShellRef + - symbol: BRepGraphInc_SolidDef + - symbol: BRepGraphInc_SolidRef + - symbol: BRepGraphInc_Storage + - symbol: BRepGraphInc_SurfaceRep + - symbol: BRepGraphInc_TriangulationRep + - symbol: BRepGraphInc_VertexDef + - symbol: BRepGraphInc_VertexRef + - symbol: BRepGraphInc_WireDef + - symbol: BRepGraphInc_WireInstance + - symbol: BRepGraphInc_WireRef + - symbol: BRepGraph_Builder + - symbol: BRepGraph_CacheKind + - symbol: BRepGraph_CacheKindRegistry + - symbol: BRepGraph_CacheValue + - symbol: BRepGraph_CacheView + - symbol: BRepGraph_ChildExplorer + - symbol: BRepGraph_ChildRefId + - symbol: BRepGraph_CoEdgeId + - symbol: BRepGraph_CoEdgeRefId + - symbol: BRepGraph_CoEdgesOfEdge + - symbol: BRepGraph_CompSolidId + - symbol: BRepGraph_CompSolidsOfSolid + - symbol: BRepGraph_Compact + - symbol: BRepGraph_CompoundId + - symbol: BRepGraph_CompoundsOfCompSolid + - symbol: BRepGraph_Copy + - symbol: BRepGraph_Curve2DRepId + - symbol: BRepGraph_Curve3DRepId + - symbol: BRepGraph_Data + - symbol: BRepGraph_Deduplicate + - symbol: BRepGraph_DeferredScope + - symbol: BRepGraph_DefsChildOfCompound + - symbol: BRepGraph_DefsChildOfShell + - symbol: BRepGraph_DefsChildOfSolid + - symbol: BRepGraph_DefsCoEdgeOfWire + - symbol: BRepGraph_DefsEdgeOfWire + - symbol: BRepGraph_DefsFaceOfShell + - symbol: BRepGraph_DefsIterator_ChildOfCompoundTraits + - symbol: BRepGraph_DefsIterator_ChildOfShellTraits + - symbol: BRepGraph_DefsIterator_ChildOfSolidTraits + - symbol: BRepGraph_DefsIterator_CoEdgeOfWireTraits + - symbol: BRepGraph_DefsIterator_DefsVertexOfEdge + - symbol: BRepGraph_DefsIterator_EdgeOfWireTraits + - symbol: BRepGraph_DefsIterator_FaceOfShellTraits + - symbol: BRepGraph_DefsIterator_OccurrenceOfProductTraits + - symbol: BRepGraph_DefsIterator_ShellOfSolidTraits + - symbol: BRepGraph_DefsIterator_SolidOfCompSolidTraits + - symbol: BRepGraph_DefsIterator_VertexOfFaceTraits + - symbol: BRepGraph_DefsIterator_WireOfFaceTraits + - symbol: BRepGraph_DefsOccurrenceOfProduct + - symbol: BRepGraph_DefsShellOfSolid + - symbol: BRepGraph_DefsSolidOfCompSolid + - symbol: BRepGraph_DefsVertexOfFace + - symbol: BRepGraph_DefsWireOfFace + - symbol: BRepGraph_EdgeId + - symbol: BRepGraph_EdgesOfVertex + - symbol: BRepGraph_EditorView + - symbol: BRepGraph_FaceId + - symbol: BRepGraph_FaceRefId + - symbol: BRepGraph_FacesOfEdge + - symbol: BRepGraph_FullChildRefIterator + - symbol: BRepGraph_FullCoEdgeRefIterator + - symbol: BRepGraph_FullFaceRefIterator + - symbol: BRepGraph_FullOccurrenceRefIterator + - symbol: BRepGraph_FullShellRefIterator + - symbol: BRepGraph_FullSolidRefIterator + - symbol: BRepGraph_FullVertexRefIterator + - symbol: BRepGraph_FullWireRefIterator + - symbol: BRepGraph_History + - symbol: BRepGraph_HistoryRecord + - symbol: BRepGraph_Layer + - symbol: BRepGraph_LayerIterator + - symbol: BRepGraph_LayerParam + - symbol: BRepGraph_LayerParam_VertexParams + - symbol: BRepGraph_LayerRegistry + - symbol: BRepGraph_LayerRegularity + - symbol: BRepGraph_LayerRegularity_EdgeRegularities + - symbol: BRepGraph_MeshCacheStorage + - symbol: BRepGraph_MeshCache_CoEdgeMeshEntry + - symbol: BRepGraph_MeshCache_EdgeMeshEntry + - symbol: BRepGraph_MeshCache_FaceMeshEntry + - symbol: BRepGraph_MeshView + - symbol: BRepGraph_MeshView_CoEdgeOps + - symbol: BRepGraph_MeshView_EdgeOps + - symbol: BRepGraph_MeshView_FaceOps + - symbol: BRepGraph_MeshView_PolyOps + - symbol: BRepGraph_NodeId + - symbol: BRepGraph_OccurrenceId + - symbol: BRepGraph_OccurrenceRefId + - symbol: BRepGraph_OccurrencesOfProduct + - symbol: BRepGraph_ParallelPolicy + - symbol: BRepGraph_ParentExplorer + - symbol: BRepGraph_Polygon2DRepId + - symbol: BRepGraph_Polygon3DRepId + - symbol: BRepGraph_PolygonOnTriRepId + - symbol: BRepGraph_ProductId + - symbol: BRepGraph_RefId + - symbol: BRepGraph_RefTransientCache + - symbol: BRepGraph_RefUID + - symbol: BRepGraph_RefsChildOfCompound + - symbol: BRepGraph_RefsChildOfShell + - symbol: BRepGraph_RefsChildOfSolid + - symbol: BRepGraph_RefsCoEdgeOfWire + - symbol: BRepGraph_RefsCompSolidsOfSolid + - symbol: BRepGraph_RefsCompoundsOfChild + - symbol: BRepGraph_RefsEdgesOfVertex + - symbol: BRepGraph_RefsFaceOfShell + - symbol: BRepGraph_RefsFacesOfWire + - symbol: BRepGraph_RefsIterator_ChildOfCompoundTraits + - symbol: BRepGraph_RefsIterator_ChildOfShellTraits + - symbol: BRepGraph_RefsIterator_ChildOfSolidTraits + - symbol: BRepGraph_RefsIterator_CoEdgeOfWireTraits + - symbol: BRepGraph_RefsIterator_FaceOfShellTraits + - symbol: BRepGraph_RefsIterator_OccurrenceOfProductTraits + - symbol: BRepGraph_RefsIterator_RefsVertexOfEdge + - symbol: BRepGraph_RefsIterator_ShellOfSolidTraits + - symbol: BRepGraph_RefsIterator_SolidOfCompSolidTraits + - symbol: BRepGraph_RefsIterator_VertexOfFaceTraits + - symbol: BRepGraph_RefsIterator_WireOfFaceTraits + - symbol: BRepGraph_RefsOccurrenceOfProduct + - symbol: BRepGraph_RefsProductsOfOccurrence + - symbol: BRepGraph_RefsShellOfSolid + - symbol: BRepGraph_RefsShellsOfFace + - symbol: BRepGraph_RefsSolidOfCompSolid + - symbol: BRepGraph_RefsSolidsOfShell + - symbol: BRepGraph_RefsVertexOfFace + - symbol: BRepGraph_RefsView + - symbol: BRepGraph_RefsView_ChildOps + - symbol: BRepGraph_RefsView_CoEdgeOps + - symbol: BRepGraph_RefsView_FaceOps + - symbol: BRepGraph_RefsView_OccurrenceOps + - symbol: BRepGraph_RefsView_ShellOps + - symbol: BRepGraph_RefsView_SolidOps + - symbol: BRepGraph_RefsView_VertexOps + - symbol: BRepGraph_RefsView_WireOps + - symbol: BRepGraph_RefsWireOfFace + - symbol: BRepGraph_RefsWiresOfCoEdge + - symbol: BRepGraph_RelatedIterator + - symbol: BRepGraph_RepId + - symbol: BRepGraph_ReverseIterator_CompSolidOfSolidRefTraits + - symbol: BRepGraph_ReverseIterator_CompoundOfChildRefTraits + - symbol: BRepGraph_ReverseIterator_EdgeOfVertexRefTraits + - symbol: BRepGraph_ReverseIterator_FaceOfWireRefTraits + - symbol: BRepGraph_ReverseIterator_ProductOfOccurrenceRefTraits + - symbol: BRepGraph_ReverseIterator_ShellOfFaceRefTraits + - symbol: BRepGraph_ReverseIterator_SolidOfShellRefTraits + - symbol: BRepGraph_ReverseIterator_WireOfCoEdgeRefTraits + - symbol: BRepGraph_RootProductIterator + - symbol: BRepGraph_ShapesView + - symbol: BRepGraph_ShellId + - symbol: BRepGraph_ShellRefId + - symbol: BRepGraph_ShellsOfFace + - symbol: BRepGraph_SolidId + - symbol: BRepGraph_SolidRefId + - symbol: BRepGraph_SolidsOfShell + - symbol: BRepGraph_SurfaceRepId + - symbol: BRepGraph_Tool + - symbol: BRepGraph_Tool_CoEdge + - symbol: BRepGraph_Tool_Edge + - symbol: BRepGraph_Tool_Face + - symbol: BRepGraph_Tool_Mesh + - symbol: BRepGraph_Tool_Shell + - symbol: BRepGraph_Tool_Vertex + - symbol: BRepGraph_Tool_Wire + - symbol: BRepGraph_TopoView + - symbol: BRepGraph_TopoView_CoEdgeOps + - symbol: BRepGraph_TopoView_CompSolidOps + - symbol: BRepGraph_TopoView_CompoundOps + - symbol: BRepGraph_TopoView_EdgeOps + - symbol: BRepGraph_TopoView_FaceOps + - symbol: BRepGraph_TopoView_GenOps + - symbol: BRepGraph_TopoView_GeometryOps + - symbol: BRepGraph_TopoView_OccurrenceOps + - symbol: BRepGraph_TopoView_ProductOps + - symbol: BRepGraph_TopoView_ShellOps + - symbol: BRepGraph_TopoView_SolidOps + - symbol: BRepGraph_TopoView_VertexOps + - symbol: BRepGraph_TopoView_WireOps + - symbol: BRepGraph_Transform + - symbol: BRepGraph_TransientCache + - symbol: BRepGraph_TriangulationRepId + - symbol: BRepGraph_UID + - symbol: BRepGraph_UIDsView + - symbol: BRepGraph_Validate + - symbol: BRepGraph_Validate_Options + - symbol: BRepGraph_Validate_Result + - symbol: BRepGraph_VersionStamp + - symbol: BRepGraph_VertexId + - symbol: BRepGraph_VertexRefId + - symbol: BRepGraph_WireExplorer + - symbol: BRepGraph_WireId + - symbol: BRepGraph_WireRefId + - symbol: BRepGraph_WiresOfCoEdge + - symbol: BRepIntCurveSurface_Inter + - symbol: BRepLProp + - symbol: BRepLProp_CLProps + - symbol: BRepLProp_SLProps + - symbol: BRepLProp_SurfaceTool + - symbol: BRepLib + - symbol: BRepLib_CheckCurveOnSurface + - symbol: BRepLib_Command + - symbol: BRepLib_EdgeError + - symbol: BRepLib_FaceError + - symbol: BRepLib_FindSurface + - symbol: BRepLib_FuseEdges + - symbol: BRepLib_MakeEdge + - symbol: BRepLib_MakeEdge2d + - symbol: BRepLib_MakeFace + - symbol: BRepLib_MakePolygon + - symbol: BRepLib_MakeShape + - symbol: BRepLib_MakeShell + - symbol: BRepLib_MakeSolid + - symbol: BRepLib_MakeVertex + - symbol: BRepLib_MakeWire + - symbol: BRepLib_PointCloudShape + - symbol: BRepLib_ShapeModification + - symbol: BRepLib_ShellError + - symbol: BRepLib_ToolTriangulatedShape + - symbol: BRepLib_ValidateEdge + - symbol: BRepLib_WireError + - symbol: BRepMAT2d_BisectingLocus + - symbol: BRepMAT2d_Explorer + - symbol: BRepMAT2d_LinkTopoBilo + - symbol: BRepMesh_BaseMeshAlgo + - symbol: BRepMesh_BoundaryParamsRangeSplitter + - symbol: BRepMesh_Circle + - symbol: BRepMesh_CircleInspector + - symbol: BRepMesh_CircleTool + - symbol: BRepMesh_Classifier + - symbol: BRepMesh_ConeRangeSplitter + - symbol: BRepMesh_ConstrainedBaseMeshAlgo + - symbol: BRepMesh_Context + - symbol: BRepMesh_CurveTessellator + - symbol: BRepMesh_CustomBaseMeshAlgo + - symbol: BRepMesh_CylinderRangeSplitter + - symbol: BRepMesh_DataStructureOfDelaun + - symbol: BRepMesh_DefaultRangeSplitter + - symbol: BRepMesh_Deflection + - symbol: BRepMesh_DegreeOfFreedom + - symbol: BRepMesh_DelabellaBaseMeshAlgo + - symbol: BRepMesh_DelabellaMeshAlgoFactory + - symbol: BRepMesh_DelaunayBaseMeshAlgo + - symbol: BRepMesh_DiscretAlgoFactory + - symbol: BRepMesh_DiscretFactory + - symbol: BRepMesh_DiscretRoot + - symbol: BRepMesh_Edge + - symbol: BRepMesh_EdgeDiscret + - symbol: BRepMesh_EdgeTessellationExtractor + - symbol: BRepMesh_ExtrusionRangeSplitter + - symbol: BRepMesh_FaceChecker + - symbol: BRepMesh_FaceDiscret + - symbol: BRepMesh_FastDiscret + - symbol: BRepMesh_GeomTool + - symbol: BRepMesh_IncrementalMesh + - symbol: BRepMesh_IncrementalMeshFactory + - symbol: BRepMesh_MeshAlgoFactory + - symbol: BRepMesh_MeshTool + - symbol: BRepMesh_MeshTool_NodeClassifier + - symbol: BRepMesh_ModelBuilder + - symbol: BRepMesh_ModelHealer + - symbol: BRepMesh_ModelPostProcessor + - symbol: BRepMesh_ModelPreProcessor + - symbol: BRepMesh_NURBSRangeSplitter + - symbol: BRepMesh_OrientedEdge + - symbol: BRepMesh_PairOfIndex + - symbol: BRepMesh_SelectorOfDataStructureOfDelaun + - symbol: BRepMesh_ShapeTool + - symbol: BRepMesh_ShapeVisitor + - symbol: BRepMesh_SphereRangeSplitter + - symbol: BRepMesh_TorusRangeSplitter + - symbol: BRepMesh_Triangulator + - symbol: BRepMesh_UVParamRangeSplitter + - symbol: BRepMesh_UndefinedRangeSplitter + - symbol: BRepMesh_Vertex + - symbol: BRepMesh_VertexInspector + - symbol: BRepMesh_VertexTool + - symbol: BRepOffsetAPI_DraftAngle + - symbol: BRepOffsetAPI_MakeDraft + - symbol: BRepOffsetAPI_MakeEvolved + - symbol: BRepOffsetAPI_MakeFilling + - symbol: BRepOffsetAPI_MakeOffset + - symbol: BRepOffsetAPI_MakeOffsetShape + - symbol: BRepOffsetAPI_MakePipe + - symbol: BRepOffsetAPI_MakePipeShell + - symbol: BRepOffsetAPI_MakeThickSolid + - symbol: BRepOffsetAPI_MiddlePath + - symbol: BRepOffsetAPI_NormalProjection + - symbol: BRepOffsetAPI_ThruSections + - symbol: BRepOffsetSimple_Status + - symbol: BRepOffset_Analyse + - symbol: BRepOffset_Error + - symbol: BRepOffset_Inter2d + - symbol: BRepOffset_Inter3d + - symbol: BRepOffset_Interval + - symbol: BRepOffset_MakeLoops + - symbol: BRepOffset_MakeSimpleOffset + - symbol: BRepOffset_Mode + - symbol: BRepOffset_Offset + - symbol: BRepOffset_SimpleOffset + - symbol: BRepOffset_Status + - symbol: BRepPreviewAPI_MakeBox + - symbol: BRepPrimAPI_MakeBox + - symbol: BRepPrimAPI_MakeCone + - symbol: BRepPrimAPI_MakeCylinder + - symbol: BRepPrimAPI_MakeHalfSpace + - symbol: BRepPrimAPI_MakeOneAxis + - symbol: BRepPrimAPI_MakePrism + - symbol: BRepPrimAPI_MakeRevol + - symbol: BRepPrimAPI_MakeRevolution + - symbol: BRepPrimAPI_MakeSphere + - symbol: BRepPrimAPI_MakeSweep + - symbol: BRepPrimAPI_MakeTorus + - symbol: BRepPrimAPI_MakeWedge + - symbol: BRepPrim_Builder + - symbol: BRepPrim_Cone + - symbol: BRepPrim_Cylinder + - symbol: BRepPrim_Direction + - symbol: BRepPrim_FaceBuilder + - symbol: BRepPrim_GWedge + - symbol: BRepPrim_OneAxis + - symbol: BRepPrim_Revolution + - symbol: BRepPrim_Sphere + - symbol: BRepPrim_Torus + - symbol: BRepPrim_Wedge + - symbol: BRepProj_Projection + - symbol: BRepSweep_Builder + - symbol: BRepSweep_Iterator + - symbol: BRepSweep_NumLinearRegularSweep + - symbol: BRepSweep_Prism + - symbol: BRepSweep_Revol + - symbol: BRepSweep_Rotation + - symbol: BRepSweep_Tool + - symbol: BRepSweep_Translation + - symbol: BRepSweep_Trsf + - symbol: BRepToIGESBRep_Entity + - symbol: BRepToIGES_BREntity + - symbol: BRepToIGES_BRShell + - symbol: BRepToIGES_BRSolid + - symbol: BRepToIGES_BRWire + - symbol: BRepTools + - symbol: BRepTools_CopyModification + - symbol: BRepTools_GTrsfModification + - symbol: BRepTools_History + - symbol: BRepTools_Modification + - symbol: BRepTools_Modifier + - symbol: BRepTools_NurbsConvertModification + - symbol: BRepTools_PurgeLocations + - symbol: BRepTools_Quilt + - symbol: BRepTools_ReShape + - symbol: BRepTools_ShapeSet + - symbol: BRepTools_Substitution + - symbol: BRepTools_TrsfModification + - symbol: BRepTools_WireExplorer + - symbol: BRepTopAdaptor_HVertex + - symbol: BRepTopAdaptor_Tool + - symbol: BRepTopAdaptor_TopolTool + - symbol: BRep_Builder + - symbol: BRep_Curve3D + - symbol: BRep_CurveOn2Surfaces + - symbol: BRep_CurveOnClosedSurface + - symbol: BRep_CurveOnSurface + - symbol: BRep_CurveRepresentation + - symbol: BRep_GCurve + - symbol: BRep_PointOnCurve + - symbol: BRep_PointOnCurveOnSurface + - symbol: BRep_PointOnSurface + - symbol: BRep_PointRepresentation + - symbol: BRep_PointsOnSurface + - symbol: BRep_Polygon3D + - symbol: BRep_PolygonOnClosedSurface + - symbol: BRep_PolygonOnClosedTriangulation + - symbol: BRep_PolygonOnSurface + - symbol: BRep_PolygonOnTriangulation + - symbol: BRep_TEdge + - symbol: BRep_TFace + - symbol: BRep_TVertex + - symbol: BRep_Tool + - symbol: BSplCLib_Cache + - symbol: BSplCLib_EvaluatorFunction + - symbol: BSplCLib_KnotDistribution + - symbol: BSplCLib_MultDistribution + - symbol: BSplSLib + - symbol: BSplSLib_Cache + - symbol: BSplSLib_EvaluatorFunction + - symbol: BVH_Array2d + - symbol: BVH_Array2f + - symbol: BVH_Array2i + - symbol: BVH_Array3d + - symbol: BVH_Array3f + - symbol: BVH_Array3i + - symbol: BVH_Array4d + - symbol: BVH_Array4f + - symbol: BVH_Array4i + - symbol: BVH_BinaryTree + - symbol: BVH_BitComparator + - symbol: BVH_BitPredicate + - symbol: BVH_BuildQueue + - symbol: BVH_BuildThread + - symbol: BVH_BuildTool + - symbol: BVH_BuilderTransient + - symbol: BVH_Mat4d + - symbol: BVH_Mat4f + - symbol: BVH_ObjectTransient + - symbol: BVH_Properties + - symbol: BVH_QuadTree + - symbol: BVH_RadixSorter + - symbol: BVH_TreeBaseTransient + - symbol: BVH_Vec2d + - symbol: BVH_Vec2f + - symbol: BVH_Vec2i + - symbol: BVH_Vec3d + - symbol: BVH_Vec3f + - symbol: BVH_Vec3i + - symbol: BVH_Vec4d + - symbol: BVH_Vec4f + - symbol: BVH_Vec4i + - symbol: BiTgte_Blend + - symbol: BiTgte_ContactType + - symbol: BiTgte_CurveOnEdge + - symbol: BiTgte_CurveOnVertex + - symbol: BinTools + - symbol: BinTools_Curve2dSet + - symbol: BinTools_CurveSet + - symbol: BinTools_FormatVersion + - symbol: BinTools_IStream + - symbol: BinTools_LocationSet + - symbol: BinTools_OStream + - symbol: BinTools_ObjectType + - symbol: BinTools_ShapeReader + - symbol: BinTools_ShapeSet + - symbol: BinTools_ShapeSetBase + - symbol: BinTools_ShapeWriter + - symbol: BinTools_SurfaceSet + - symbol: Bisector + - symbol: Bisector_Bisec + - symbol: Bisector_BisecAna + - symbol: Bisector_BisecCC + - symbol: Bisector_BisecPC + - symbol: Bisector_Curve + - symbol: Bisector_FunctionH + - symbol: Bisector_FunctionInter + - symbol: Bisector_Inter + - symbol: Bisector_PointOnBis + - symbol: Bisector_PolyBis + - symbol: BlendFunc + - symbol: BlendFunc_CSCircular + - symbol: BlendFunc_CSConstRad + - symbol: BlendFunc_ChAsym + - symbol: BlendFunc_ChAsymInv + - symbol: BlendFunc_ChamfInv + - symbol: BlendFunc_Chamfer + - symbol: BlendFunc_ConstRad + - symbol: BlendFunc_ConstRadInv + - symbol: BlendFunc_ConstThroat + - symbol: BlendFunc_ConstThroatInv + - symbol: BlendFunc_ConstThroatWithPenetration + - symbol: BlendFunc_ConstThroatWithPenetrationInv + - symbol: BlendFunc_Corde + - symbol: BlendFunc_EvolRad + - symbol: BlendFunc_EvolRadInv + - symbol: BlendFunc_GenChamfInv + - symbol: BlendFunc_GenChamfer + - symbol: BlendFunc_Ruled + - symbol: BlendFunc_RuledInv + - symbol: BlendFunc_SectionShape + - symbol: BlendFunc_Tensor + - symbol: Blend_AppFunction + - symbol: Blend_CSFunction + - symbol: Blend_CurvPointFuncInv + - symbol: Blend_DecrochStatus + - symbol: Blend_FuncInv + - symbol: Blend_Function + - symbol: Blend_Point + - symbol: Blend_RstRstFunction + - symbol: Blend_Status + - symbol: Blend_SurfCurvFuncInv + - symbol: Blend_SurfPointFuncInv + - symbol: Blend_SurfRstFunction + - symbol: BndLib + - symbol: BndLib_Add2dCurve + - symbol: BndLib_Add3dCurve + - symbol: BndLib_AddSurface + - symbol: Bnd_BoundSortBox + - symbol: Bnd_Box + - symbol: Bnd_Box2d + - symbol: Bnd_OBB + - symbol: Bnd_Range + - symbol: Bnd_Sphere + - symbol: Bnd_Tools + - symbol: CDF_Application + - symbol: CDF_Directory + - symbol: CDF_FWOSDriver + - symbol: CDF_MetaDataDriver + - symbol: CDF_MetaDataDriverFactory + - symbol: CDF_Store + - symbol: CDF_StoreList + - symbol: CDF_StoreSetNameStatus + - symbol: CDF_SubComponentStatus + - symbol: CDF_TryStoreStatus + - symbol: CDF_TypeOfActivation + - symbol: CDM_Application + - symbol: CDM_CanCloseStatus + - symbol: CDM_Document + - symbol: CDM_MetaData + - symbol: CDM_Reference + - symbol: CDM_ReferenceIterator + - symbol: CPnts_AbscissaPoint + - symbol: CPnts_MyGaussFunction + - symbol: CPnts_MyRootFunction + - symbol: CPnts_UniformDeflection + - symbol: CSLib + - symbol: CSLib_Class2d + - symbol: CSLib_DerivativeStatus + - symbol: CSLib_NormalPolyDef + - symbol: CSLib_NormalStatus + - symbol: ChFi2d + - symbol: ChFi2d_AnaFilletAlgo + - symbol: ChFi2d_Builder + - symbol: ChFi2d_ChamferAPI + - symbol: ChFi2d_ConstructionError + - symbol: ChFi2d_FilletAPI + - symbol: ChFi2d_FilletAlgo + - symbol: ChFi3d + - symbol: ChFi3d_Builder + - symbol: ChFi3d_ChBuilder + - symbol: ChFi3d_FilBuilder + - symbol: ChFi3d_FilletShape + - symbol: ChFi3d_SearchSing + - symbol: ChFiDS_ChamfMethod + - symbol: ChFiDS_ChamfMode + - symbol: ChFiDS_ChamfSpine + - symbol: ChFiDS_CircSection + - symbol: ChFiDS_CommonPoint + - symbol: ChFiDS_ElSpine + - symbol: ChFiDS_ErrorStatus + - symbol: ChFiDS_FaceInterference + - symbol: ChFiDS_FilSpine + - symbol: ChFiDS_Map + - symbol: ChFiDS_Regul + - symbol: ChFiDS_Spine + - symbol: ChFiDS_State + - symbol: ChFiDS_Stripe + - symbol: ChFiDS_StripeMap + - symbol: ChFiDS_SurfData + - symbol: ChFiDS_TypeOfConcavity + - symbol: ChFiKPart_ComputeData + - symbol: Contap_ArcFunction + - symbol: Contap_ContAna + - symbol: Contap_Contour + - symbol: Contap_HContTool + - symbol: Contap_HCurve2dTool + - symbol: Contap_IType + - symbol: Contap_Line + - symbol: Contap_Point + - symbol: Contap_SurfFunction + - symbol: Contap_SurfProps + - symbol: Contap_TFunction + - symbol: Contap_TheIWLineOfTheIWalking + - symbol: Contap_TheIWalking + - symbol: Contap_ThePathPointOfTheSearch + - symbol: Contap_TheSearch + - symbol: Contap_TheSearchInside + - symbol: Contap_TheSegmentOfTheSearch + - symbol: Convert_CircleToBSplineCurve + - symbol: Convert_CompBezierCurves2dToBSplineCurve2d + - symbol: Convert_CompBezierCurvesToBSplineCurve + - symbol: Convert_CompPolynomialToPoles + - symbol: Convert_ConeToBSplineSurface + - symbol: Convert_ConicToBSplineCurve + - symbol: Convert_CylinderToBSplineSurface + - symbol: Convert_ElementarySurfaceToBSplineSurface + - symbol: Convert_EllipseToBSplineCurve + - symbol: Convert_GridPolynomialToPoles + - symbol: Convert_HyperbolaToBSplineCurve + - symbol: Convert_ParabolaToBSplineCurve + - symbol: Convert_ParameterisationType + - symbol: Convert_SphereToBSplineSurface + - symbol: Convert_TorusToBSplineSurface + - symbol: DESTL_ConfigurationNode + - symbol: DE_Provider_ReadStreamNode + - symbol: DE_Provider_WriteStreamNode + - symbol: Draft + - symbol: Draft_EdgeInfo + - symbol: Draft_ErrorStatus + - symbol: Draft_FaceInfo + - symbol: Draft_Modification + - symbol: Draft_VertexInfo + - symbol: ElCLib + - symbol: ElSLib + - symbol: Expr + - symbol: ExprIntrp + - symbol: ExprIntrp_Analysis + - symbol: ExprIntrp_GenExp + - symbol: ExprIntrp_GenFct + - symbol: ExprIntrp_GenRel + - symbol: ExprIntrp_Generator + - symbol: ExprIntrp_SyntaxError + - symbol: Expr_Absolute + - symbol: Expr_ArcCosine + - symbol: Expr_ArcSine + - symbol: Expr_ArcTangent + - symbol: Expr_ArgCosh + - symbol: Expr_ArgSinh + - symbol: Expr_ArgTanh + - symbol: Expr_BinaryExpression + - symbol: Expr_BinaryFunction + - symbol: Expr_Cosh + - symbol: Expr_Cosine + - symbol: Expr_Difference + - symbol: Expr_Different + - symbol: Expr_Division + - symbol: Expr_Equal + - symbol: Expr_Exponential + - symbol: Expr_Exponentiate + - symbol: Expr_ExprFailure + - symbol: Expr_FunctionDerivative + - symbol: Expr_GeneralExpression + - symbol: Expr_GeneralFunction + - symbol: Expr_GeneralRelation + - symbol: Expr_GreaterThan + - symbol: Expr_GreaterThanOrEqual + - symbol: Expr_InvalidAssignment + - symbol: Expr_InvalidFunction + - symbol: Expr_InvalidOperand + - symbol: Expr_LessThan + - symbol: Expr_LessThanOrEqual + - symbol: Expr_LogOf10 + - symbol: Expr_LogOfe + - symbol: Expr_NamedConstant + - symbol: Expr_NamedExpression + - symbol: Expr_NamedFunction + - symbol: Expr_NamedUnknown + - symbol: Expr_NotAssigned + - symbol: Expr_NotEvaluable + - symbol: Expr_NumericValue + - symbol: Expr_PolyExpression + - symbol: Expr_PolyFunction + - symbol: Expr_Product + - symbol: Expr_RUIterator + - symbol: Expr_RelationIterator + - symbol: Expr_Sign + - symbol: Expr_Sine + - symbol: Expr_SingleRelation + - symbol: Expr_Sinh + - symbol: Expr_Square + - symbol: Expr_SquareRoot + - symbol: Expr_Sum + - symbol: Expr_SystemRelation + - symbol: Expr_Tangent + - symbol: Expr_Tanh + - symbol: Expr_UnaryExpression + - symbol: Expr_UnaryFunction + - symbol: Expr_UnaryMinus + - symbol: Expr_UnknownIterator + - symbol: ExtremaPC_BSplineCurve + - symbol: ExtremaPC_BezierCurve + - symbol: ExtremaPC_Circle + - symbol: ExtremaPC_Config + - symbol: ExtremaPC_Curve + - symbol: ExtremaPC_DistanceFunction + - symbol: ExtremaPC_Ellipse + - symbol: ExtremaPC_ExtremumResult + - symbol: ExtremaPC_GridEvaluator + - symbol: ExtremaPC_Hyperbola + - symbol: ExtremaPC_Line + - symbol: ExtremaPC_OffsetCurve + - symbol: ExtremaPC_OtherCurve + - symbol: ExtremaPC_Parabola + - symbol: ExtremaPC_Result + - symbol: ExtremaPC_SearchMode + - symbol: ExtremaPC_Status + - symbol: Extrema_Curve2dTool + - symbol: Extrema_CurveTool + - symbol: Extrema_ElementType + - symbol: Extrema_ExtAlgo + - symbol: Extrema_ExtCC + - symbol: Extrema_ExtCC2d + - symbol: Extrema_ExtCS + - symbol: Extrema_ExtElC + - symbol: Extrema_ExtElC2d + - symbol: Extrema_ExtElCS + - symbol: Extrema_ExtElSS + - symbol: Extrema_ExtFlag + - symbol: Extrema_ExtPElC + - symbol: Extrema_ExtPElC2d + - symbol: Extrema_ExtPElS + - symbol: Extrema_ExtPExtS + - symbol: Extrema_ExtPRevS + - symbol: Extrema_ExtPS + - symbol: Extrema_ExtSS + - symbol: Extrema_FuncExtCS + - symbol: Extrema_FuncExtSS + - symbol: Extrema_FuncPSDist + - symbol: Extrema_FuncPSNorm + - symbol: Extrema_GenExtCS + - symbol: Extrema_GenExtPS + - symbol: Extrema_GenExtSS + - symbol: Extrema_GenLocateExtCS + - symbol: Extrema_GenLocateExtPS + - symbol: Extrema_GenLocateExtSS + - symbol: Extrema_GlobOptFuncCCC0 + - symbol: Extrema_GlobOptFuncCCC1 + - symbol: Extrema_GlobOptFuncCCC2 + - symbol: Extrema_GlobOptFuncCQuadric + - symbol: Extrema_GlobOptFuncCS + - symbol: Extrema_GlobOptFuncConicS + - symbol: Extrema_LocateExtCC + - symbol: Extrema_LocateExtCC2d + - symbol: Extrema_POnCurv + - symbol: Extrema_POnCurv2d + - symbol: Extrema_POnSurf + - symbol: Extrema_POnSurfParams + - symbol: FEmTool_Assembly + - symbol: FEmTool_Curve + - symbol: FEmTool_ElementaryCriterion + - symbol: FEmTool_ElementsOfRefMatrix + - symbol: FEmTool_LinearFlexion + - symbol: FEmTool_LinearJerk + - symbol: FEmTool_LinearTension + - symbol: FEmTool_ProfileMatrix + - symbol: FEmTool_SparseMatrix + - symbol: FSD_Base64 + - symbol: FSD_CmpFile + - symbol: FSD_FileHeader + - symbol: FairCurve_AnalysisCode + - symbol: FairCurve_Batten + - symbol: FairCurve_BattenLaw + - symbol: FairCurve_DistributionOfEnergy + - symbol: FairCurve_DistributionOfJerk + - symbol: FairCurve_DistributionOfSagging + - symbol: FairCurve_DistributionOfTension + - symbol: FairCurve_Energy + - symbol: FairCurve_EnergyOfBatten + - symbol: FairCurve_EnergyOfMVC + - symbol: FairCurve_MinimalVariation + - symbol: FairCurve_Newton + - symbol: FilletPoint + - symbol: FilletSurf_Builder + - symbol: FilletSurf_ErrorTypeStatus + - symbol: FilletSurf_InternalBuilder + - symbol: FilletSurf_StatusDone + - symbol: FilletSurf_StatusType + - symbol: GCPnts_AbscissaPoint + - symbol: GCPnts_AbscissaType + - symbol: GCPnts_DeflectionType + - symbol: GCPnts_DistFunction2dMV + - symbol: GCPnts_DistFunctionMV + - symbol: GCPnts_QuasiUniformAbscissa + - symbol: GCPnts_QuasiUniformDeflection + - symbol: GCPnts_TangentialDeflection + - symbol: GCPnts_UniformAbscissa + - symbol: GCPnts_UniformDeflection + - symbol: GC_MakeArcOfCircle + - symbol: GC_MakeArcOfCircle2d + - symbol: GC_MakeArcOfEllipse + - symbol: GC_MakeArcOfEllipse2d + - symbol: GC_MakeArcOfHyperbola + - symbol: GC_MakeArcOfHyperbola2d + - symbol: GC_MakeArcOfParabola + - symbol: GC_MakeArcOfParabola2d + - symbol: GC_MakeCircle + - symbol: GC_MakeCircle2d + - symbol: GC_MakeConicalSurface + - symbol: GC_MakeCylindricalSurface + - symbol: GC_MakeEllipse + - symbol: GC_MakeEllipse2d + - symbol: GC_MakeHyperbola + - symbol: GC_MakeHyperbola2d + - symbol: GC_MakeLine + - symbol: GC_MakeLine2d + - symbol: GC_MakeMirror + - symbol: GC_MakeMirror2d + - symbol: GC_MakeParabola2d + - symbol: GC_MakePlane + - symbol: GC_MakeRotation + - symbol: GC_MakeRotation2d + - symbol: GC_MakeScale + - symbol: GC_MakeScale2d + - symbol: GC_MakeSegment + - symbol: GC_MakeSegment2d + - symbol: GC_MakeTranslation + - symbol: GC_MakeTranslation2d + - symbol: GC_MakeTrimmedCone + - symbol: GC_MakeTrimmedCylinder + - symbol: GC_Root + - symbol: GProp + - symbol: GProp_CelGProps + - symbol: GProp_GProps + - symbol: GProp_PEquation + - symbol: GProp_PGProps + - symbol: GProp_PrincipalProps + - symbol: GProp_SelGProps + - symbol: GProp_UndefinedAxis + - symbol: GProp_ValueType + - symbol: GProp_VelGProps + - symbol: GccAna_Circ2dBisec + - symbol: GccAna_CircLin2dBisec + - symbol: GccAna_CircPnt2dBisec + - symbol: GccAna_Lin2dBisec + - symbol: GccAna_LinPnt2dBisec + - symbol: GccAna_NoSolution + - symbol: GccAna_Pnt2dBisec + - symbol: GccEnt_BadQualifier + - symbol: GccEnt_Position + - symbol: GccEnt_QualifiedCirc + - symbol: GccEnt_QualifiedLin + - symbol: GccInt_BCirc + - symbol: GccInt_BElips + - symbol: GccInt_BHyper + - symbol: GccInt_BLine + - symbol: GccInt_BParab + - symbol: GccInt_BPoint + - symbol: GccInt_Bisec + - symbol: GccInt_IType + - symbol: Geom2dAPI_ExtremaCurveCurve + - symbol: Geom2dAPI_InterCurveCurve + - symbol: Geom2dAPI_Interpolate + - symbol: Geom2dAPI_PointsToBSpline + - symbol: Geom2dAPI_ProjectPointOnCurve + - symbol: Geom2dAdaptor + - symbol: Geom2dAdaptor_Curve + - symbol: Geom2dConvert + - symbol: Geom2dConvert_ApproxArcsSegments + - symbol: Geom2dConvert_ApproxCurve + - symbol: Geom2dConvert_BSplineCurveKnotSplitting + - symbol: Geom2dConvert_BSplineCurveToBezierCurve + - symbol: Geom2dConvert_CompCurveToBSplineCurve + - symbol: Geom2dConvert_PPoint + - symbol: Geom2dEval_AHTBezierCurve + - symbol: Geom2dEval_ArchimedeanSpiralCurve + - symbol: Geom2dEval_CircleInvoluteCurve + - symbol: Geom2dEval_LogarithmicSpiralCurve + - symbol: Geom2dEval_RepCurveDesc_Base + - symbol: Geom2dEval_RepCurveDesc_DerivBounded + - symbol: Geom2dEval_RepCurveDesc_Domain1d + - symbol: Geom2dEval_RepCurveDesc_Full + - symbol: Geom2dEval_RepCurveDesc_Map1d + - symbol: Geom2dEval_RepCurveDesc_Mapped + - symbol: Geom2dEval_SineWaveCurve + - symbol: Geom2dEval_TBezierCurve + - symbol: Geom2dGcc + - symbol: Geom2dGcc_CurveTool + - symbol: Geom2dGcc_FunctionTanCirCu + - symbol: Geom2dGcc_FunctionTanCuCu + - symbol: Geom2dGcc_FunctionTanCuCuOnCu + - symbol: Geom2dGcc_FunctionTanCuPnt + - symbol: Geom2dGcc_FunctionTanObl + - symbol: Geom2dGcc_IsParallel + - symbol: Geom2dGcc_QCurve + - symbol: Geom2dGcc_QualifiedCurve + - symbol: Geom2dGcc_Type1 + - symbol: Geom2dGcc_Type2 + - symbol: Geom2dGcc_Type3 + - symbol: Geom2dHash_CurveHasher + - symbol: Geom2dHatch_Classifier + - symbol: Geom2dHatch_Element + - symbol: Geom2dHatch_FClass2dOfClassifier + - symbol: Geom2dHatch_Hatcher + - symbol: Geom2dHatch_Hatching + - symbol: Geom2dHatch_Intersector + - symbol: Geom2dInt_ExactIntersectionPointOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_GInter + - symbol: Geom2dInt_Geom2dCurveTool + - symbol: Geom2dInt_IntConicCurveOfGInter + - symbol: Geom2dInt_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfGInter + - symbol: Geom2dInt_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheIntConicCurveOfGInter + - symbol: Geom2dInt_TheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheIntersectorOfTheIntConicCurveOfGInter + - symbol: Geom2dInt_ThePolygon2dOfTheIntPCurvePCurveOfGInter + - symbol: Geom2dInt_TheProjPCurOfGInter + - symbol: Geom2dToIGES_Geom2dCurve + - symbol: Geom2dToIGES_Geom2dEntity + - symbol: Geom2dToIGES_Geom2dPoint + - symbol: Geom2dToIGES_Geom2dVector + - symbol: Geom2d_AxisPlacement + - symbol: Geom2d_BSplineCurve + - symbol: Geom2d_BezierCurve + - symbol: Geom2d_BoundedCurve + - symbol: Geom2d_CartesianPoint + - symbol: Geom2d_Circle + - symbol: Geom2d_Conic + - symbol: Geom2d_Curve + - symbol: Geom2d_Direction + - symbol: Geom2d_Ellipse + - symbol: Geom2d_Geometry + - symbol: Geom2d_Hyperbola + - symbol: Geom2d_Line + - symbol: Geom2d_OffsetCurve + - symbol: Geom2d_Parabola + - symbol: Geom2d_Point + - symbol: Geom2d_Transformation + - symbol: Geom2d_TrimmedCurve + - symbol: Geom2d_UndefinedDerivative + - symbol: Geom2d_UndefinedValue + - symbol: Geom2d_Vector + - symbol: Geom2d_VectorWithMagnitude + - symbol: GeomAPI + - symbol: GeomAPI_ExtremaCurveCurve + - symbol: GeomAPI_ExtremaCurveSurface + - symbol: GeomAPI_ExtremaSurfaceSurface + - symbol: GeomAPI_IntCS + - symbol: GeomAPI_IntSS + - symbol: GeomAPI_Interpolate + - symbol: GeomAPI_PointsToBSpline + - symbol: GeomAPI_PointsToBSplineSurface + - symbol: GeomAPI_ProjectPointOnCurve + - symbol: GeomAPI_ProjectPointOnSurf + - symbol: GeomAbs_BSplKnotDistribution + - symbol: GeomAbs_CurveType + - symbol: GeomAbs_IsoType + - symbol: GeomAbs_JoinType + - symbol: GeomAbs_Shape + - symbol: GeomAbs_SurfaceType + - symbol: GeomAdaptor + - symbol: GeomAdaptor_Curve + - symbol: GeomAdaptor_Surface + - symbol: GeomAdaptor_SurfaceOfLinearExtrusion + - symbol: GeomAdaptor_SurfaceOfRevolution + - symbol: GeomAdaptor_TransformedCurve + - symbol: GeomAdaptor_TransformedSurface + - symbol: GeomBndLib_BSplineCurve + - symbol: GeomBndLib_BSplineCurve2d + - symbol: GeomBndLib_BSplineSurface + - symbol: GeomBndLib_BezierCurve + - symbol: GeomBndLib_BezierCurve2d + - symbol: GeomBndLib_BezierSurface + - symbol: GeomBndLib_Circle + - symbol: GeomBndLib_Circle2d + - symbol: GeomBndLib_Cone + - symbol: GeomBndLib_Curve + - symbol: GeomBndLib_Curve2d + - symbol: GeomBndLib_Cylinder + - symbol: GeomBndLib_Ellipse + - symbol: GeomBndLib_Ellipse2d + - symbol: GeomBndLib_Hyperbola + - symbol: GeomBndLib_Hyperbola2d + - symbol: GeomBndLib_Line + - symbol: GeomBndLib_Line2d + - symbol: GeomBndLib_OffsetCurve + - symbol: GeomBndLib_OffsetCurve2d + - symbol: GeomBndLib_OffsetSurface + - symbol: GeomBndLib_OtherCurve + - symbol: GeomBndLib_OtherCurve2d + - symbol: GeomBndLib_OtherSurface + - symbol: GeomBndLib_Parabola + - symbol: GeomBndLib_Parabola2d + - symbol: GeomBndLib_Plane + - symbol: GeomBndLib_Sphere + - symbol: GeomBndLib_Surface + - symbol: GeomBndLib_SurfaceOfExtrusion + - symbol: GeomBndLib_SurfaceOfRevolution + - symbol: GeomBndLib_Torus + - symbol: GeomConvert + - symbol: GeomConvert_ApproxCurve + - symbol: GeomConvert_ApproxSurface + - symbol: GeomConvert_BSplineCurveKnotSplitting + - symbol: GeomConvert_BSplineCurveToBezierCurve + - symbol: GeomConvert_BSplineSurfaceKnotSplitting + - symbol: GeomConvert_BSplineSurfaceToBezierSurface + - symbol: GeomConvert_CompBezierSurfacesToBSplineSurface + - symbol: GeomConvert_CompCurveToBSplineCurve + - symbol: GeomConvert_ConvType + - symbol: GeomConvert_CurveToAnaCurve + - symbol: GeomConvert_FuncConeLSDist + - symbol: GeomConvert_FuncCylinderLSDist + - symbol: GeomConvert_FuncSphereLSDist + - symbol: GeomConvert_SurfToAnaSurf + - symbol: GeomConvert_Units + - symbol: GeomEval_AHTBezierCurve + - symbol: GeomEval_AHTBezierSurface + - symbol: GeomEval_CircularHelicoidSurface + - symbol: GeomEval_CircularHelixCurve + - symbol: GeomEval_EllipsoidSurface + - symbol: GeomEval_HypParaboloidSurface + - symbol: GeomEval_HyperboloidSurface + - symbol: GeomEval_ParaboloidSurface + - symbol: GeomEval_RepCurveDesc_Base + - symbol: GeomEval_RepCurveDesc_DerivBounded + - symbol: GeomEval_RepCurveDesc_Domain1d + - symbol: GeomEval_RepCurveDesc_Full + - symbol: GeomEval_RepCurveDesc_Map1d + - symbol: GeomEval_RepCurveDesc_Mapped + - symbol: GeomEval_RepSurfaceDesc_Base + - symbol: GeomEval_RepSurfaceDesc_DerivBounded + - symbol: GeomEval_RepSurfaceDesc_Domain2d + - symbol: GeomEval_RepSurfaceDesc_Full + - symbol: GeomEval_RepSurfaceDesc_Map2d + - symbol: GeomEval_RepSurfaceDesc_Mapped + - symbol: GeomEval_SineWaveCurve + - symbol: GeomEval_TBezierCurve + - symbol: GeomEval_TBezierSurface + - symbol: GeomFill + - symbol: GeomFill_AppSurf + - symbol: GeomFill_AppSweep + - symbol: GeomFill_ApproxStyle + - symbol: GeomFill_BSplineCurves + - symbol: GeomFill_BezierCurves + - symbol: GeomFill_BoundWithSurf + - symbol: GeomFill_Boundary + - symbol: GeomFill_CircularBlendFunc + - symbol: GeomFill_ConstantBiNormal + - symbol: GeomFill_ConstrainedFilling + - symbol: GeomFill_Coons + - symbol: GeomFill_CoonsAlgPatch + - symbol: GeomFill_CornerState + - symbol: GeomFill_CorrectedFrenet + - symbol: GeomFill_CurveAndTrihedron + - symbol: GeomFill_Curved + - symbol: GeomFill_Darboux + - symbol: GeomFill_DegeneratedBound + - symbol: GeomFill_DiscreteTrihedron + - symbol: GeomFill_DraftTrihedron + - symbol: GeomFill_EvolvedSection + - symbol: GeomFill_Filling + - symbol: GeomFill_FillingStyle + - symbol: GeomFill_Fixed + - symbol: GeomFill_Frenet + - symbol: GeomFill_FunctionDraft + - symbol: GeomFill_FunctionGuide + - symbol: GeomFill_Generator + - symbol: GeomFill_Gordon + - symbol: GeomFill_GordonBuilder + - symbol: GeomFill_GuideTrihedronAC + - symbol: GeomFill_GuideTrihedronPlan + - symbol: GeomFill_Line + - symbol: GeomFill_LocFunction + - symbol: GeomFill_LocationDraft + - symbol: GeomFill_LocationGuide + - symbol: GeomFill_LocationLaw + - symbol: GeomFill_Pipe + - symbol: GeomFill_PipeError + - symbol: GeomFill_PlanFunc + - symbol: GeomFill_PolynomialConvertor + - symbol: GeomFill_Profiler + - symbol: GeomFill_QuasiAngularConvertor + - symbol: GeomFill_SectionGenerator + - symbol: GeomFill_SectionLaw + - symbol: GeomFill_SectionPlacement + - symbol: GeomFill_SimpleBound + - symbol: GeomFill_SnglrFunc + - symbol: GeomFill_Stretch + - symbol: GeomFill_Sweep + - symbol: GeomFill_SweepFunction + - symbol: GeomFill_Tensor + - symbol: GeomFill_TgtField + - symbol: GeomFill_TgtOnCoons + - symbol: GeomFill_Trihedron + - symbol: GeomFill_TrihedronLaw + - symbol: GeomFill_TrihedronWithGuide + - symbol: GeomFill_UniformSection + - symbol: GeomHash_CurveHasher + - symbol: GeomHash_SurfaceHasher + - symbol: GeomInt + - symbol: GeomInt_BSpGradient_BFGSOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_BSpParFunctionOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_BSpParLeastSquareOfMyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_Gradient_BFGSOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_Gradient_BFGSOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_IntSS + - symbol: GeomInt_LineConstructor + - symbol: GeomInt_LineTool + - symbol: GeomInt_MyBSplGradientOfTheComputeLineOfWLApprox + - symbol: GeomInt_MyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_MyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParFunctionOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ParFunctionOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParLeastSquareOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ParLeastSquareOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_ParameterAndOrientation + - symbol: GeomInt_ResConstraintOfMyGradientOfTheComputeLineBezierOfWLApprox + - symbol: GeomInt_ResConstraintOfMyGradientbisOfTheComputeLineOfWLApprox + - symbol: GeomInt_TheImpPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheInt2SOfThePrmPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheMultiLineOfWLApprox + - symbol: GeomInt_TheMultiLineToolOfWLApprox + - symbol: GeomInt_ThePrmPrmSvSurfacesOfWLApprox + - symbol: GeomInt_TheZerImpFuncOfTheImpPrmSvSurfacesOfWLApprox + - symbol: GeomInt_WLApprox + - symbol: GeomLProp + - symbol: GeomLProp_CLProps + - symbol: GeomLProp_CLProps2d + - symbol: GeomLProp_CurAndInf2d + - symbol: GeomLProp_SLProps + - symbol: GeomLib + - symbol: GeomLib_Check2dBSplineCurve + - symbol: GeomLib_CheckBSplineCurve + - symbol: GeomLib_CheckCurveOnSurface + - symbol: GeomLib_DenominatorMultiplier + - symbol: GeomLib_Interpolate + - symbol: GeomLib_InterpolationErrors + - symbol: GeomLib_IsPlanarSurface + - symbol: GeomLib_LogSample + - symbol: GeomLib_MakeCurvefromApprox + - symbol: GeomLib_PolyFunc + - symbol: GeomLib_Tool + - symbol: GeomProjLib + - symbol: GeomToIGES_GeomCurve + - symbol: GeomToIGES_GeomEntity + - symbol: GeomToIGES_GeomPoint + - symbol: GeomToIGES_GeomSurface + - symbol: GeomToIGES_GeomVector + - symbol: GeomToStep_MakeAxis1Placement + - symbol: GeomToStep_MakeAxis2Placement2d + - symbol: GeomToStep_MakeAxis2Placement3d + - symbol: GeomToStep_MakeBSplineCurveWithKnots + - symbol: GeomToStep_MakeBSplineCurveWithKnotsAndRationalBSplineCurve + - symbol: GeomToStep_MakeBSplineSurfaceWithKnots + - symbol: GeomToStep_MakeBSplineSurfaceWithKnotsAndRationalBSplineSurface + - symbol: GeomToStep_MakeBoundedCurve + - symbol: GeomToStep_MakeBoundedSurface + - symbol: GeomToStep_MakeCartesianPoint + - symbol: GeomToStep_MakeCartesianTransformationOperator + - symbol: GeomToStep_MakeCircle + - symbol: GeomToStep_MakeConic + - symbol: GeomToStep_MakeConicalSurface + - symbol: GeomToStep_MakeCurve + - symbol: GeomToStep_MakeCylindricalSurface + - symbol: GeomToStep_MakeDirection + - symbol: GeomToStep_MakeElementarySurface + - symbol: GeomToStep_MakeEllipse + - symbol: GeomToStep_MakeHyperbola + - symbol: GeomToStep_MakeLine + - symbol: GeomToStep_MakeParabola + - symbol: GeomToStep_MakePlane + - symbol: GeomToStep_MakePolyline + - symbol: GeomToStep_MakeRectangularTrimmedSurface + - symbol: GeomToStep_MakeSphericalSurface + - symbol: GeomToStep_MakeSurface + - symbol: GeomToStep_MakeSurfaceOfLinearExtrusion + - symbol: GeomToStep_MakeSurfaceOfRevolution + - symbol: GeomToStep_MakeSweptSurface + - symbol: GeomToStep_MakeToroidalSurface + - symbol: GeomToStep_MakeVector + - symbol: GeomToStep_Root + - symbol: GeomTools + - symbol: GeomTools_Curve2dSet + - symbol: GeomTools_CurveSet + - symbol: GeomTools_SurfaceSet + - symbol: Geom_Axis1Placement + - symbol: Geom_Axis2Placement + - symbol: Geom_AxisPlacement + - symbol: Geom_BSplineCurve + - symbol: Geom_BSplineSurface + - symbol: Geom_BezierCurve + - symbol: Geom_BezierSurface + - symbol: Geom_BoundedCurve + - symbol: Geom_BoundedSurface + - symbol: Geom_CartesianPoint + - symbol: Geom_Circle + - symbol: Geom_Conic + - symbol: Geom_ConicalSurface + - symbol: Geom_Curve + - symbol: Geom_CylindricalSurface + - symbol: Geom_Direction + - symbol: Geom_ElementarySurface + - symbol: Geom_Ellipse + - symbol: Geom_Geometry + - symbol: Geom_Hyperbola + - symbol: Geom_Line + - symbol: Geom_OffsetCurve + - symbol: Geom_OffsetSurface + - symbol: Geom_Parabola + - symbol: Geom_Plane + - symbol: Geom_Point + - symbol: Geom_RectangularTrimmedSurface + - symbol: Geom_SphericalSurface + - symbol: Geom_Surface + - symbol: Geom_SurfaceOfLinearExtrusion + - symbol: Geom_SurfaceOfRevolution + - symbol: Geom_SweptSurface + - symbol: Geom_ToroidalSurface + - symbol: Geom_Transformation + - symbol: Geom_TrimmedCurve + - symbol: Geom_UndefinedDerivative + - symbol: Geom_UndefinedValue + - symbol: Geom_Vector + - symbol: Geom_VectorWithMagnitude + - symbol: HLRAlgo + - symbol: HLRAlgo_BiPoint + - symbol: HLRAlgo_BiPoint_PointsT + - symbol: HLRAlgo_EdgeIterator + - symbol: HLRAlgo_EdgeStatus + - symbol: HLRAlgo_EdgesBlock + - symbol: HLRAlgo_EdgesBlock_MinMaxIndices + - symbol: HLRAlgo_Interference + - symbol: HLRAlgo_Intersection + - symbol: HLRAlgo_PolyAlgo + - symbol: HLRAlgo_PolyData + - symbol: HLRAlgo_PolyHidingData + - symbol: HLRAlgo_PolyInternalNode + - symbol: HLRAlgo_PolyInternalSegment + - symbol: HLRAlgo_PolyMask + - symbol: HLRAlgo_PolyShellData + - symbol: HLRAlgo_Projector + - symbol: HLRAlgo_TriangleData + - symbol: HLRAlgo_WiresBlock + - symbol: HLRAppli_ReflectLines + - symbol: HLRBRep + - symbol: HLRBRep_Algo + - symbol: HLRBRep_AreaLimit + - symbol: HLRBRep_BCurveTool + - symbol: HLRBRep_BiPnt2D + - symbol: HLRBRep_BiPoint + - symbol: HLRBRep_CInter + - symbol: HLRBRep_CLPropsATool + - symbol: HLRBRep_Curve + - symbol: HLRBRep_CurveTool + - symbol: HLRBRep_EdgeBuilder + - symbol: HLRBRep_EdgeData + - symbol: HLRBRep_EdgeFaceTool + - symbol: HLRBRep_EdgeIList + - symbol: HLRBRep_EdgeInterferenceTool + - symbol: HLRBRep_ExactIntersectionPointOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_FaceData + - symbol: HLRBRep_FaceIterator + - symbol: HLRBRep_HLRToShape + - symbol: HLRBRep_Hider + - symbol: HLRBRep_IntConicCurveOfCInter + - symbol: HLRBRep_InterCSurf + - symbol: HLRBRep_InternalAlgo + - symbol: HLRBRep_LineTool + - symbol: HLRBRep_MyImpParToolOfTheIntersectorOfTheIntConicCurveOfCInter + - symbol: HLRBRep_PolyAlgo + - symbol: HLRBRep_PolyHLRToShape + - symbol: HLRBRep_SLProps + - symbol: HLRBRep_SLPropsATool + - symbol: HLRBRep_ShapeBounds + - symbol: HLRBRep_ShapeToHLR + - symbol: HLRBRep_SurfaceTool + - symbol: HLRBRep_TheDistBetweenPCurvesOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_TheExactInterCSurf + - symbol: HLRBRep_TheIntConicCurveOfCInter + - symbol: HLRBRep_TheIntPCurvePCurveOfCInter + - symbol: HLRBRep_TheInterferenceOfInterCSurf + - symbol: HLRBRep_TheIntersectorOfTheIntConicCurveOfCInter + - symbol: HLRBRep_ThePolygon2dOfTheIntPCurvePCurveOfCInter + - symbol: HLRBRep_ThePolygonOfInterCSurf + - symbol: HLRBRep_ThePolygonToolOfInterCSurf + - symbol: HLRBRep_ThePolyhedronToolOfInterCSurf + - symbol: HLRBRep_TheProjPCurOfCInter + - symbol: HLRBRep_TheQuadCurvExactInterCSurf + - symbol: HLRBRep_TheQuadCurvFuncOfTheQuadCurvExactInterCSurf + - symbol: HLRBRep_TypeOfResultingEdge + - symbol: HLRBRep_VertexList + - symbol: HLRTopoBRep_DSFiller + - symbol: HLRTopoBRep_Data + - symbol: HLRTopoBRep_FaceData + - symbol: HLRTopoBRep_FaceIsoLiner + - symbol: HLRTopoBRep_OutLiner + - symbol: HLRTopoBRep_VData + - symbol: HatchGen_Domain + - symbol: HatchGen_ErrorStatus + - symbol: HatchGen_IntersectionPoint + - symbol: HatchGen_IntersectionType + - symbol: HatchGen_PointOnElement + - symbol: HatchGen_PointOnHatching + - symbol: Hatch_Hatcher + - symbol: Hatch_Line + - symbol: Hatch_LineForm + - symbol: Hatch_Parameter + - symbol: HelixBRep_BuilderHelix + - symbol: HelixGeom_BuilderApproxCurve + - symbol: HelixGeom_BuilderHelix + - symbol: HelixGeom_BuilderHelixCoil + - symbol: HelixGeom_BuilderHelixGen + - symbol: HelixGeom_HelixCurve + - symbol: HelixGeom_Tools + - symbol: Hermit + - symbol: IFGraph_AllConnected + - symbol: IFGraph_AllShared + - symbol: IFGraph_Articulations + - symbol: IFGraph_Compare + - symbol: IFGraph_ConnectedComponants + - symbol: IFGraph_Cumulate + - symbol: IFGraph_Cycles + - symbol: IFGraph_ExternalSources + - symbol: IFGraph_SCRoots + - symbol: IFGraph_StrongComponants + - symbol: IFGraph_SubPartsIterator + - symbol: IFSelect + - symbol: IFSelect_Act + - symbol: IFSelect_Activator + - symbol: IFSelect_AppliedModifiers + - symbol: IFSelect_BasicDumper + - symbol: IFSelect_CheckCounter + - symbol: IFSelect_ContextWrite + - symbol: IFSelect_DispGlobal + - symbol: IFSelect_DispPerCount + - symbol: IFSelect_DispPerFiles + - symbol: IFSelect_DispPerOne + - symbol: IFSelect_DispPerSignature + - symbol: IFSelect_Dispatch + - symbol: IFSelect_EditValue + - symbol: IFSelect_Editor + - symbol: IFSelect_Functions + - symbol: IFSelect_GeneralModifier + - symbol: IFSelect_GraphCounter + - symbol: IFSelect_ListEditor + - symbol: IFSelect_ModelCopier + - symbol: IFSelect_ModifEditForm + - symbol: IFSelect_ModifReorder + - symbol: IFSelect_Modifier + - symbol: IFSelect_PacketList + - symbol: IFSelect_ParamEditor + - symbol: IFSelect_PrintCount + - symbol: IFSelect_PrintFail + - symbol: IFSelect_RemainMode + - symbol: IFSelect_ReturnStatus + - symbol: IFSelect_SelectAnyList + - symbol: IFSelect_SelectAnyType + - symbol: IFSelect_SelectBase + - symbol: IFSelect_SelectCombine + - symbol: IFSelect_SelectControl + - symbol: IFSelect_SelectDeduct + - symbol: IFSelect_SelectDiff + - symbol: IFSelect_SelectEntityNumber + - symbol: IFSelect_SelectErrorEntities + - symbol: IFSelect_SelectExplore + - symbol: IFSelect_SelectExtract + - symbol: IFSelect_SelectFlag + - symbol: IFSelect_SelectInList + - symbol: IFSelect_SelectIncorrectEntities + - symbol: IFSelect_SelectIntersection + - symbol: IFSelect_SelectModelEntities + - symbol: IFSelect_SelectModelRoots + - symbol: IFSelect_SelectPointed + - symbol: IFSelect_SelectRange + - symbol: IFSelect_SelectRootComps + - symbol: IFSelect_SelectRoots + - symbol: IFSelect_SelectSent + - symbol: IFSelect_SelectShared + - symbol: IFSelect_SelectSharing + - symbol: IFSelect_SelectSignature + - symbol: IFSelect_SelectSignedShared + - symbol: IFSelect_SelectSignedSharing + - symbol: IFSelect_SelectSuite + - symbol: IFSelect_SelectType + - symbol: IFSelect_SelectUnion + - symbol: IFSelect_SelectUnknownEntities + - symbol: IFSelect_Selection + - symbol: IFSelect_SelectionIterator + - symbol: IFSelect_SessionDumper + - symbol: IFSelect_SessionFile + - symbol: IFSelect_SessionPilot + - symbol: IFSelect_ShareOut + - symbol: IFSelect_ShareOutResult + - symbol: IFSelect_SignAncestor + - symbol: IFSelect_SignCategory + - symbol: IFSelect_SignCounter + - symbol: IFSelect_SignMultiple + - symbol: IFSelect_SignType + - symbol: IFSelect_SignValidity + - symbol: IFSelect_Signature + - symbol: IFSelect_SignatureList + - symbol: IFSelect_TransformStandard + - symbol: IFSelect_Transformer + - symbol: IFSelect_WorkLibrary + - symbol: IFSelect_WorkSession + - symbol: IGESAppli + - symbol: IGESAppli_DrilledHole + - symbol: IGESAppli_ElementResults + - symbol: IGESAppli_FiniteElement + - symbol: IGESAppli_Flow + - symbol: IGESAppli_FlowLineSpec + - symbol: IGESAppli_GeneralModule + - symbol: IGESAppli_LevelFunction + - symbol: IGESAppli_LevelToPWBLayerMap + - symbol: IGESAppli_LineWidening + - symbol: IGESAppli_NodalConstraint + - symbol: IGESAppli_NodalDisplAndRot + - symbol: IGESAppli_NodalResults + - symbol: IGESAppli_Node + - symbol: IGESAppli_PWBArtworkStackup + - symbol: IGESAppli_PWBDrilledHole + - symbol: IGESAppli_PartNumber + - symbol: IGESAppli_PinNumber + - symbol: IGESAppli_PipingFlow + - symbol: IGESAppli_Protocol + - symbol: IGESAppli_ReadWriteModule + - symbol: IGESAppli_ReferenceDesignator + - symbol: IGESAppli_RegionRestriction + - symbol: IGESAppli_SpecificModule + - symbol: IGESAppli_ToolDrilledHole + - symbol: IGESAppli_ToolElementResults + - symbol: IGESAppli_ToolFiniteElement + - symbol: IGESAppli_ToolFlow + - symbol: IGESAppli_ToolFlowLineSpec + - symbol: IGESAppli_ToolLevelFunction + - symbol: IGESAppli_ToolLevelToPWBLayerMap + - symbol: IGESAppli_ToolLineWidening + - symbol: IGESAppli_ToolNodalConstraint + - symbol: IGESAppli_ToolNodalDisplAndRot + - symbol: IGESAppli_ToolNodalResults + - symbol: IGESAppli_ToolNode + - symbol: IGESAppli_ToolPWBArtworkStackup + - symbol: IGESAppli_ToolPWBDrilledHole + - symbol: IGESAppli_ToolPartNumber + - symbol: IGESAppli_ToolPinNumber + - symbol: IGESAppli_ToolPipingFlow + - symbol: IGESAppli_ToolReferenceDesignator + - symbol: IGESAppli_ToolRegionRestriction + - symbol: IGESBasic + - symbol: IGESBasic_AssocGroupType + - symbol: IGESBasic_ExternalRefFile + - symbol: IGESBasic_ExternalRefFileIndex + - symbol: IGESBasic_ExternalRefFileName + - symbol: IGESBasic_ExternalRefLibName + - symbol: IGESBasic_ExternalRefName + - symbol: IGESBasic_ExternalReferenceFile + - symbol: IGESBasic_GeneralModule + - symbol: IGESBasic_Group + - symbol: IGESBasic_GroupWithoutBackP + - symbol: IGESBasic_HArray1OfHArray1OfIGESEntity + - symbol: IGESBasic_HArray1OfHArray1OfInteger + - symbol: IGESBasic_HArray1OfHArray1OfReal + - symbol: IGESBasic_HArray1OfHArray1OfXY + - symbol: IGESBasic_HArray1OfHArray1OfXYZ + - symbol: IGESBasic_Hierarchy + - symbol: IGESBasic_Name + - symbol: IGESBasic_OrderedGroup + - symbol: IGESBasic_OrderedGroupWithoutBackP + - symbol: IGESBasic_Protocol + - symbol: IGESBasic_ReadWriteModule + - symbol: IGESBasic_SingleParent + - symbol: IGESBasic_SingularSubfigure + - symbol: IGESBasic_SpecificModule + - symbol: IGESBasic_SubfigureDef + - symbol: IGESBasic_ToolAssocGroupType + - symbol: IGESBasic_ToolExternalRefFile + - symbol: IGESBasic_ToolExternalRefFileIndex + - symbol: IGESBasic_ToolExternalRefFileName + - symbol: IGESBasic_ToolExternalRefLibName + - symbol: IGESBasic_ToolExternalRefName + - symbol: IGESBasic_ToolExternalReferenceFile + - symbol: IGESBasic_ToolGroup + - symbol: IGESBasic_ToolGroupWithoutBackP + - symbol: IGESBasic_ToolHierarchy + - symbol: IGESBasic_ToolName + - symbol: IGESBasic_ToolOrderedGroup + - symbol: IGESBasic_ToolOrderedGroupWithoutBackP + - symbol: IGESBasic_ToolSingleParent + - symbol: IGESBasic_ToolSingularSubfigure + - symbol: IGESBasic_ToolSubfigureDef + - symbol: IGESCAFControl + - symbol: IGESCAFControl_Reader + - symbol: IGESCAFControl_Writer + - symbol: IGESControl_ActorWrite + - symbol: IGESControl_AlgoContainer + - symbol: IGESControl_Controller + - symbol: IGESControl_IGESBoundary + - symbol: IGESControl_Reader + - symbol: IGESControl_ToolContainer + - symbol: IGESControl_Writer + - symbol: IGESConvGeom + - symbol: IGESConvGeom_GeomBuilder + - symbol: IGESData + - symbol: IGESData_BasicEditor + - symbol: IGESData_ColorEntity + - symbol: IGESData_DefList + - symbol: IGESData_DefSwitch + - symbol: IGESData_DefType + - symbol: IGESData_DefaultGeneral + - symbol: IGESData_DefaultSpecific + - symbol: IGESData_DirChecker + - symbol: IGESData_DirPart + - symbol: IGESData_FileProtocol + - symbol: IGESData_FileRecognizer + - symbol: IGESData_GeneralModule + - symbol: IGESData_GlobalNodeOfSpecificLib + - symbol: IGESData_GlobalNodeOfWriterLib + - symbol: IGESData_GlobalSection + - symbol: IGESData_IGESDumper + - symbol: IGESData_IGESEntity + - symbol: IGESData_IGESModel + - symbol: IGESData_IGESReaderTool + - symbol: IGESData_IGESType + - symbol: IGESData_IGESWriter + - symbol: IGESData_LabelDisplayEntity + - symbol: IGESData_LevelListEntity + - symbol: IGESData_LineFontEntity + - symbol: IGESData_NameEntity + - symbol: IGESData_NodeOfSpecificLib + - symbol: IGESData_NodeOfWriterLib + - symbol: IGESData_ParamCursor + - symbol: IGESData_Protocol + - symbol: IGESData_ReadStage + - symbol: IGESData_ReadWriteModule + - symbol: IGESData_SingleParentEntity + - symbol: IGESData_SpecificLib + - symbol: IGESData_SpecificModule + - symbol: IGESData_Status + - symbol: IGESData_ToolLocation + - symbol: IGESData_TransfEntity + - symbol: IGESData_UndefinedEntity + - symbol: IGESData_ViewKindEntity + - symbol: IGESData_WriterLib + - symbol: IGESDefs + - symbol: IGESDefs_AssociativityDef + - symbol: IGESDefs_AttributeDef + - symbol: IGESDefs_AttributeTable + - symbol: IGESDefs_GeneralModule + - symbol: IGESDefs_GenericData + - symbol: IGESDefs_HArray1OfHArray1OfTextDisplayTemplate + - symbol: IGESDefs_MacroDef + - symbol: IGESDefs_Protocol + - symbol: IGESDefs_ReadWriteModule + - symbol: IGESDefs_SpecificModule + - symbol: IGESDefs_TabularData + - symbol: IGESDefs_ToolAssociativityDef + - symbol: IGESDefs_ToolAttributeDef + - symbol: IGESDefs_ToolAttributeTable + - symbol: IGESDefs_ToolGenericData + - symbol: IGESDefs_ToolMacroDef + - symbol: IGESDefs_ToolTabularData + - symbol: IGESDefs_ToolUnitsData + - symbol: IGESDefs_UnitsData + - symbol: IGESDimen + - symbol: IGESDimen_AngularDimension + - symbol: IGESDimen_BasicDimension + - symbol: IGESDimen_CenterLine + - symbol: IGESDimen_CurveDimension + - symbol: IGESDimen_DiameterDimension + - symbol: IGESDimen_DimensionDisplayData + - symbol: IGESDimen_DimensionTolerance + - symbol: IGESDimen_DimensionUnits + - symbol: IGESDimen_DimensionedGeometry + - symbol: IGESDimen_FlagNote + - symbol: IGESDimen_GeneralLabel + - symbol: IGESDimen_GeneralModule + - symbol: IGESDimen_GeneralNote + - symbol: IGESDimen_GeneralSymbol + - symbol: IGESDimen_LeaderArrow + - symbol: IGESDimen_LinearDimension + - symbol: IGESDimen_NewDimensionedGeometry + - symbol: IGESDimen_NewGeneralNote + - symbol: IGESDimen_OrdinateDimension + - symbol: IGESDimen_PointDimension + - symbol: IGESDimen_Protocol + - symbol: IGESDimen_RadiusDimension + - symbol: IGESDimen_ReadWriteModule + - symbol: IGESDimen_Section + - symbol: IGESDimen_SectionedArea + - symbol: IGESDimen_SpecificModule + - symbol: IGESDimen_ToolAngularDimension + - symbol: IGESDimen_ToolBasicDimension + - symbol: IGESDimen_ToolCenterLine + - symbol: IGESDimen_ToolCurveDimension + - symbol: IGESDimen_ToolDiameterDimension + - symbol: IGESDimen_ToolDimensionDisplayData + - symbol: IGESDimen_ToolDimensionTolerance + - symbol: IGESDimen_ToolDimensionUnits + - symbol: IGESDimen_ToolDimensionedGeometry + - symbol: IGESDimen_ToolFlagNote + - symbol: IGESDimen_ToolGeneralLabel + - symbol: IGESDimen_ToolGeneralNote + - symbol: IGESDimen_ToolGeneralSymbol + - symbol: IGESDimen_ToolLeaderArrow + - symbol: IGESDimen_ToolLinearDimension + - symbol: IGESDimen_ToolNewDimensionedGeometry + - symbol: IGESDimen_ToolNewGeneralNote + - symbol: IGESDimen_ToolOrdinateDimension + - symbol: IGESDimen_ToolPointDimension + - symbol: IGESDimen_ToolRadiusDimension + - symbol: IGESDimen_ToolSection + - symbol: IGESDimen_ToolSectionedArea + - symbol: IGESDimen_ToolWitnessLine + - symbol: IGESDimen_WitnessLine + - symbol: IGESDraw + - symbol: IGESDraw_CircArraySubfigure + - symbol: IGESDraw_ConnectPoint + - symbol: IGESDraw_Drawing + - symbol: IGESDraw_DrawingWithRotation + - symbol: IGESDraw_GeneralModule + - symbol: IGESDraw_LabelDisplay + - symbol: IGESDraw_NetworkSubfigure + - symbol: IGESDraw_NetworkSubfigureDef + - symbol: IGESDraw_PerspectiveView + - symbol: IGESDraw_Planar + - symbol: IGESDraw_Protocol + - symbol: IGESDraw_ReadWriteModule + - symbol: IGESDraw_RectArraySubfigure + - symbol: IGESDraw_SegmentedViewsVisible + - symbol: IGESDraw_SpecificModule + - symbol: IGESDraw_ToolCircArraySubfigure + - symbol: IGESDraw_ToolConnectPoint + - symbol: IGESDraw_ToolDrawing + - symbol: IGESDraw_ToolDrawingWithRotation + - symbol: IGESDraw_ToolLabelDisplay + - symbol: IGESDraw_ToolNetworkSubfigure + - symbol: IGESDraw_ToolNetworkSubfigureDef + - symbol: IGESDraw_ToolPerspectiveView + - symbol: IGESDraw_ToolPlanar + - symbol: IGESDraw_ToolRectArraySubfigure + - symbol: IGESDraw_ToolSegmentedViewsVisible + - symbol: IGESDraw_ToolView + - symbol: IGESDraw_ToolViewsVisible + - symbol: IGESDraw_ToolViewsVisibleWithAttr + - symbol: IGESDraw_View + - symbol: IGESDraw_ViewsVisible + - symbol: IGESDraw_ViewsVisibleWithAttr + - symbol: IGESGeom + - symbol: IGESGeom_BSplineCurve + - symbol: IGESGeom_BSplineSurface + - symbol: IGESGeom_Boundary + - symbol: IGESGeom_BoundedSurface + - symbol: IGESGeom_CircularArc + - symbol: IGESGeom_CompositeCurve + - symbol: IGESGeom_ConicArc + - symbol: IGESGeom_CopiousData + - symbol: IGESGeom_CurveOnSurface + - symbol: IGESGeom_Direction + - symbol: IGESGeom_Flash + - symbol: IGESGeom_GeneralModule + - symbol: IGESGeom_Line + - symbol: IGESGeom_OffsetCurve + - symbol: IGESGeom_OffsetSurface + - symbol: IGESGeom_Plane + - symbol: IGESGeom_Point + - symbol: IGESGeom_Protocol + - symbol: IGESGeom_ReadWriteModule + - symbol: IGESGeom_RuledSurface + - symbol: IGESGeom_SpecificModule + - symbol: IGESGeom_SplineCurve + - symbol: IGESGeom_SplineSurface + - symbol: IGESGeom_SurfaceOfRevolution + - symbol: IGESGeom_TabulatedCylinder + - symbol: IGESGeom_ToolBSplineCurve + - symbol: IGESGeom_ToolBSplineSurface + - symbol: IGESGeom_ToolBoundary + - symbol: IGESGeom_ToolBoundedSurface + - symbol: IGESGeom_ToolCircularArc + - symbol: IGESGeom_ToolCompositeCurve + - symbol: IGESGeom_ToolConicArc + - symbol: IGESGeom_ToolCopiousData + - symbol: IGESGeom_ToolCurveOnSurface + - symbol: IGESGeom_ToolDirection + - symbol: IGESGeom_ToolFlash + - symbol: IGESGeom_ToolLine + - symbol: IGESGeom_ToolOffsetCurve + - symbol: IGESGeom_ToolOffsetSurface + - symbol: IGESGeom_ToolPlane + - symbol: IGESGeom_ToolPoint + - symbol: IGESGeom_ToolRuledSurface + - symbol: IGESGeom_ToolSplineCurve + - symbol: IGESGeom_ToolSplineSurface + - symbol: IGESGeom_ToolSurfaceOfRevolution + - symbol: IGESGeom_ToolTabulatedCylinder + - symbol: IGESGeom_ToolTransformationMatrix + - symbol: IGESGeom_ToolTrimmedSurface + - symbol: IGESGeom_TransformationMatrix + - symbol: IGESGeom_TrimmedSurface + - symbol: IGESGraph + - symbol: IGESGraph_Color + - symbol: IGESGraph_DefinitionLevel + - symbol: IGESGraph_DrawingSize + - symbol: IGESGraph_DrawingUnits + - symbol: IGESGraph_GeneralModule + - symbol: IGESGraph_HighLight + - symbol: IGESGraph_IntercharacterSpacing + - symbol: IGESGraph_LineFontDefPattern + - symbol: IGESGraph_LineFontDefTemplate + - symbol: IGESGraph_LineFontPredefined + - symbol: IGESGraph_NominalSize + - symbol: IGESGraph_Pick + - symbol: IGESGraph_Protocol + - symbol: IGESGraph_ReadWriteModule + - symbol: IGESGraph_SpecificModule + - symbol: IGESGraph_TextDisplayTemplate + - symbol: IGESGraph_TextFontDef + - symbol: IGESGraph_ToolColor + - symbol: IGESGraph_ToolDefinitionLevel + - symbol: IGESGraph_ToolDrawingSize + - symbol: IGESGraph_ToolDrawingUnits + - symbol: IGESGraph_ToolHighLight + - symbol: IGESGraph_ToolIntercharacterSpacing + - symbol: IGESGraph_ToolLineFontDefPattern + - symbol: IGESGraph_ToolLineFontDefTemplate + - symbol: IGESGraph_ToolLineFontPredefined + - symbol: IGESGraph_ToolNominalSize + - symbol: IGESGraph_ToolPick + - symbol: IGESGraph_ToolTextDisplayTemplate + - symbol: IGESGraph_ToolTextFontDef + - symbol: IGESGraph_ToolUniformRectGrid + - symbol: IGESGraph_UniformRectGrid + - symbol: IGESSelect + - symbol: IGESSelect_Activator + - symbol: IGESSelect_AddFileComment + - symbol: IGESSelect_AddGroup + - symbol: IGESSelect_AutoCorrect + - symbol: IGESSelect_ChangeLevelList + - symbol: IGESSelect_ChangeLevelNumber + - symbol: IGESSelect_ComputeStatus + - symbol: IGESSelect_CounterOfLevelNumber + - symbol: IGESSelect_DispPerDrawing + - symbol: IGESSelect_DispPerSingleView + - symbol: IGESSelect_Dumper + - symbol: IGESSelect_EditDirPart + - symbol: IGESSelect_EditHeader + - symbol: IGESSelect_FileModifier + - symbol: IGESSelect_FloatFormat + - symbol: IGESSelect_IGESName + - symbol: IGESSelect_IGESTypeForm + - symbol: IGESSelect_ModelModifier + - symbol: IGESSelect_RebuildDrawings + - symbol: IGESSelect_RebuildGroups + - symbol: IGESSelect_RemoveCurves + - symbol: IGESSelect_SelectBypassGroup + - symbol: IGESSelect_SelectBypassSubfigure + - symbol: IGESSelect_SelectDrawingFrom + - symbol: IGESSelect_SelectFaces + - symbol: IGESSelect_SelectFromDrawing + - symbol: IGESSelect_SelectFromSingleView + - symbol: IGESSelect_SelectLevelNumber + - symbol: IGESSelect_SelectName + - symbol: IGESSelect_SelectPCurves + - symbol: IGESSelect_SelectSingleViewFrom + - symbol: IGESSelect_SelectSubordinate + - symbol: IGESSelect_SelectVisibleStatus + - symbol: IGESSelect_SetGlobalParameter + - symbol: IGESSelect_SetLabel + - symbol: IGESSelect_SetVersion5 + - symbol: IGESSelect_SignColor + - symbol: IGESSelect_SignLevelNumber + - symbol: IGESSelect_SignStatus + - symbol: IGESSelect_SplineToBSpline + - symbol: IGESSelect_UpdateCreationDate + - symbol: IGESSelect_UpdateFileName + - symbol: IGESSelect_UpdateLastChange + - symbol: IGESSelect_ViewSorter + - symbol: IGESSelect_WorkLibrary + - symbol: IGESSolid + - symbol: IGESSolid_Block + - symbol: IGESSolid_BooleanTree + - symbol: IGESSolid_ConeFrustum + - symbol: IGESSolid_ConicalSurface + - symbol: IGESSolid_Cylinder + - symbol: IGESSolid_CylindricalSurface + - symbol: IGESSolid_EdgeList + - symbol: IGESSolid_Ellipsoid + - symbol: IGESSolid_Face + - symbol: IGESSolid_GeneralModule + - symbol: IGESSolid_Loop + - symbol: IGESSolid_ManifoldSolid + - symbol: IGESSolid_PlaneSurface + - symbol: IGESSolid_Protocol + - symbol: IGESSolid_ReadWriteModule + - symbol: IGESSolid_RightAngularWedge + - symbol: IGESSolid_SelectedComponent + - symbol: IGESSolid_Shell + - symbol: IGESSolid_SolidAssembly + - symbol: IGESSolid_SolidInstance + - symbol: IGESSolid_SolidOfLinearExtrusion + - symbol: IGESSolid_SolidOfRevolution + - symbol: IGESSolid_SpecificModule + - symbol: IGESSolid_Sphere + - symbol: IGESSolid_SphericalSurface + - symbol: IGESSolid_ToolBlock + - symbol: IGESSolid_ToolBooleanTree + - symbol: IGESSolid_ToolConeFrustum + - symbol: IGESSolid_ToolConicalSurface + - symbol: IGESSolid_ToolCylinder + - symbol: IGESSolid_ToolCylindricalSurface + - symbol: IGESSolid_ToolEdgeList + - symbol: IGESSolid_ToolEllipsoid + - symbol: IGESSolid_ToolFace + - symbol: IGESSolid_ToolLoop + - symbol: IGESSolid_ToolManifoldSolid + - symbol: IGESSolid_ToolPlaneSurface + - symbol: IGESSolid_ToolRightAngularWedge + - symbol: IGESSolid_ToolSelectedComponent + - symbol: IGESSolid_ToolShell + - symbol: IGESSolid_ToolSolidAssembly + - symbol: IGESSolid_ToolSolidInstance + - symbol: IGESSolid_ToolSolidOfLinearExtrusion + - symbol: IGESSolid_ToolSolidOfRevolution + - symbol: IGESSolid_ToolSphere + - symbol: IGESSolid_ToolSphericalSurface + - symbol: IGESSolid_ToolToroidalSurface + - symbol: IGESSolid_ToolTorus + - symbol: IGESSolid_ToolVertexList + - symbol: IGESSolid_TopoBuilder + - symbol: IGESSolid_ToroidalSurface + - symbol: IGESSolid_Torus + - symbol: IGESSolid_VertexList + - symbol: IGESToBRep + - symbol: IGESToBRep_Actor + - symbol: IGESToBRep_AlgoContainer + - symbol: IGESToBRep_BRepEntity + - symbol: IGESToBRep_BasicCurve + - symbol: IGESToBRep_BasicSurface + - symbol: IGESToBRep_CurveAndSurface + - symbol: IGESToBRep_IGESBoundary + - symbol: IGESToBRep_Reader + - symbol: IGESToBRep_ToolContainer + - symbol: IGESToBRep_TopoCurve + - symbol: IMeshData_Array1OfInteger + - symbol: IMeshData_Array1OfVertexOfDelaun + - symbol: IMeshData_BndBox2dTree + - symbol: IMeshData_BndBox2dTreeFiller + - symbol: IMeshData_CircleCellFilter + - symbol: IMeshData_Curve + - symbol: IMeshData_DMapOfIFacePtrsListOfInteger + - symbol: IMeshData_DMapOfIFacePtrsMapOfIEdgePtrs + - symbol: IMeshData_DMapOfIntegerListOfInteger + - symbol: IMeshData_DMapOfShapeInteger + - symbol: IMeshData_IDMapOfIFacePtrsListOfIPCurves + - symbol: IMeshData_IDMapOfLink + - symbol: IMeshData_IMapOfReal + - symbol: IMeshData_ListOfIPCurves + - symbol: IMeshData_ListOfInteger + - symbol: IMeshData_ListOfPnt2d + - symbol: IMeshData_MapOfIEdgePtr + - symbol: IMeshData_MapOfIFacePtr + - symbol: IMeshData_MapOfInteger + - symbol: IMeshData_MapOfIntegerInteger + - symbol: IMeshData_MapOfOrientedEdges + - symbol: IMeshData_MapOfReal + - symbol: IMeshData_Model + - symbol: IMeshData_PCurve + - symbol: IMeshData_ParametersList + - symbol: IMeshData_SequenceOfBndB2d + - symbol: IMeshData_SequenceOfInteger + - symbol: IMeshData_SequenceOfReal + - symbol: IMeshData_Shape + - symbol: IMeshData_Status + - symbol: IMeshData_StatusOwner + - symbol: IMeshData_TessellatedShape + - symbol: IMeshData_VectorOfBoolean + - symbol: IMeshData_VectorOfCircle + - symbol: IMeshData_VectorOfElements + - symbol: IMeshData_VectorOfIEdgeHandles + - symbol: IMeshData_VectorOfIEdgePtrs + - symbol: IMeshData_VectorOfIFaceHandles + - symbol: IMeshData_VectorOfIPCurveHandles + - symbol: IMeshData_VectorOfIWireHandles + - symbol: IMeshData_VectorOfInteger + - symbol: IMeshData_VectorOfOrientation + - symbol: IMeshData_VectorOfVertex + - symbol: IMeshData_VertexCellFilter + - symbol: IMeshTools_Context + - symbol: IMeshTools_CurveTessellator + - symbol: IMeshTools_MeshAlgo + - symbol: IMeshTools_MeshAlgoFactory + - symbol: IMeshTools_MeshAlgoType + - symbol: IMeshTools_MeshBuilder + - symbol: IMeshTools_ModelAlgo + - symbol: IMeshTools_ModelBuilder + - symbol: IMeshTools_Parameters + - symbol: IMeshTools_ShapeExplorer + - symbol: IMeshTools_ShapeVisitor + - symbol: IntAna2d_AnaIntersection + - symbol: IntAna2d_Conic + - symbol: IntAna2d_IntPoint + - symbol: IntAna_Curve + - symbol: IntAna_Int3Pln + - symbol: IntAna_IntConicQuad + - symbol: IntAna_IntLinTorus + - symbol: IntAna_IntQuadQuad + - symbol: IntAna_QuadQuadGeo + - symbol: IntAna_Quadric + - symbol: IntAna_ResultType + - symbol: IntCurveSurface_HInter + - symbol: IntCurveSurface_Intersection + - symbol: IntCurveSurface_IntersectionSegment + - symbol: IntCurveSurface_TheCSFunctionOfHInter + - symbol: IntCurveSurface_TheExactHInter + - symbol: IntCurveSurface_TheHCurveTool + - symbol: IntCurveSurface_TheInterferenceOfHInter + - symbol: IntCurveSurface_ThePolygonOfHInter + - symbol: IntCurveSurface_ThePolygonToolOfHInter + - symbol: IntCurveSurface_ThePolyhedronToolOfHInter + - symbol: IntCurveSurface_TheQuadCurvExactHInter + - symbol: IntCurveSurface_TheQuadCurvFuncOfTheQuadCurvExactHInter + - symbol: IntCurveSurface_TransitionOnCurve + - symbol: IntCurve_IConicTool + - symbol: IntCurve_IntConicConic + - symbol: IntCurve_IntImpConicParConic + - symbol: IntCurve_MyImpParToolOfIntImpConicParConic + - symbol: IntCurve_PConic + - symbol: IntCurve_PConicTool + - symbol: IntCurve_ProjectOnPConicTool + - symbol: IntCurvesFace_Intersector + - symbol: IntCurvesFace_ShapeIntersector + - symbol: IntImp_ConstIsoparametric + - symbol: IntPatch_ALine + - symbol: IntPatch_ALineToWLine + - symbol: IntPatch_ArcFunction + - symbol: IntPatch_BVHTraversal + - symbol: IntPatch_BVHTraversal_TrianglePair + - symbol: IntPatch_CSFunction + - symbol: IntPatch_CurvIntSurf + - symbol: IntPatch_GLine + - symbol: IntPatch_HCurve2dTool + - symbol: IntPatch_HInterTool + - symbol: IntPatch_IType + - symbol: IntPatch_ImpImpIntersection + - symbol: IntPatch_ImpPrmIntersection + - symbol: IntPatch_InterferencePolyhedron + - symbol: IntPatch_Intersection + - symbol: IntPatch_Line + - symbol: IntPatch_LineConstructor + - symbol: IntPatch_Point + - symbol: IntPatch_PointLine + - symbol: IntPatch_PolyArc + - symbol: IntPatch_PolyLine + - symbol: IntPatch_Polygo + - symbol: IntPatch_PolyhedronBVH + - symbol: IntPatch_PolyhedronTool + - symbol: IntPatch_PrmPrmIntersection + - symbol: IntPatch_PrmPrmIntersection_T3Bits + - symbol: IntPatch_RstInt + - symbol: IntPatch_SpecPntType + - symbol: IntPatch_SpecialPoints + - symbol: IntPatch_TheIWLineOfTheIWalking + - symbol: IntPatch_TheIWalking + - symbol: IntPatch_ThePathPointOfTheSOnBounds + - symbol: IntPatch_TheSOnBounds + - symbol: IntPatch_TheSearchInside + - symbol: IntPatch_TheSegmentOfTheSOnBounds + - symbol: IntPatch_TheSurfFunction + - symbol: IntPatch_WLine + - symbol: IntPatch_WLineTool + - symbol: IntPolyh_Couple + - symbol: IntPolyh_Edge + - symbol: IntPolyh_Intersection + - symbol: IntPolyh_Point + - symbol: IntPolyh_PointNormal + - symbol: IntPolyh_SectionLine + - symbol: IntPolyh_StartPoint + - symbol: IntPolyh_Tools + - symbol: IntPolyh_Triangle + - symbol: IntRes2d_Domain + - symbol: IntRes2d_Intersection + - symbol: IntRes2d_IntersectionPoint + - symbol: IntRes2d_IntersectionSegment + - symbol: IntRes2d_Position + - symbol: IntRes2d_Situation + - symbol: IntRes2d_Transition + - symbol: IntRes2d_TypeTrans + - symbol: IntStart_SITopolTool + - symbol: IntSurf + - symbol: IntSurf_Couple + - symbol: IntSurf_InteriorPoint + - symbol: IntSurf_InteriorPointTool + - symbol: IntSurf_LineOn2S + - symbol: IntSurf_PathPoint + - symbol: IntSurf_PathPointTool + - symbol: IntSurf_PntOn2S + - symbol: IntSurf_Quadric + - symbol: IntSurf_QuadricTool + - symbol: IntSurf_Situation + - symbol: IntSurf_Transition + - symbol: IntSurf_TypeTrans + - symbol: IntTools + - symbol: IntTools_BaseRangeSample + - symbol: IntTools_BeanFaceIntersector + - symbol: IntTools_CommonPrt + - symbol: IntTools_Context + - symbol: IntTools_Curve + - symbol: IntTools_CurveRangeLocalizeData + - symbol: IntTools_CurveRangeSample + - symbol: IntTools_EdgeEdge + - symbol: IntTools_EdgeFace + - symbol: IntTools_FClass2d + - symbol: IntTools_FaceFace + - symbol: IntTools_MarkedRangeSet + - symbol: IntTools_PntOn2Faces + - symbol: IntTools_Range + - symbol: IntTools_Root + - symbol: IntTools_ShrunkRange + - symbol: IntTools_SurfaceRangeLocalizeData + - symbol: IntTools_SurfaceRangeSample + - symbol: IntTools_Tools + - symbol: IntTools_TopolTool + - symbol: IntTools_WLineTool + - symbol: IntWalk_StatusDeflection + - symbol: IntWalk_TheInt2S + - symbol: IntWalk_VectorOfInteger + - symbol: IntWalk_VectorOfWalkingData + - symbol: IntWalk_WalkingData + - symbol: Interface_BitMap + - symbol: Interface_Category + - symbol: Interface_Check + - symbol: Interface_CheckFailure + - symbol: Interface_CheckIterator + - symbol: Interface_CheckStatus + - symbol: Interface_CheckTool + - symbol: Interface_CopyControl + - symbol: Interface_CopyMap + - symbol: Interface_CopyTool + - symbol: Interface_DataState + - symbol: Interface_EntityCluster + - symbol: Interface_EntityIterator + - symbol: Interface_EntityList + - symbol: Interface_FileParameter + - symbol: Interface_FileReaderTool + - symbol: Interface_FloatWriter + - symbol: Interface_GTool + - symbol: Interface_GeneralLib + - symbol: Interface_GlobalNodeOfGeneralLib + - symbol: Interface_GlobalNodeOfReaderLib + - symbol: Interface_GraphContent + - symbol: Interface_IntList + - symbol: Interface_IntVal + - symbol: Interface_InterfaceError + - symbol: Interface_InterfaceMismatch + - symbol: Interface_InterfaceModel + - symbol: Interface_LineBuffer + - symbol: Interface_MSG + - symbol: Interface_NodeOfGeneralLib + - symbol: Interface_NodeOfReaderLib + - symbol: Interface_ParamList + - symbol: Interface_ParamSet + - symbol: Interface_ParamType + - symbol: Interface_Protocol + - symbol: Interface_ReaderLib + - symbol: Interface_ReaderModule + - symbol: Interface_ReportEntity + - symbol: Interface_STAT + - symbol: Interface_ShareFlags + - symbol: Interface_ShareTool + - symbol: Interface_SignLabel + - symbol: Interface_SignType + - symbol: Interface_Static + - symbol: Interface_TypedValue + - symbol: Interval + - symbol: Intf + - symbol: Intf_Interference + - symbol: Intf_InterferencePolygon2d + - symbol: Intf_PIType + - symbol: Intf_Polygon2d + - symbol: Intf_SectionLine + - symbol: Intf_TangentZone + - symbol: Intf_Tool + - symbol: Intrv_Interval + - symbol: Intrv_Intervals + - symbol: Intrv_Position + - symbol: LDOMBasicString + - symbol: LDOMParser + - symbol: LDOMString + - symbol: LDOM_Attr + - symbol: LDOM_BasicAttribute + - symbol: LDOM_BasicElement + - symbol: LDOM_BasicNode + - symbol: LDOM_BasicText + - symbol: LDOM_CDATASection + - symbol: LDOM_CharReference + - symbol: LDOM_CharacterData + - symbol: LDOM_Comment + - symbol: LDOM_Document + - symbol: LDOM_DocumentType + - symbol: LDOM_Element + - symbol: LDOM_LDOMImplementation + - symbol: LDOM_MemManager + - symbol: LDOM_Node + - symbol: LDOM_NodeList + - symbol: LDOM_OSStream + - symbol: LDOM_SBuffer + - symbol: LDOM_Text + - symbol: LDOM_XmlWriter + - symbol: LProp_BadContinuity + - symbol: LProp_CIType + - symbol: LProp_CLProps3d + - symbol: LProp_CurAndInf + - symbol: LProp_CurveUtils_DirectAccess + - symbol: LProp_NotDefined + - symbol: LProp_SLProps3d + - symbol: LProp_Status + - symbol: LProp_SurfaceUtils_DirectAccess + - symbol: Law + - symbol: Law_BSpFunc + - symbol: Law_BSpline + - symbol: Law_BSplineKnotSplitting + - symbol: Law_Composite + - symbol: Law_Constant + - symbol: Law_Function + - symbol: Law_Interpol + - symbol: Law_Interpolate + - symbol: Law_Linear + - symbol: Law_S + - symbol: LocOpe + - symbol: LocOpe_BuildShape + - symbol: LocOpe_BuildWires + - symbol: LocOpe_DPrism + - symbol: LocOpe_FindEdges + - symbol: LocOpe_FindEdgesInFace + - symbol: LocOpe_GeneratedShape + - symbol: LocOpe_Generator + - symbol: LocOpe_GluedShape + - symbol: LocOpe_Gluer + - symbol: LocOpe_LinearForm + - symbol: LocOpe_Operation + - symbol: LocOpe_Pipe + - symbol: LocOpe_PntFace + - symbol: LocOpe_Prism + - symbol: LocOpe_SplitDrafts + - symbol: LocOpe_SplitShape + - symbol: LocOpe_Spliter + - symbol: LocOpe_WiresOnShape + - symbol: LocalAnalysis + - symbol: LocalAnalysis_CurveContinuity + - symbol: LocalAnalysis_StatusErrorType + - symbol: LocalAnalysis_SurfaceContinuity + - symbol: MAT2d_BiInt + - symbol: MAT2d_Circuit + - symbol: MAT2d_Connexion + - symbol: MAT2d_Mat2d + - symbol: MAT2d_MiniPath + - symbol: MAT2d_Tool2d + - symbol: MAT_Arc + - symbol: MAT_BasicElt + - symbol: MAT_Bisector + - symbol: MAT_Edge + - symbol: MAT_Graph + - symbol: MAT_ListOfBisector + - symbol: MAT_ListOfEdge + - symbol: MAT_Node + - symbol: MAT_Side + - symbol: MAT_TListNodeOfListOfBisector + - symbol: MAT_TListNodeOfListOfEdge + - symbol: MAT_Zone + - symbol: MathInteg_DoubleExpConfig + - symbol: MathInteg_KronrodConfig + - symbol: MathInteg_MultipleConfig + - symbol: MathInteg_SetResult + - symbol: MathLin_CroutResult + - symbol: MathLin_EigenResult + - symbol: MathLin_LUResult + - symbol: MathLin_LeastSquaresMethod + - symbol: MathLin_LeastSquaresResult + - symbol: MathLin_QRResult + - symbol: MathLin_SVDResult + - symbol: MathOpt_ConjugateGradientFormula + - symbol: MathOpt_FRPRConfig + - symbol: MathOpt_GlobalConfig + - symbol: MathOpt_GlobalStrategy + - symbol: MathOpt_NewtonConfig + - symbol: MathOpt_PSOBoundaryMode + - symbol: MathOpt_PSOConfig + - symbol: MathOpt_PSOInertiaSchedule + - symbol: MathOpt_PSOInitMode + - symbol: MathOpt_PSOSeedParticle + - symbol: MathOpt_PSOStats + - symbol: MathOpt_UzawaConfig + - symbol: MathOpt_UzawaResult + - symbol: MathPoly_GeneralPolyResult + - symbol: MathRoot_AllRootsResult + - symbol: MathRoot_MultipleConfig + - symbol: MathRoot_MultipleNoExtraHandler + - symbol: MathRoot_MultipleResult + - symbol: MathRoot_NullInterval + - symbol: MathRoot_TrigResult + - symbol: MathSys_LMConfig + - symbol: MathSys_NewtonOptions + - symbol: MathUtils_Ackley + - symbol: MathUtils_Beale + - symbol: MathUtils_Booth + - symbol: MathUtils_BoundedConfig + - symbol: MathUtils_BracketResult + - symbol: MathUtils_Config + - symbol: MathUtils_Constant + - symbol: MathUtils_Cosine + - symbol: MathUtils_DecompResult + - symbol: MathUtils_Domain1D + - symbol: MathUtils_Domain2D + - symbol: MathUtils_EigenResult + - symbol: MathUtils_Exponential + - symbol: MathUtils_Gaussian + - symbol: MathUtils_Himmelblau + - symbol: MathUtils_IntegConfig + - symbol: MathUtils_IntegResult + - symbol: MathUtils_InverseResult + - symbol: MathUtils_LinConfig + - symbol: MathUtils_LineSearchResult + - symbol: MathUtils_Linear + - symbol: MathUtils_LinearMultipleResult + - symbol: MathUtils_LinearResidual + - symbol: MathUtils_LinearResult + - symbol: MathUtils_MinBracketOptions + - symbol: MathUtils_MinBracketResult + - symbol: MathUtils_NDimConfig + - symbol: MathUtils_PolyResult + - symbol: MathUtils_Polynomial + - symbol: MathUtils_Power + - symbol: MathUtils_QuadraticForm + - symbol: MathUtils_RandomGenerator + - symbol: MathUtils_Rastrigin + - symbol: MathUtils_Rational + - symbol: MathUtils_Rosenbrock + - symbol: MathUtils_ScalarResult + - symbol: MathUtils_Sine + - symbol: MathUtils_Sphere + - symbol: MathUtils_Status + - symbol: MathUtils_VectorResult + - symbol: Message_Alert + - symbol: Message_AlertExtended + - symbol: Message_Algorithm + - symbol: Message_Attribute + - symbol: Message_AttributeMeter + - symbol: Message_AttributeObject + - symbol: Message_AttributeStream + - symbol: Message_CompositeAlerts + - symbol: Message_ExecStatus + - symbol: Message_Gravity + - symbol: Message_Level + - symbol: Message_MetricType + - symbol: Message_Msg + - symbol: Message_MsgFile + - symbol: Message_Printer + - symbol: Message_PrinterOStream + - symbol: Message_PrinterToReport + - symbol: Message_ProgressIndicator + - symbol: Message_ProgressRange + - symbol: Message_ProgressScope + - symbol: Message_ProgressSentry + - symbol: Message_Report + - symbol: Message_Status + - symbol: Message_StatusType + - symbol: MoniTool_AttrList + - symbol: MoniTool_CaseData + - symbol: MoniTool_DataInfo + - symbol: MoniTool_Element + - symbol: MoniTool_IntVal + - symbol: MoniTool_RealVal + - symbol: MoniTool_SignShape + - symbol: MoniTool_SignText + - symbol: MoniTool_Stat + - symbol: MoniTool_Timer + - symbol: MoniTool_TimerSentry + - symbol: MoniTool_TransientElem + - symbol: MoniTool_TypedValue + - symbol: MoniTool_ValueType + - symbol: MyDirectPolynomialRoots + - symbol: NCollection_AccAllocator + - symbol: NCollection_AlignedAllocator + - symbol: NCollection_BaseAllocator + - symbol: NCollection_BaseList + - symbol: NCollection_BaseList_Iterator + - symbol: NCollection_BaseMap + - symbol: NCollection_BaseMap_Iterator + - symbol: NCollection_BaseSequence + - symbol: NCollection_BaseSequence_Iterator + - symbol: NCollection_Buffer + - symbol: NCollection_CellFilter_Action + - symbol: NCollection_ForwardRangeSentinel + - symbol: NCollection_HeapAllocator + - symbol: NCollection_IncAllocator + - symbol: NCollection_IncAllocator_IBlock + - symbol: NCollection_SparseArrayBase + - symbol: NCollection_SparseArrayBase_Iterator + - symbol: NCollection_String + - symbol: NCollection_UtfStringTool + - symbol: NCollection_WinHeapAllocator + - symbol: NLPlate_HGPPConstraint + - symbol: NLPlate_HPG0Constraint + - symbol: NLPlate_HPG0G1Constraint + - symbol: NLPlate_HPG0G2Constraint + - symbol: NLPlate_HPG0G3Constraint + - symbol: NLPlate_HPG1Constraint + - symbol: NLPlate_HPG2Constraint + - symbol: NLPlate_HPG3Constraint + - symbol: NLPlate_NLPlate + - symbol: OSD + - symbol: OSD_Parallel + - symbol: OSD_Thread + - symbol: OSD_ThreadPool + - symbol: OSD_ThreadPool_Launcher + - symbol: PCDM + - symbol: PCDM_DOMHeaderParser + - symbol: PCDM_Document + - symbol: PCDM_DriverError + - symbol: PCDM_ReadWriter + - symbol: PCDM_ReadWriter_1 + - symbol: PCDM_Reader + - symbol: PCDM_ReaderStatus + - symbol: PCDM_Reference + - symbol: PCDM_ReferenceIterator + - symbol: PCDM_RetrievalDriver + - symbol: PCDM_StorageDriver + - symbol: PCDM_StoreStatus + - symbol: PCDM_TypeOfFileDriver + - symbol: PCDM_Writer + - symbol: PLib + - symbol: PLib_HermitJacobi + - symbol: PLib_JacobiPolynomial + - symbol: PSO_Particle + - symbol: PeriodicInterval + - symbol: PeriodicityInfo + - symbol: Plate_D1 + - symbol: Plate_D2 + - symbol: Plate_D3 + - symbol: Plate_FreeGtoCConstraint + - symbol: Plate_GlobalTranslationConstraint + - symbol: Plate_GtoCConstraint + - symbol: Plate_LineConstraint + - symbol: Plate_LinearScalarConstraint + - symbol: Plate_LinearXYZConstraint + - symbol: Plate_PinpointConstraint + - symbol: Plate_PlaneConstraint + - symbol: Plate_Plate + - symbol: Plate_SampledCurveConstraint + - symbol: Poly + - symbol: Poly_ArrayOfNodes + - symbol: Poly_ArrayOfUVNodes + - symbol: Poly_CoherentLink + - symbol: Poly_CoherentNode + - symbol: Poly_CoherentTriPtr_Iterator + - symbol: Poly_CoherentTriangle + - symbol: Poly_CoherentTriangulation + - symbol: Poly_CoherentTriangulation_IteratorOfLink + - symbol: Poly_CoherentTriangulation_IteratorOfNode + - symbol: Poly_CoherentTriangulation_IteratorOfTriangle + - symbol: Poly_Connect + - symbol: Poly_MakeLoops + - symbol: Poly_MakeLoops2D_Helper + - symbol: Poly_MakeLoops3D_Helper + - symbol: Poly_MakeLoops_Hasher + - symbol: Poly_MakeLoops_HeapOfInteger + - symbol: Poly_MakeLoops_Helper + - symbol: Poly_MakeLoops_Link + - symbol: Poly_MergeNodesTool + - symbol: Poly_Polygon2D + - symbol: Poly_Polygon3D + - symbol: Poly_PolygonOnTriangulation + - symbol: Poly_Triangle + - symbol: Poly_Triangulation + - symbol: Poly_TriangulationParameters + - symbol: Precision + - symbol: Quantity_Color + - symbol: Quantity_ColorRGBA + - symbol: Quantity_NameOfColor + - symbol: Quantity_TypeOfColor + - symbol: RWGltf_CafReader + - symbol: RWGltf_CafWriter + - symbol: RWGltf_DracoParameters + - symbol: RWGltf_GltfAccessor + - symbol: RWGltf_GltfAccessorCompType + - symbol: RWGltf_GltfAccessorLayout + - symbol: RWGltf_GltfAlphaMode + - symbol: RWGltf_GltfArrayType + - symbol: RWGltf_GltfBufferView + - symbol: RWGltf_GltfBufferViewTarget + - symbol: RWGltf_GltfFace + - symbol: RWGltf_GltfJsonParser + - symbol: RWGltf_GltfLatePrimitiveArray + - symbol: RWGltf_GltfMaterialMap + - symbol: RWGltf_GltfOStreamWriter + - symbol: RWGltf_GltfPrimArrayData + - symbol: RWGltf_GltfPrimitiveMode + - symbol: RWGltf_GltfRootElement + - symbol: RWGltf_GltfSceneNodeMap + - symbol: RWGltf_MaterialCommon + - symbol: RWGltf_MaterialMetallicRoughness + - symbol: RWGltf_TriangulationReader + - symbol: RWGltf_WriterTrsfFormat + - symbol: RWHeaderSection + - symbol: RWHeaderSection_RWFileDescription + - symbol: RWHeaderSection_RWFileName + - symbol: RWHeaderSection_RWFileSchema + - symbol: RWHeaderSection_ReadWriteModule + - symbol: RWMesh + - symbol: RWMesh_CafReader + - symbol: RWMesh_CafReaderStatusEx + - symbol: RWMesh_CoordinateSystem + - symbol: RWMesh_CoordinateSystemConverter + - symbol: RWMesh_EdgeIterator + - symbol: RWMesh_FaceIterator + - symbol: RWMesh_MaterialMap + - symbol: RWMesh_NameFormat + - symbol: RWMesh_NodeAttributes + - symbol: RWMesh_ShapeIterator + - symbol: RWMesh_TriangulationReader + - symbol: RWMesh_TriangulationReader_LoadingStatistic + - symbol: RWMesh_TriangulationSource + - symbol: RWMesh_VertexIterator + - symbol: RWObj + - symbol: RWObj_CafReader + - symbol: RWObj_CafWriter + - symbol: RWObj_IShapeReceiver + - symbol: RWObj_Material + - symbol: RWObj_MtlReader + - symbol: RWObj_ObjMaterialMap + - symbol: RWObj_ObjWriterContext + - symbol: RWObj_Reader + - symbol: RWObj_SubMesh + - symbol: RWObj_SubMeshReason + - symbol: RWObj_TriangulationReader + - symbol: RWPly_CafWriter + - symbol: RWPly_PlyWriterContext + - symbol: RWStl + - symbol: RWStl_Reader + - symbol: Resource_FormatType + - symbol: Resource_LexicalCompare + - symbol: Resource_Manager + - symbol: Resource_NoSuchResource + - symbol: Resource_Unicode + - symbol: STEPCAFControl_ActorWrite + - symbol: STEPCAFControl_Controller + - symbol: STEPCAFControl_ExternFile + - symbol: STEPCAFControl_Reader + - symbol: STEPCAFControl_Writer + - symbol: STEPConstruct + - symbol: STEPConstruct_AP203Context + - symbol: STEPConstruct_Assembly + - symbol: STEPConstruct_ContextTool + - symbol: STEPConstruct_ExternRefs + - symbol: STEPConstruct_Part + - symbol: STEPConstruct_RenderingProperties + - symbol: STEPConstruct_Styles + - symbol: STEPConstruct_Tool + - symbol: STEPConstruct_UnitContext + - symbol: STEPConstruct_ValidationProps + - symbol: STEPControl_ActorRead + - symbol: STEPControl_ActorWrite + - symbol: STEPControl_Controller + - symbol: STEPControl_Reader + - symbol: STEPControl_StepModelType + - symbol: STEPControl_Writer + - symbol: STEPEdit + - symbol: STEPEdit_EditContext + - symbol: STEPEdit_EditSDR + - symbol: STEPSelections_AssemblyComponent + - symbol: STEPSelections_AssemblyExplorer + - symbol: STEPSelections_AssemblyLink + - symbol: STEPSelections_SelectAssembly + - symbol: STEPSelections_SelectDerived + - symbol: STEPSelections_SelectFaces + - symbol: STEPSelections_SelectForTransfer + - symbol: STEPSelections_SelectGSCurves + - symbol: STEPSelections_SelectInstances + - symbol: ShapeAlgo + - symbol: ShapeAlgo_AlgoContainer + - symbol: ShapeAlgo_ToolContainer + - symbol: ShapeAnalysis + - symbol: ShapeAnalysis_BoxBndTreeSelector + - symbol: ShapeAnalysis_CanonicalRecognition + - symbol: ShapeAnalysis_CheckSmallFace + - symbol: ShapeAnalysis_Curve + - symbol: ShapeAnalysis_Edge + - symbol: ShapeAnalysis_FreeBoundData + - symbol: ShapeAnalysis_FreeBounds + - symbol: ShapeAnalysis_FreeBoundsProperties + - symbol: ShapeAnalysis_Geom + - symbol: ShapeAnalysis_ShapeContents + - symbol: ShapeAnalysis_ShapeTolerance + - symbol: ShapeAnalysis_Shell + - symbol: ShapeAnalysis_Surface + - symbol: ShapeAnalysis_TransferParameters + - symbol: ShapeAnalysis_TransferParametersProj + - symbol: ShapeAnalysis_Wire + - symbol: ShapeAnalysis_WireOrder + - symbol: ShapeAnalysis_WireVertex + - symbol: ShapeBuild + - symbol: ShapeBuild_Edge + - symbol: ShapeBuild_ReShape + - symbol: ShapeBuild_Vertex + - symbol: ShapeConstruct + - symbol: ShapeConstruct_Curve + - symbol: ShapeConstruct_MakeTriangulation + - symbol: ShapeConstruct_ProjectCurveOnSurface + - symbol: ShapeCustom + - symbol: ShapeCustom_BSplineRestriction + - symbol: ShapeCustom_ConvertToBSpline + - symbol: ShapeCustom_ConvertToRevolution + - symbol: ShapeCustom_Curve + - symbol: ShapeCustom_Curve2d + - symbol: ShapeCustom_DirectModification + - symbol: ShapeCustom_Modification + - symbol: ShapeCustom_RestrictionParameters + - symbol: ShapeCustom_Surface + - symbol: ShapeCustom_SweptToElementary + - symbol: ShapeCustom_TrsfModification + - symbol: ShapeExtend + - symbol: ShapeExtend_BasicMsgRegistrator + - symbol: ShapeExtend_ComplexCurve + - symbol: ShapeExtend_CompositeSurface + - symbol: ShapeExtend_Explorer + - symbol: ShapeExtend_MsgRegistrator + - symbol: ShapeExtend_Parametrisation + - symbol: ShapeExtend_Status + - symbol: ShapeExtend_WireData + - symbol: ShapeFix + - symbol: ShapeFix_ComposeShell + - symbol: ShapeFix_Edge + - symbol: ShapeFix_EdgeConnect + - symbol: ShapeFix_EdgeProjAux + - symbol: ShapeFix_Face + - symbol: ShapeFix_FaceConnect + - symbol: ShapeFix_FixSmallFace + - symbol: ShapeFix_FixSmallSolid + - symbol: ShapeFix_FreeBounds + - symbol: ShapeFix_IntersectionTool + - symbol: ShapeFix_Root + - symbol: ShapeFix_Shape + - symbol: ShapeFix_ShapeTolerance + - symbol: ShapeFix_Shell + - symbol: ShapeFix_Solid + - symbol: ShapeFix_SplitCommonVertex + - symbol: ShapeFix_SplitTool + - symbol: ShapeFix_Wire + - symbol: ShapeFix_WireVertex + - symbol: ShapeFix_Wireframe + - symbol: ShapeProcess + - symbol: ShapeProcessAPI_ApplySequence + - symbol: ShapeProcess_Context + - symbol: ShapeProcess_OperLibrary + - symbol: ShapeProcess_Operator + - symbol: ShapeProcess_ShapeContext + - symbol: ShapeProcess_UOperator + - symbol: ShapeUpgrade + - symbol: ShapeUpgrade_ClosedEdgeDivide + - symbol: ShapeUpgrade_ClosedFaceDivide + - symbol: ShapeUpgrade_ConvertCurve2dToBezier + - symbol: ShapeUpgrade_ConvertCurve3dToBezier + - symbol: ShapeUpgrade_ConvertSurfaceToBezierBasis + - symbol: ShapeUpgrade_EdgeDivide + - symbol: ShapeUpgrade_FaceDivide + - symbol: ShapeUpgrade_FaceDivideArea + - symbol: ShapeUpgrade_FixSmallBezierCurves + - symbol: ShapeUpgrade_FixSmallCurves + - symbol: ShapeUpgrade_RemoveInternalWires + - symbol: ShapeUpgrade_RemoveLocations + - symbol: ShapeUpgrade_ShapeConvertToBezier + - symbol: ShapeUpgrade_ShapeDivide + - symbol: ShapeUpgrade_ShapeDivideAngle + - symbol: ShapeUpgrade_ShapeDivideArea + - symbol: ShapeUpgrade_ShapeDivideClosed + - symbol: ShapeUpgrade_ShapeDivideClosedEdges + - symbol: ShapeUpgrade_ShapeDivideContinuity + - symbol: ShapeUpgrade_ShellSewing + - symbol: ShapeUpgrade_SplitCurve + - symbol: ShapeUpgrade_SplitCurve2d + - symbol: ShapeUpgrade_SplitCurve2dContinuity + - symbol: ShapeUpgrade_SplitCurve3d + - symbol: ShapeUpgrade_SplitCurve3dContinuity + - symbol: ShapeUpgrade_SplitSurface + - symbol: ShapeUpgrade_SplitSurfaceAngle + - symbol: ShapeUpgrade_SplitSurfaceArea + - symbol: ShapeUpgrade_SplitSurfaceContinuity + - symbol: ShapeUpgrade_Tool + - symbol: ShapeUpgrade_UnifySameDomain + - symbol: ShapeUpgrade_WireDivide + - symbol: Standard + - symbol: Standard_ArrayStreamBuffer + - symbol: Standard_CLocaleSentry + - symbol: Standard_CStringHasher + - symbol: Standard_Condition + - symbol: Standard_ConstructionError + - symbol: Standard_DimensionError + - symbol: Standard_DimensionMismatch + - symbol: Standard_DivideByZero + - symbol: Standard_DomainError + - symbol: Standard_DumpValue + - symbol: Standard_ErrorHandler_Callback + - symbol: Standard_Failure + - symbol: Standard_GUID + - symbol: Standard_HMutex + - symbol: Standard_JsonKey + - symbol: Standard_MultiplyDefined + - symbol: Standard_Mutex + - symbol: Standard_Mutex_Sentry + - symbol: Standard_NegativeValue + - symbol: Standard_NoMoreObject + - symbol: Standard_NoSuchObject + - symbol: Standard_NotImplemented + - symbol: Standard_NullObject + - symbol: Standard_NullValue + - symbol: Standard_NumericError + - symbol: Standard_OutOfMemory + - symbol: Standard_OutOfRange + - symbol: Standard_Overflow + - symbol: Standard_Persistent + - symbol: Standard_ProgramError + - symbol: Standard_RangeError + - symbol: Standard_ReadBuffer + - symbol: Standard_ReadLineBuffer + - symbol: Standard_Transient + - symbol: Standard_Type + - symbol: Standard_TypeMismatch + - symbol: Standard_UUID + - symbol: Standard_Underflow + - symbol: StdFail_InfiniteSolutions + - symbol: StdFail_NotDone + - symbol: StdFail_Undefined + - symbol: StdFail_UndefinedDerivative + - symbol: StdFail_UndefinedValue + - symbol: StepAP203_ApprovedItem + - symbol: StepAP203_CcDesignApproval + - symbol: StepAP203_CcDesignCertification + - symbol: StepAP203_CcDesignContract + - symbol: StepAP203_CcDesignDateAndTimeAssignment + - symbol: StepAP203_CcDesignPersonAndOrganizationAssignment + - symbol: StepAP203_CcDesignSecurityClassification + - symbol: StepAP203_CcDesignSpecificationReference + - symbol: StepAP203_CertifiedItem + - symbol: StepAP203_Change + - symbol: StepAP203_ChangeRequest + - symbol: StepAP203_ChangeRequestItem + - symbol: StepAP203_ClassifiedItem + - symbol: StepAP203_ContractedItem + - symbol: StepAP203_DateTimeItem + - symbol: StepAP203_PersonOrganizationItem + - symbol: StepAP203_SpecifiedItem + - symbol: StepAP203_StartRequest + - symbol: StepAP203_StartRequestItem + - symbol: StepAP203_StartWork + - symbol: StepAP203_WorkItem + - symbol: StepAP209_Construct + - symbol: StepAP214 + - symbol: StepAP214_AppliedApprovalAssignment + - symbol: StepAP214_AppliedDateAndTimeAssignment + - symbol: StepAP214_AppliedDateAssignment + - symbol: StepAP214_AppliedDocumentReference + - symbol: StepAP214_AppliedExternalIdentificationAssignment + - symbol: StepAP214_AppliedGroupAssignment + - symbol: StepAP214_AppliedOrganizationAssignment + - symbol: StepAP214_AppliedPersonAndOrganizationAssignment + - symbol: StepAP214_AppliedPresentedItem + - symbol: StepAP214_AppliedSecurityClassificationAssignment + - symbol: StepAP214_ApprovalItem + - symbol: StepAP214_AutoDesignActualDateAndTimeAssignment + - symbol: StepAP214_AutoDesignActualDateAssignment + - symbol: StepAP214_AutoDesignApprovalAssignment + - symbol: StepAP214_AutoDesignDateAndPersonAssignment + - symbol: StepAP214_AutoDesignDateAndPersonItem + - symbol: StepAP214_AutoDesignDateAndTimeItem + - symbol: StepAP214_AutoDesignDatedItem + - symbol: StepAP214_AutoDesignDocumentReference + - symbol: StepAP214_AutoDesignGeneralOrgItem + - symbol: StepAP214_AutoDesignGroupAssignment + - symbol: StepAP214_AutoDesignGroupedItem + - symbol: StepAP214_AutoDesignNominalDateAndTimeAssignment + - symbol: StepAP214_AutoDesignNominalDateAssignment + - symbol: StepAP214_AutoDesignOrganizationAssignment + - symbol: StepAP214_AutoDesignOrganizationItem + - symbol: StepAP214_AutoDesignPersonAndOrganizationAssignment + - symbol: StepAP214_AutoDesignPresentedItem + - symbol: StepAP214_AutoDesignPresentedItemSelect + - symbol: StepAP214_AutoDesignReferencingItem + - symbol: StepAP214_AutoDesignSecurityClassificationAssignment + - symbol: StepAP214_Class + - symbol: StepAP214_DateAndTimeItem + - symbol: StepAP214_DateItem + - symbol: StepAP214_DocumentReferenceItem + - symbol: StepAP214_ExternalIdentificationItem + - symbol: StepAP214_ExternallyDefinedClass + - symbol: StepAP214_ExternallyDefinedGeneralProperty + - symbol: StepAP214_GroupItem + - symbol: StepAP214_OrganizationItem + - symbol: StepAP214_PersonAndOrganizationItem + - symbol: StepAP214_PresentedItemSelect + - symbol: StepAP214_Protocol + - symbol: StepAP214_RepItemGroup + - symbol: StepAP214_SecurityClassificationItem + - symbol: StepAP242_DraughtingModelItemAssociation + - symbol: StepAP242_GeometricItemSpecificUsage + - symbol: StepAP242_IdAttribute + - symbol: StepAP242_IdAttributeSelect + - symbol: StepAP242_ItemIdentifiedRepresentationUsage + - symbol: StepAP242_ItemIdentifiedRepresentationUsageDefinition + - symbol: StepBasic_Action + - symbol: StepBasic_ActionAssignment + - symbol: StepBasic_ActionMethod + - symbol: StepBasic_ActionRequestAssignment + - symbol: StepBasic_ActionRequestSolution + - symbol: StepBasic_Address + - symbol: StepBasic_AheadOrBehind + - symbol: StepBasic_ApplicationContext + - symbol: StepBasic_ApplicationContextElement + - symbol: StepBasic_ApplicationProtocolDefinition + - symbol: StepBasic_Approval + - symbol: StepBasic_ApprovalAssignment + - symbol: StepBasic_ApprovalDateTime + - symbol: StepBasic_ApprovalPersonOrganization + - symbol: StepBasic_ApprovalRelationship + - symbol: StepBasic_ApprovalRole + - symbol: StepBasic_ApprovalStatus + - symbol: StepBasic_AreaUnit + - symbol: StepBasic_CalendarDate + - symbol: StepBasic_Certification + - symbol: StepBasic_CertificationAssignment + - symbol: StepBasic_CertificationType + - symbol: StepBasic_CharacterizedObject + - symbol: StepBasic_Contract + - symbol: StepBasic_ContractAssignment + - symbol: StepBasic_ContractType + - symbol: StepBasic_ConversionBasedUnit + - symbol: StepBasic_ConversionBasedUnitAndAreaUnit + - symbol: StepBasic_ConversionBasedUnitAndLengthUnit + - symbol: StepBasic_ConversionBasedUnitAndMassUnit + - symbol: StepBasic_ConversionBasedUnitAndPlaneAngleUnit + - symbol: StepBasic_ConversionBasedUnitAndRatioUnit + - symbol: StepBasic_ConversionBasedUnitAndSolidAngleUnit + - symbol: StepBasic_ConversionBasedUnitAndTimeUnit + - symbol: StepBasic_ConversionBasedUnitAndVolumeUnit + - symbol: StepBasic_CoordinatedUniversalTimeOffset + - symbol: StepBasic_Date + - symbol: StepBasic_DateAndTime + - symbol: StepBasic_DateAndTimeAssignment + - symbol: StepBasic_DateAssignment + - symbol: StepBasic_DateRole + - symbol: StepBasic_DateTimeRole + - symbol: StepBasic_DateTimeSelect + - symbol: StepBasic_DerivedUnit + - symbol: StepBasic_DerivedUnitElement + - symbol: StepBasic_DesignContext + - symbol: StepBasic_DigitalDocument + - symbol: StepBasic_DimensionalExponents + - symbol: StepBasic_Document + - symbol: StepBasic_DocumentFile + - symbol: StepBasic_DocumentProductAssociation + - symbol: StepBasic_DocumentProductEquivalence + - symbol: StepBasic_DocumentReference + - symbol: StepBasic_DocumentRelationship + - symbol: StepBasic_DocumentRepresentationType + - symbol: StepBasic_DocumentType + - symbol: StepBasic_DocumentUsageConstraint + - symbol: StepBasic_Effectivity + - symbol: StepBasic_EffectivityAssignment + - symbol: StepBasic_EulerAngles + - symbol: StepBasic_ExternalIdentificationAssignment + - symbol: StepBasic_ExternalSource + - symbol: StepBasic_ExternallyDefinedItem + - symbol: StepBasic_GeneralProperty + - symbol: StepBasic_GeneralPropertyAssociation + - symbol: StepBasic_GeneralPropertyRelationship + - symbol: StepBasic_Group + - symbol: StepBasic_GroupAssignment + - symbol: StepBasic_GroupRelationship + - symbol: StepBasic_IdentificationAssignment + - symbol: StepBasic_IdentificationRole + - symbol: StepBasic_LengthMeasureWithUnit + - symbol: StepBasic_LengthUnit + - symbol: StepBasic_LocalTime + - symbol: StepBasic_MassMeasureWithUnit + - symbol: StepBasic_MassUnit + - symbol: StepBasic_MeasureValueMember + - symbol: StepBasic_MeasureWithUnit + - symbol: StepBasic_MechanicalContext + - symbol: StepBasic_NameAssignment + - symbol: StepBasic_NamedUnit + - symbol: StepBasic_ObjectRole + - symbol: StepBasic_OrdinalDate + - symbol: StepBasic_Organization + - symbol: StepBasic_OrganizationAssignment + - symbol: StepBasic_OrganizationRole + - symbol: StepBasic_OrganizationalAddress + - symbol: StepBasic_Person + - symbol: StepBasic_PersonAndOrganization + - symbol: StepBasic_PersonAndOrganizationAssignment + - symbol: StepBasic_PersonAndOrganizationRole + - symbol: StepBasic_PersonOrganizationSelect + - symbol: StepBasic_PersonalAddress + - symbol: StepBasic_PhysicallyModeledProductDefinition + - symbol: StepBasic_PlaneAngleMeasureWithUnit + - symbol: StepBasic_PlaneAngleUnit + - symbol: StepBasic_Product + - symbol: StepBasic_ProductCategory + - symbol: StepBasic_ProductCategoryRelationship + - symbol: StepBasic_ProductConceptContext + - symbol: StepBasic_ProductContext + - symbol: StepBasic_ProductDefinition + - symbol: StepBasic_ProductDefinitionContext + - symbol: StepBasic_ProductDefinitionEffectivity + - symbol: StepBasic_ProductDefinitionFormation + - symbol: StepBasic_ProductDefinitionFormationRelationship + - symbol: StepBasic_ProductDefinitionFormationWithSpecifiedSource + - symbol: StepBasic_ProductDefinitionOrReference + - symbol: StepBasic_ProductDefinitionReference + - symbol: StepBasic_ProductDefinitionReferenceWithLocalRepresentation + - symbol: StepBasic_ProductDefinitionRelationship + - symbol: StepBasic_ProductDefinitionWithAssociatedDocuments + - symbol: StepBasic_ProductOrFormationOrDefinition + - symbol: StepBasic_ProductRelatedProductCategory + - symbol: StepBasic_ProductType + - symbol: StepBasic_RatioMeasureWithUnit + - symbol: StepBasic_RatioUnit + - symbol: StepBasic_RoleAssociation + - symbol: StepBasic_RoleSelect + - symbol: StepBasic_SecurityClassification + - symbol: StepBasic_SecurityClassificationAssignment + - symbol: StepBasic_SecurityClassificationLevel + - symbol: StepBasic_SiPrefix + - symbol: StepBasic_SiUnit + - symbol: StepBasic_SiUnitAndAreaUnit + - symbol: StepBasic_SiUnitAndLengthUnit + - symbol: StepBasic_SiUnitAndMassUnit + - symbol: StepBasic_SiUnitAndPlaneAngleUnit + - symbol: StepBasic_SiUnitAndRatioUnit + - symbol: StepBasic_SiUnitAndSolidAngleUnit + - symbol: StepBasic_SiUnitAndThermodynamicTemperatureUnit + - symbol: StepBasic_SiUnitAndTimeUnit + - symbol: StepBasic_SiUnitAndVolumeUnit + - symbol: StepBasic_SiUnitName + - symbol: StepBasic_SizeMember + - symbol: StepBasic_SizeSelect + - symbol: StepBasic_SolidAngleMeasureWithUnit + - symbol: StepBasic_SolidAngleUnit + - symbol: StepBasic_Source + - symbol: StepBasic_SourceItem + - symbol: StepBasic_ThermodynamicTemperatureUnit + - symbol: StepBasic_TimeMeasureWithUnit + - symbol: StepBasic_TimeUnit + - symbol: StepBasic_UncertaintyMeasureWithUnit + - symbol: StepBasic_Unit + - symbol: StepBasic_VersionedActionRequest + - symbol: StepBasic_VolumeUnit + - symbol: StepBasic_WeekOfYearAndDayDate + - symbol: StepData + - symbol: StepData_Described + - symbol: StepData_ECDescr + - symbol: StepData_EDescr + - symbol: StepData_ESDescr + - symbol: StepData_EnumTool + - symbol: StepData_Factors + - symbol: StepData_Field + - symbol: StepData_FieldList + - symbol: StepData_FieldList1 + - symbol: StepData_FieldListD + - symbol: StepData_FieldListN + - symbol: StepData_FileProtocol + - symbol: StepData_FileRecognizer + - symbol: StepData_GlobalNodeOfWriterLib + - symbol: StepData_Logical + - symbol: StepData_NodeOfWriterLib + - symbol: StepData_PDescr + - symbol: StepData_Plex + - symbol: StepData_Protocol + - symbol: StepData_ReadWriteModule + - symbol: StepData_SelectArrReal + - symbol: StepData_SelectInt + - symbol: StepData_SelectMember + - symbol: StepData_SelectNamed + - symbol: StepData_SelectReal + - symbol: StepData_SelectType + - symbol: StepData_Simple + - symbol: StepData_StepDumper + - symbol: StepData_StepModel + - symbol: StepData_StepReaderTool + - symbol: StepData_StepWriter + - symbol: StepData_WriterLib + - symbol: StepDimTol_AngularityTolerance + - symbol: StepDimTol_AreaUnitType + - symbol: StepDimTol_CircularRunoutTolerance + - symbol: StepDimTol_CoaxialityTolerance + - symbol: StepDimTol_CommonDatum + - symbol: StepDimTol_ConcentricityTolerance + - symbol: StepDimTol_CylindricityTolerance + - symbol: StepDimTol_Datum + - symbol: StepDimTol_DatumFeature + - symbol: StepDimTol_DatumOrCommonDatum + - symbol: StepDimTol_DatumReference + - symbol: StepDimTol_DatumReferenceCompartment + - symbol: StepDimTol_DatumReferenceElement + - symbol: StepDimTol_DatumReferenceModifier + - symbol: StepDimTol_DatumReferenceModifierType + - symbol: StepDimTol_DatumReferenceModifierWithValue + - symbol: StepDimTol_DatumSystem + - symbol: StepDimTol_DatumSystemOrReference + - symbol: StepDimTol_DatumTarget + - symbol: StepDimTol_FlatnessTolerance + - symbol: StepDimTol_GeneralDatumReference + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRef + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMaxTol + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndGeoTolWthMod + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndModGeoTolAndPosTol + - symbol: StepDimTol_GeoTolAndGeoTolWthDatRefAndUneqDisGeoTol + - symbol: StepDimTol_GeoTolAndGeoTolWthMaxTol + - symbol: StepDimTol_GeoTolAndGeoTolWthMod + - symbol: StepDimTol_GeometricTolerance + - symbol: StepDimTol_GeometricToleranceModifier + - symbol: StepDimTol_GeometricToleranceRelationship + - symbol: StepDimTol_GeometricToleranceTarget + - symbol: StepDimTol_GeometricToleranceType + - symbol: StepDimTol_GeometricToleranceWithDatumReference + - symbol: StepDimTol_GeometricToleranceWithDefinedAreaUnit + - symbol: StepDimTol_GeometricToleranceWithDefinedUnit + - symbol: StepDimTol_GeometricToleranceWithMaximumTolerance + - symbol: StepDimTol_GeometricToleranceWithModifiers + - symbol: StepDimTol_LimitCondition + - symbol: StepDimTol_LineProfileTolerance + - symbol: StepDimTol_ModifiedGeometricTolerance + - symbol: StepDimTol_NonUniformZoneDefinition + - symbol: StepDimTol_ParallelismTolerance + - symbol: StepDimTol_PerpendicularityTolerance + - symbol: StepDimTol_PlacedDatumTargetFeature + - symbol: StepDimTol_PositionTolerance + - symbol: StepDimTol_ProjectedZoneDefinition + - symbol: StepDimTol_RoundnessTolerance + - symbol: StepDimTol_RunoutZoneDefinition + - symbol: StepDimTol_RunoutZoneOrientation + - symbol: StepDimTol_ShapeToleranceSelect + - symbol: StepDimTol_SimpleDatumReferenceModifier + - symbol: StepDimTol_SimpleDatumReferenceModifierMember + - symbol: StepDimTol_StraightnessTolerance + - symbol: StepDimTol_SurfaceProfileTolerance + - symbol: StepDimTol_SymmetryTolerance + - symbol: StepDimTol_ToleranceZone + - symbol: StepDimTol_ToleranceZoneDefinition + - symbol: StepDimTol_ToleranceZoneForm + - symbol: StepDimTol_ToleranceZoneTarget + - symbol: StepDimTol_TotalRunoutTolerance + - symbol: StepDimTol_UnequallyDisposedGeometricTolerance + - symbol: StepElement_AnalysisItemWithinRepresentation + - symbol: StepElement_Curve3dElementDescriptor + - symbol: StepElement_CurveEdge + - symbol: StepElement_CurveElementEndReleasePacket + - symbol: StepElement_CurveElementFreedom + - symbol: StepElement_CurveElementFreedomMember + - symbol: StepElement_CurveElementPurpose + - symbol: StepElement_CurveElementPurposeMember + - symbol: StepElement_CurveElementSectionDefinition + - symbol: StepElement_CurveElementSectionDerivedDefinitions + - symbol: StepElement_Element2dShape + - symbol: StepElement_ElementAspect + - symbol: StepElement_ElementAspectMember + - symbol: StepElement_ElementDescriptor + - symbol: StepElement_ElementMaterial + - symbol: StepElement_ElementOrder + - symbol: StepElement_ElementVolume + - symbol: StepElement_EnumeratedCurveElementFreedom + - symbol: StepElement_EnumeratedCurveElementPurpose + - symbol: StepElement_EnumeratedSurfaceElementPurpose + - symbol: StepElement_EnumeratedVolumeElementPurpose + - symbol: StepElement_MeasureOrUnspecifiedValue + - symbol: StepElement_MeasureOrUnspecifiedValueMember + - symbol: StepElement_Surface3dElementDescriptor + - symbol: StepElement_SurfaceElementProperty + - symbol: StepElement_SurfaceElementPurpose + - symbol: StepElement_SurfaceElementPurposeMember + - symbol: StepElement_SurfaceSection + - symbol: StepElement_SurfaceSectionField + - symbol: StepElement_SurfaceSectionFieldConstant + - symbol: StepElement_SurfaceSectionFieldVarying + - symbol: StepElement_UniformSurfaceSection + - symbol: StepElement_UnspecifiedValue + - symbol: StepElement_Volume3dElementDescriptor + - symbol: StepElement_Volume3dElementShape + - symbol: StepElement_VolumeElementPurpose + - symbol: StepElement_VolumeElementPurposeMember + - symbol: StepFEA_AlignedCurve3dElementCoordinateSystem + - symbol: StepFEA_AlignedSurface3dElementCoordinateSystem + - symbol: StepFEA_ArbitraryVolume3dElementCoordinateSystem + - symbol: StepFEA_ConstantSurface3dElementCoordinateSystem + - symbol: StepFEA_CoordinateSystemType + - symbol: StepFEA_Curve3dElementProperty + - symbol: StepFEA_Curve3dElementRepresentation + - symbol: StepFEA_CurveEdge + - symbol: StepFEA_CurveElementEndCoordinateSystem + - symbol: StepFEA_CurveElementEndOffset + - symbol: StepFEA_CurveElementEndRelease + - symbol: StepFEA_CurveElementInterval + - symbol: StepFEA_CurveElementIntervalConstant + - symbol: StepFEA_CurveElementIntervalLinearlyVarying + - symbol: StepFEA_CurveElementLocation + - symbol: StepFEA_DegreeOfFreedom + - symbol: StepFEA_DegreeOfFreedomMember + - symbol: StepFEA_DummyNode + - symbol: StepFEA_ElementGeometricRelationship + - symbol: StepFEA_ElementGroup + - symbol: StepFEA_ElementOrElementGroup + - symbol: StepFEA_ElementRepresentation + - symbol: StepFEA_ElementVolume + - symbol: StepFEA_EnumeratedDegreeOfFreedom + - symbol: StepFEA_FeaAreaDensity + - symbol: StepFEA_FeaAxis2Placement3d + - symbol: StepFEA_FeaCurveSectionGeometricRelationship + - symbol: StepFEA_FeaGroup + - symbol: StepFEA_FeaLinearElasticity + - symbol: StepFEA_FeaMassDensity + - symbol: StepFEA_FeaMaterialPropertyRepresentation + - symbol: StepFEA_FeaMaterialPropertyRepresentationItem + - symbol: StepFEA_FeaModel + - symbol: StepFEA_FeaModel3d + - symbol: StepFEA_FeaModelDefinition + - symbol: StepFEA_FeaMoistureAbsorption + - symbol: StepFEA_FeaParametricPoint + - symbol: StepFEA_FeaRepresentationItem + - symbol: StepFEA_FeaSecantCoefficientOfLinearThermalExpansion + - symbol: StepFEA_FeaShellBendingStiffness + - symbol: StepFEA_FeaShellMembraneBendingCouplingStiffness + - symbol: StepFEA_FeaShellMembraneStiffness + - symbol: StepFEA_FeaShellShearStiffness + - symbol: StepFEA_FeaSurfaceSectionGeometricRelationship + - symbol: StepFEA_FeaTangentialCoefficientOfLinearThermalExpansion + - symbol: StepFEA_FreedomAndCoefficient + - symbol: StepFEA_FreedomsList + - symbol: StepFEA_GeometricNode + - symbol: StepFEA_Node + - symbol: StepFEA_NodeDefinition + - symbol: StepFEA_NodeGroup + - symbol: StepFEA_NodeRepresentation + - symbol: StepFEA_NodeSet + - symbol: StepFEA_NodeWithSolutionCoordinateSystem + - symbol: StepFEA_NodeWithVector + - symbol: StepFEA_ParametricCurve3dElementCoordinateDirection + - symbol: StepFEA_ParametricCurve3dElementCoordinateSystem + - symbol: StepFEA_ParametricSurface3dElementCoordinateSystem + - symbol: StepFEA_Surface3dElementRepresentation + - symbol: StepFEA_SymmetricTensor22d + - symbol: StepFEA_SymmetricTensor23d + - symbol: StepFEA_SymmetricTensor23dMember + - symbol: StepFEA_SymmetricTensor42d + - symbol: StepFEA_SymmetricTensor43dMember + - symbol: StepFEA_UnspecifiedValue + - symbol: StepFEA_Volume3dElementRepresentation + - symbol: StepFile_ReadData + - symbol: StepGeom_Axis1Placement + - symbol: StepGeom_Axis2Placement + - symbol: StepGeom_Axis2Placement2d + - symbol: StepGeom_Axis2Placement3d + - symbol: StepGeom_BSplineCurve + - symbol: StepGeom_BSplineCurveForm + - symbol: StepGeom_BSplineCurveWithKnots + - symbol: StepGeom_BSplineCurveWithKnotsAndRationalBSplineCurve + - symbol: StepGeom_BSplineSurface + - symbol: StepGeom_BSplineSurfaceForm + - symbol: StepGeom_BSplineSurfaceWithKnots + - symbol: StepGeom_BSplineSurfaceWithKnotsAndRationalBSplineSurface + - symbol: StepGeom_BezierCurve + - symbol: StepGeom_BezierCurveAndRationalBSplineCurve + - symbol: StepGeom_BezierSurface + - symbol: StepGeom_BezierSurfaceAndRationalBSplineSurface + - symbol: StepGeom_BoundaryCurve + - symbol: StepGeom_BoundedCurve + - symbol: StepGeom_BoundedSurface + - symbol: StepGeom_CartesianPoint + - symbol: StepGeom_CartesianTransformationOperator + - symbol: StepGeom_CartesianTransformationOperator2d + - symbol: StepGeom_CartesianTransformationOperator3d + - symbol: StepGeom_Circle + - symbol: StepGeom_CompositeCurve + - symbol: StepGeom_CompositeCurveOnSurface + - symbol: StepGeom_CompositeCurveSegment + - symbol: StepGeom_Conic + - symbol: StepGeom_ConicalSurface + - symbol: StepGeom_Curve + - symbol: StepGeom_CurveBoundedSurface + - symbol: StepGeom_CurveOnSurface + - symbol: StepGeom_CurveReplica + - symbol: StepGeom_CylindricalSurface + - symbol: StepGeom_DegeneratePcurve + - symbol: StepGeom_DegenerateToroidalSurface + - symbol: StepGeom_Direction + - symbol: StepGeom_ElementarySurface + - symbol: StepGeom_Ellipse + - symbol: StepGeom_EvaluatedDegeneratePcurve + - symbol: StepGeom_GeomRepContextAndGlobUnitAssCtxAndGlobUncertaintyAssCtx + - symbol: StepGeom_GeometricRepresentationContext + - symbol: StepGeom_GeometricRepresentationContextAndGlobalUnitAssignedContext + - symbol: StepGeom_GeometricRepresentationContextAndParametricRepresentationContext + - symbol: StepGeom_GeometricRepresentationItem + - symbol: StepGeom_Hyperbola + - symbol: StepGeom_IntersectionCurve + - symbol: StepGeom_KnotType + - symbol: StepGeom_Line + - symbol: StepGeom_OffsetCurve3d + - symbol: StepGeom_OffsetSurface + - symbol: StepGeom_OrientedSurface + - symbol: StepGeom_OuterBoundaryCurve + - symbol: StepGeom_Parabola + - symbol: StepGeom_Pcurve + - symbol: StepGeom_PcurveOrSurface + - symbol: StepGeom_Placement + - symbol: StepGeom_Plane + - symbol: StepGeom_Point + - symbol: StepGeom_PointOnCurve + - symbol: StepGeom_PointOnSurface + - symbol: StepGeom_PointReplica + - symbol: StepGeom_Polyline + - symbol: StepGeom_PreferredSurfaceCurveRepresentation + - symbol: StepGeom_QuasiUniformCurve + - symbol: StepGeom_QuasiUniformCurveAndRationalBSplineCurve + - symbol: StepGeom_QuasiUniformSurface + - symbol: StepGeom_QuasiUniformSurfaceAndRationalBSplineSurface + - symbol: StepGeom_RationalBSplineCurve + - symbol: StepGeom_RationalBSplineSurface + - symbol: StepGeom_RectangularCompositeSurface + - symbol: StepGeom_RectangularTrimmedSurface + - symbol: StepGeom_ReparametrisedCompositeCurveSegment + - symbol: StepGeom_SeamCurve + - symbol: StepGeom_SphericalSurface + - symbol: StepGeom_SuParameters + - symbol: StepGeom_Surface + - symbol: StepGeom_SurfaceBoundary + - symbol: StepGeom_SurfaceCurve + - symbol: StepGeom_SurfaceCurveAndBoundedCurve + - symbol: StepGeom_SurfaceOfLinearExtrusion + - symbol: StepGeom_SurfaceOfRevolution + - symbol: StepGeom_SurfacePatch + - symbol: StepGeom_SurfaceReplica + - symbol: StepGeom_SweptSurface + - symbol: StepGeom_ToroidalSurface + - symbol: StepGeom_TransitionCode + - symbol: StepGeom_TrimmedCurve + - symbol: StepGeom_TrimmingMember + - symbol: StepGeom_TrimmingPreference + - symbol: StepGeom_TrimmingSelect + - symbol: StepGeom_UniformCurve + - symbol: StepGeom_UniformCurveAndRationalBSplineCurve + - symbol: StepGeom_UniformSurface + - symbol: StepGeom_UniformSurfaceAndRationalBSplineSurface + - symbol: StepGeom_Vector + - symbol: StepGeom_VectorOrDirection + - symbol: StepKinematics_ActuatedDirection + - symbol: StepKinematics_ActuatedKinPairAndOrderKinPair + - symbol: StepKinematics_ActuatedKinematicPair + - symbol: StepKinematics_ContextDependentKinematicLinkRepresentation + - symbol: StepKinematics_CylindricalPair + - symbol: StepKinematics_CylindricalPairValue + - symbol: StepKinematics_CylindricalPairWithRange + - symbol: StepKinematics_FullyConstrainedPair + - symbol: StepKinematics_GearPair + - symbol: StepKinematics_GearPairValue + - symbol: StepKinematics_GearPairWithRange + - symbol: StepKinematics_HighOrderKinematicPair + - symbol: StepKinematics_HomokineticPair + - symbol: StepKinematics_KinematicJoint + - symbol: StepKinematics_KinematicLink + - symbol: StepKinematics_KinematicLinkRepresentation + - symbol: StepKinematics_KinematicLinkRepresentationAssociation + - symbol: StepKinematics_KinematicPair + - symbol: StepKinematics_KinematicPropertyDefinitionRepresentation + - symbol: StepKinematics_KinematicPropertyMechanismRepresentation + - symbol: StepKinematics_KinematicTopologyDirectedStructure + - symbol: StepKinematics_KinematicTopologyNetworkStructure + - symbol: StepKinematics_KinematicTopologyRepresentationSelect + - symbol: StepKinematics_KinematicTopologyStructure + - symbol: StepKinematics_LinearFlexibleAndPinionPair + - symbol: StepKinematics_LinearFlexibleAndPlanarCurvePair + - symbol: StepKinematics_LinearFlexibleLinkRepresentation + - symbol: StepKinematics_LowOrderKinematicPair + - symbol: StepKinematics_LowOrderKinematicPairValue + - symbol: StepKinematics_LowOrderKinematicPairWithMotionCoupling + - symbol: StepKinematics_LowOrderKinematicPairWithRange + - symbol: StepKinematics_MechanismRepresentation + - symbol: StepKinematics_MechanismStateRepresentation + - symbol: StepKinematics_OrientedJoint + - symbol: StepKinematics_PairRepresentationRelationship + - symbol: StepKinematics_PairValue + - symbol: StepKinematics_PlanarCurvePair + - symbol: StepKinematics_PlanarCurvePairRange + - symbol: StepKinematics_PlanarPair + - symbol: StepKinematics_PlanarPairValue + - symbol: StepKinematics_PlanarPairWithRange + - symbol: StepKinematics_PointOnPlanarCurvePair + - symbol: StepKinematics_PointOnPlanarCurvePairValue + - symbol: StepKinematics_PointOnPlanarCurvePairWithRange + - symbol: StepKinematics_PointOnSurfacePair + - symbol: StepKinematics_PointOnSurfacePairValue + - symbol: StepKinematics_PointOnSurfacePairWithRange + - symbol: StepKinematics_PrismaticPair + - symbol: StepKinematics_PrismaticPairValue + - symbol: StepKinematics_PrismaticPairWithRange + - symbol: StepKinematics_ProductDefinitionKinematics + - symbol: StepKinematics_ProductDefinitionRelationshipKinematics + - symbol: StepKinematics_RackAndPinionPair + - symbol: StepKinematics_RackAndPinionPairValue + - symbol: StepKinematics_RackAndPinionPairWithRange + - symbol: StepKinematics_RevolutePair + - symbol: StepKinematics_RevolutePairValue + - symbol: StepKinematics_RevolutePairWithRange + - symbol: StepKinematics_RigidLinkRepresentation + - symbol: StepKinematics_RigidPlacement + - symbol: StepKinematics_RollingCurvePair + - symbol: StepKinematics_RollingCurvePairValue + - symbol: StepKinematics_RollingSurfacePair + - symbol: StepKinematics_RollingSurfacePairValue + - symbol: StepKinematics_RotationAboutDirection + - symbol: StepKinematics_ScrewPair + - symbol: StepKinematics_ScrewPairValue + - symbol: StepKinematics_ScrewPairWithRange + - symbol: StepKinematics_SlidingCurvePair + - symbol: StepKinematics_SlidingCurvePairValue + - symbol: StepKinematics_SlidingSurfacePair + - symbol: StepKinematics_SlidingSurfacePairValue + - symbol: StepKinematics_SpatialRotation + - symbol: StepKinematics_SphericalPair + - symbol: StepKinematics_SphericalPairSelect + - symbol: StepKinematics_SphericalPairValue + - symbol: StepKinematics_SphericalPairWithPin + - symbol: StepKinematics_SphericalPairWithPinAndRange + - symbol: StepKinematics_SphericalPairWithRange + - symbol: StepKinematics_SurfacePair + - symbol: StepKinematics_SurfacePairWithRange + - symbol: StepKinematics_UniversalPair + - symbol: StepKinematics_UniversalPairValue + - symbol: StepKinematics_UniversalPairWithRange + - symbol: StepRepr_AllAroundShapeAspect + - symbol: StepRepr_Apex + - symbol: StepRepr_AssemblyComponentUsage + - symbol: StepRepr_AssemblyComponentUsageSubstitute + - symbol: StepRepr_BetweenShapeAspect + - symbol: StepRepr_BooleanRepresentationItem + - symbol: StepRepr_CentreOfSymmetry + - symbol: StepRepr_CharacterizedDefinition + - symbol: StepRepr_CharacterizedRepresentation + - symbol: StepRepr_CompGroupShAspAndCompShAspAndDatumFeatAndShAsp + - symbol: StepRepr_CompShAspAndDatumFeatAndShAsp + - symbol: StepRepr_CompositeGroupShapeAspect + - symbol: StepRepr_CompositeShapeAspect + - symbol: StepRepr_CompoundRepresentationItem + - symbol: StepRepr_ConfigurationDesign + - symbol: StepRepr_ConfigurationDesignItem + - symbol: StepRepr_ConfigurationEffectivity + - symbol: StepRepr_ConfigurationItem + - symbol: StepRepr_ConstructiveGeometryRepresentation + - symbol: StepRepr_ConstructiveGeometryRepresentationRelationship + - symbol: StepRepr_ContinuosShapeAspect + - symbol: StepRepr_DataEnvironment + - symbol: StepRepr_DefinitionalRepresentation + - symbol: StepRepr_DerivedShapeAspect + - symbol: StepRepr_DescriptiveRepresentationItem + - symbol: StepRepr_Extension + - symbol: StepRepr_ExternallyDefinedRepresentation + - symbol: StepRepr_FeatureForDatumTargetRelationship + - symbol: StepRepr_FunctionallyDefinedTransformation + - symbol: StepRepr_GeometricAlignment + - symbol: StepRepr_GlobalUncertaintyAssignedContext + - symbol: StepRepr_GlobalUnitAssignedContext + - symbol: StepRepr_IntegerRepresentationItem + - symbol: StepRepr_ItemDefinedTransformation + - symbol: StepRepr_MakeFromUsageOption + - symbol: StepRepr_MappedItem + - symbol: StepRepr_MaterialDesignation + - symbol: StepRepr_MaterialProperty + - symbol: StepRepr_MaterialPropertyRepresentation + - symbol: StepRepr_MeasureRepresentationItem + - symbol: StepRepr_MechanicalDesignAndDraughtingRelationship + - symbol: StepRepr_NextAssemblyUsageOccurrence + - symbol: StepRepr_ParallelOffset + - symbol: StepRepr_ParametricRepresentationContext + - symbol: StepRepr_PerpendicularTo + - symbol: StepRepr_ProductConcept + - symbol: StepRepr_ProductDefinitionShape + - symbol: StepRepr_ProductDefinitionUsage + - symbol: StepRepr_PromissoryUsageOccurrence + - symbol: StepRepr_PropertyDefinition + - symbol: StepRepr_PropertyDefinitionRelationship + - symbol: StepRepr_PropertyDefinitionRepresentation + - symbol: StepRepr_QuantifiedAssemblyComponentUsage + - symbol: StepRepr_RealRepresentationItem + - symbol: StepRepr_ReprItemAndLengthMeasureWithUnit + - symbol: StepRepr_ReprItemAndLengthMeasureWithUnitAndQRI + - symbol: StepRepr_ReprItemAndMeasureWithUnit + - symbol: StepRepr_ReprItemAndMeasureWithUnitAndQRI + - symbol: StepRepr_ReprItemAndPlaneAngleMeasureWithUnit + - symbol: StepRepr_ReprItemAndPlaneAngleMeasureWithUnitAndQRI + - symbol: StepRepr_Representation + - symbol: StepRepr_RepresentationContext + - symbol: StepRepr_RepresentationContextReference + - symbol: StepRepr_RepresentationItem + - symbol: StepRepr_RepresentationMap + - symbol: StepRepr_RepresentationOrRepresentationReference + - symbol: StepRepr_RepresentationReference + - symbol: StepRepr_RepresentationRelationship + - symbol: StepRepr_RepresentationRelationshipWithTransformation + - symbol: StepRepr_RepresentedDefinition + - symbol: StepRepr_ShapeAspect + - symbol: StepRepr_ShapeAspectDerivingRelationship + - symbol: StepRepr_ShapeAspectRelationship + - symbol: StepRepr_ShapeAspectTransition + - symbol: StepRepr_ShapeDefinition + - symbol: StepRepr_ShapeRepresentationRelationship + - symbol: StepRepr_ShapeRepresentationRelationshipWithTransformation + - symbol: StepRepr_SpecifiedHigherUsageOccurrence + - symbol: StepRepr_StructuralResponseProperty + - symbol: StepRepr_StructuralResponsePropertyDefinitionRepresentation + - symbol: StepRepr_SuppliedPartRelationship + - symbol: StepRepr_Tangent + - symbol: StepRepr_Transformation + - symbol: StepRepr_ValueRange + - symbol: StepRepr_ValueRepresentationItem + - symbol: StepSelect_Activator + - symbol: StepSelect_FileModifier + - symbol: StepSelect_FloatFormat + - symbol: StepSelect_ModelModifier + - symbol: StepSelect_StepType + - symbol: StepSelect_WorkLibrary + - symbol: StepShape_AdvancedBrepShapeRepresentation + - symbol: StepShape_AdvancedFace + - symbol: StepShape_AngleRelator + - symbol: StepShape_AngularLocation + - symbol: StepShape_AngularSize + - symbol: StepShape_Block + - symbol: StepShape_BooleanOperand + - symbol: StepShape_BooleanOperator + - symbol: StepShape_BooleanResult + - symbol: StepShape_BoxDomain + - symbol: StepShape_BoxedHalfSpace + - symbol: StepShape_BrepWithVoids + - symbol: StepShape_ClosedShell + - symbol: StepShape_CompoundShapeRepresentation + - symbol: StepShape_ConnectedEdgeSet + - symbol: StepShape_ConnectedFaceSet + - symbol: StepShape_ConnectedFaceShapeRepresentation + - symbol: StepShape_ConnectedFaceSubSet + - symbol: StepShape_ContextDependentShapeRepresentation + - symbol: StepShape_CsgPrimitive + - symbol: StepShape_CsgSelect + - symbol: StepShape_CsgShapeRepresentation + - symbol: StepShape_CsgSolid + - symbol: StepShape_DefinitionalRepresentationAndShapeRepresentation + - symbol: StepShape_DimensionalCharacteristic + - symbol: StepShape_DimensionalCharacteristicRepresentation + - symbol: StepShape_DimensionalLocation + - symbol: StepShape_DimensionalLocationWithPath + - symbol: StepShape_DimensionalSize + - symbol: StepShape_DimensionalSizeWithPath + - symbol: StepShape_DirectedDimensionalLocation + - symbol: StepShape_Edge + - symbol: StepShape_EdgeBasedWireframeModel + - symbol: StepShape_EdgeBasedWireframeShapeRepresentation + - symbol: StepShape_EdgeCurve + - symbol: StepShape_EdgeLoop + - symbol: StepShape_ExtrudedAreaSolid + - symbol: StepShape_ExtrudedFaceSolid + - symbol: StepShape_Face + - symbol: StepShape_FaceBasedSurfaceModel + - symbol: StepShape_FaceBound + - symbol: StepShape_FaceOuterBound + - symbol: StepShape_FaceSurface + - symbol: StepShape_FacetedBrep + - symbol: StepShape_FacetedBrepAndBrepWithVoids + - symbol: StepShape_FacetedBrepShapeRepresentation + - symbol: StepShape_GeometricCurveSet + - symbol: StepShape_GeometricSet + - symbol: StepShape_GeometricSetSelect + - symbol: StepShape_GeometricallyBoundedSurfaceShapeRepresentation + - symbol: StepShape_GeometricallyBoundedWireframeShapeRepresentation + - symbol: StepShape_HalfSpaceSolid + - symbol: StepShape_LimitsAndFits + - symbol: StepShape_Loop + - symbol: StepShape_LoopAndPath + - symbol: StepShape_ManifoldSolidBrep + - symbol: StepShape_ManifoldSurfaceShapeRepresentation + - symbol: StepShape_MeasureQualification + - symbol: StepShape_MeasureRepresentationItemAndQualifiedRepresentationItem + - symbol: StepShape_NonManifoldSurfaceShapeRepresentation + - symbol: StepShape_OpenShell + - symbol: StepShape_OrientedClosedShell + - symbol: StepShape_OrientedEdge + - symbol: StepShape_OrientedFace + - symbol: StepShape_OrientedOpenShell + - symbol: StepShape_OrientedPath + - symbol: StepShape_Path + - symbol: StepShape_PlusMinusTolerance + - symbol: StepShape_PointRepresentation + - symbol: StepShape_PolyLoop + - symbol: StepShape_PrecisionQualifier + - symbol: StepShape_QualifiedRepresentationItem + - symbol: StepShape_ReversibleTopologyItem + - symbol: StepShape_RevolvedAreaSolid + - symbol: StepShape_RevolvedFaceSolid + - symbol: StepShape_RightAngularWedge + - symbol: StepShape_RightCircularCone + - symbol: StepShape_RightCircularCylinder + - symbol: StepShape_SeamEdge + - symbol: StepShape_ShapeDefinitionRepresentation + - symbol: StepShape_ShapeDimensionRepresentation + - symbol: StepShape_ShapeDimensionRepresentationItem + - symbol: StepShape_ShapeRepresentation + - symbol: StepShape_ShapeRepresentationWithParameters + - symbol: StepShape_Shell + - symbol: StepShape_ShellBasedSurfaceModel + - symbol: StepShape_SolidModel + - symbol: StepShape_SolidReplica + - symbol: StepShape_Sphere + - symbol: StepShape_Subedge + - symbol: StepShape_Subface + - symbol: StepShape_SurfaceModel + - symbol: StepShape_SweptAreaSolid + - symbol: StepShape_SweptFaceSolid + - symbol: StepShape_ToleranceMethodDefinition + - symbol: StepShape_ToleranceValue + - symbol: StepShape_TopologicalRepresentationItem + - symbol: StepShape_Torus + - symbol: StepShape_TransitionalShapeRepresentation + - symbol: StepShape_TypeQualifier + - symbol: StepShape_ValueFormatTypeQualifier + - symbol: StepShape_ValueQualifier + - symbol: StepShape_Vertex + - symbol: StepShape_VertexLoop + - symbol: StepShape_VertexPoint + - symbol: StepTidy_DuplicateCleaner + - symbol: StepToGeom + - symbol: StepToTopoDS + - symbol: StepToTopoDS_Builder + - symbol: StepToTopoDS_BuilderError + - symbol: StepToTopoDS_GeometricTool + - symbol: StepToTopoDS_GeometricToolError + - symbol: StepToTopoDS_MakeTransformed + - symbol: StepToTopoDS_NMTool + - symbol: StepToTopoDS_PointPair + - symbol: StepToTopoDS_Root + - symbol: StepToTopoDS_Tool + - symbol: StepToTopoDS_TranslateCompositeCurve + - symbol: StepToTopoDS_TranslateCurveBoundedSurface + - symbol: StepToTopoDS_TranslateEdge + - symbol: StepToTopoDS_TranslateEdgeError + - symbol: StepToTopoDS_TranslateEdgeLoop + - symbol: StepToTopoDS_TranslateEdgeLoopError + - symbol: StepToTopoDS_TranslateFaceError + - symbol: StepToTopoDS_TranslatePolyLoop + - symbol: StepToTopoDS_TranslatePolyLoopError + - symbol: StepToTopoDS_TranslateShell + - symbol: StepToTopoDS_TranslateShellError + - symbol: StepToTopoDS_TranslateSolid + - symbol: StepToTopoDS_TranslateSolidError + - symbol: StepToTopoDS_TranslateVertex + - symbol: StepToTopoDS_TranslateVertexError + - symbol: StepToTopoDS_TranslateVertexLoop + - symbol: StepToTopoDS_TranslateVertexLoopError + - symbol: StepVisual_AnnotationCurveOccurrence + - symbol: StepVisual_AnnotationCurveOccurrenceAndGeomReprItem + - symbol: StepVisual_AnnotationFillArea + - symbol: StepVisual_AnnotationFillAreaOccurrence + - symbol: StepVisual_AnnotationOccurrence + - symbol: StepVisual_AnnotationPlane + - symbol: StepVisual_AnnotationPlaneElement + - symbol: StepVisual_AnnotationText + - symbol: StepVisual_AnnotationTextOccurrence + - symbol: StepVisual_AreaInSet + - symbol: StepVisual_AreaOrView + - symbol: StepVisual_BackgroundColour + - symbol: StepVisual_BoxCharacteristicSelect + - symbol: StepVisual_CameraImage + - symbol: StepVisual_CameraImage2dWithScale + - symbol: StepVisual_CameraImage3dWithScale + - symbol: StepVisual_CameraModel + - symbol: StepVisual_CameraModelD2 + - symbol: StepVisual_CameraModelD3 + - symbol: StepVisual_CameraModelD3MultiClipping + - symbol: StepVisual_CameraModelD3MultiClippingInterectionSelect + - symbol: StepVisual_CameraModelD3MultiClippingIntersection + - symbol: StepVisual_CameraModelD3MultiClippingUnion + - symbol: StepVisual_CameraModelD3MultiClippingUnionSelect + - symbol: StepVisual_CameraUsage + - symbol: StepVisual_CentralOrParallel + - symbol: StepVisual_CharacterizedObjAndRepresentationAndDraughtingModel + - symbol: StepVisual_Colour + - symbol: StepVisual_ColourRgb + - symbol: StepVisual_ColourSpecification + - symbol: StepVisual_ComplexTriangulatedFace + - symbol: StepVisual_ComplexTriangulatedSurfaceSet + - symbol: StepVisual_CompositeText + - symbol: StepVisual_CompositeTextWithExtent + - symbol: StepVisual_ContextDependentInvisibility + - symbol: StepVisual_ContextDependentOverRidingStyledItem + - symbol: StepVisual_CoordinatesList + - symbol: StepVisual_CubicBezierTessellatedEdge + - symbol: StepVisual_CubicBezierTriangulatedFace + - symbol: StepVisual_CurveStyle + - symbol: StepVisual_CurveStyleFont + - symbol: StepVisual_CurveStyleFontPattern + - symbol: StepVisual_CurveStyleFontSelect + - symbol: StepVisual_DirectionCountSelect + - symbol: StepVisual_DraughtingAnnotationOccurrence + - symbol: StepVisual_DraughtingCallout + - symbol: StepVisual_DraughtingCalloutElement + - symbol: StepVisual_DraughtingModel + - symbol: StepVisual_DraughtingPreDefinedColour + - symbol: StepVisual_DraughtingPreDefinedCurveFont + - symbol: StepVisual_EdgeOrCurve + - symbol: StepVisual_ExternallyDefinedCurveFont + - symbol: StepVisual_ExternallyDefinedTextFont + - symbol: StepVisual_FaceOrSurface + - symbol: StepVisual_FillAreaStyle + - symbol: StepVisual_FillAreaStyleColour + - symbol: StepVisual_FillStyleSelect + - symbol: StepVisual_FontSelect + - symbol: StepVisual_Invisibility + - symbol: StepVisual_InvisibilityContext + - symbol: StepVisual_InvisibleItem + - symbol: StepVisual_LayeredItem + - symbol: StepVisual_MarkerMember + - symbol: StepVisual_MarkerSelect + - symbol: StepVisual_MarkerType + - symbol: StepVisual_MechanicalDesignGeometricPresentationArea + - symbol: StepVisual_MechanicalDesignGeometricPresentationRepresentation + - symbol: StepVisual_NullStyle + - symbol: StepVisual_NullStyleMember + - symbol: StepVisual_OverRidingStyledItem + - symbol: StepVisual_PathOrCompositeCurve + - symbol: StepVisual_PlanarBox + - symbol: StepVisual_PlanarExtent + - symbol: StepVisual_PointStyle + - symbol: StepVisual_PreDefinedColour + - symbol: StepVisual_PreDefinedCurveFont + - symbol: StepVisual_PreDefinedItem + - symbol: StepVisual_PreDefinedTextFont + - symbol: StepVisual_PresentationArea + - symbol: StepVisual_PresentationLayerAssignment + - symbol: StepVisual_PresentationLayerUsage + - symbol: StepVisual_PresentationRepresentation + - symbol: StepVisual_PresentationRepresentationSelect + - symbol: StepVisual_PresentationSet + - symbol: StepVisual_PresentationSize + - symbol: StepVisual_PresentationSizeAssignmentSelect + - symbol: StepVisual_PresentationStyleAssignment + - symbol: StepVisual_PresentationStyleByContext + - symbol: StepVisual_PresentationStyleSelect + - symbol: StepVisual_PresentationView + - symbol: StepVisual_PresentedItem + - symbol: StepVisual_PresentedItemRepresentation + - symbol: StepVisual_RenderingPropertiesSelect + - symbol: StepVisual_RepositionedTessellatedGeometricSet + - symbol: StepVisual_RepositionedTessellatedItem + - symbol: StepVisual_ShadingSurfaceMethod + - symbol: StepVisual_StyleContextSelect + - symbol: StepVisual_StyledItem + - symbol: StepVisual_StyledItemTarget + - symbol: StepVisual_SurfaceSide + - symbol: StepVisual_SurfaceSideStyle + - symbol: StepVisual_SurfaceStyleBoundary + - symbol: StepVisual_SurfaceStyleControlGrid + - symbol: StepVisual_SurfaceStyleElementSelect + - symbol: StepVisual_SurfaceStyleFillArea + - symbol: StepVisual_SurfaceStyleParameterLine + - symbol: StepVisual_SurfaceStyleReflectanceAmbient + - symbol: StepVisual_SurfaceStyleReflectanceAmbientDiffuse + - symbol: StepVisual_SurfaceStyleReflectanceAmbientDiffuseSpecular + - symbol: StepVisual_SurfaceStyleRendering + - symbol: StepVisual_SurfaceStyleRenderingWithProperties + - symbol: StepVisual_SurfaceStyleSegmentationCurve + - symbol: StepVisual_SurfaceStyleSilhouette + - symbol: StepVisual_SurfaceStyleTransparent + - symbol: StepVisual_SurfaceStyleUsage + - symbol: StepVisual_Template + - symbol: StepVisual_TemplateInstance + - symbol: StepVisual_TessellatedAnnotationOccurrence + - symbol: StepVisual_TessellatedConnectingEdge + - symbol: StepVisual_TessellatedCurveSet + - symbol: StepVisual_TessellatedEdge + - symbol: StepVisual_TessellatedEdgeOrVertex + - symbol: StepVisual_TessellatedFace + - symbol: StepVisual_TessellatedGeometricSet + - symbol: StepVisual_TessellatedItem + - symbol: StepVisual_TessellatedPointSet + - symbol: StepVisual_TessellatedShapeRepresentation + - symbol: StepVisual_TessellatedShapeRepresentationWithAccuracyParameters + - symbol: StepVisual_TessellatedShell + - symbol: StepVisual_TessellatedSolid + - symbol: StepVisual_TessellatedStructuredItem + - symbol: StepVisual_TessellatedSurfaceSet + - symbol: StepVisual_TessellatedVertex + - symbol: StepVisual_TessellatedWire + - symbol: StepVisual_TextLiteral + - symbol: StepVisual_TextOrCharacter + - symbol: StepVisual_TextPath + - symbol: StepVisual_TextStyle + - symbol: StepVisual_TextStyleForDefinedFont + - symbol: StepVisual_TextStyleWithBoxCharacteristics + - symbol: StepVisual_TriangulatedFace + - symbol: StepVisual_TriangulatedSurfaceSet + - symbol: StepVisual_ViewVolume + - symbol: StlAPI + - symbol: StlAPI_Reader + - symbol: StlAPI_Writer + - symbol: Storage + - symbol: Storage_Bucket + - symbol: Storage_BucketIterator + - symbol: Storage_BucketOfPersistent + - symbol: Storage_CallBack + - symbol: Storage_Data + - symbol: Storage_DefaultCallBack + - symbol: Storage_Error + - symbol: Storage_HeaderData + - symbol: Storage_InternalData + - symbol: Storage_OpenMode + - symbol: Storage_Root + - symbol: Storage_RootData + - symbol: Storage_Schema + - symbol: Storage_SolveMode + - symbol: Storage_StreamExtCharParityError + - symbol: Storage_StreamFormatError + - symbol: Storage_StreamModeError + - symbol: Storage_StreamReadError + - symbol: Storage_StreamTypeMismatchError + - symbol: Storage_StreamUnknownTypeError + - symbol: Storage_StreamWriteError + - symbol: Storage_TypeData + - symbol: Storage_TypedCallBack + - symbol: Sweep_NumShape + - symbol: Sweep_NumShapeIterator + - symbol: Sweep_NumShapeTool + - symbol: TColStd_HPackedMapOfInteger + - symbol: TCollection + - symbol: TCollection_AsciiString + - symbol: TCollection_ExtendedString + - symbol: TCollection_HAsciiString + - symbol: TCollection_HExtendedString + - symbol: TDF + - symbol: TDF_Attribute + - symbol: TDF_AttributeDelta + - symbol: TDF_AttributeIterator + - symbol: TDF_ChildIDIterator + - symbol: TDF_ChildIterator + - symbol: TDF_ClosureMode + - symbol: TDF_ClosureTool + - symbol: TDF_ComparisonTool + - symbol: TDF_CopyLabel + - symbol: TDF_CopyTool + - symbol: TDF_Data + - symbol: TDF_DataSet + - symbol: TDF_DefaultDeltaOnModification + - symbol: TDF_DefaultDeltaOnRemoval + - symbol: TDF_Delta + - symbol: TDF_DeltaOnAddition + - symbol: TDF_DeltaOnForget + - symbol: TDF_DeltaOnModification + - symbol: TDF_DeltaOnRemoval + - symbol: TDF_DeltaOnResume + - symbol: TDF_IDFilter + - symbol: TDF_Label + - symbol: TDF_Reference + - symbol: TDF_RelocationTable + - symbol: TDF_TagSource + - symbol: TDF_Tool + - symbol: TDF_Transaction + - symbol: TDataStd + - symbol: TDataStd_AsciiString + - symbol: TDataStd_BooleanArray + - symbol: TDataStd_BooleanList + - symbol: TDataStd_ByteArray + - symbol: TDataStd_ChildNodeIterator + - symbol: TDataStd_Comment + - symbol: TDataStd_Current + - symbol: TDataStd_DeltaOnModificationOfByteArray + - symbol: TDataStd_DeltaOnModificationOfExtStringArray + - symbol: TDataStd_DeltaOnModificationOfIntArray + - symbol: TDataStd_DeltaOnModificationOfIntPackedMap + - symbol: TDataStd_DeltaOnModificationOfRealArray + - symbol: TDataStd_Directory + - symbol: TDataStd_Expression + - symbol: TDataStd_ExtStringArray + - symbol: TDataStd_ExtStringList + - symbol: TDataStd_GenericEmpty + - symbol: TDataStd_GenericExtString + - symbol: TDataStd_HDataMapOfStringByte + - symbol: TDataStd_HDataMapOfStringHArray1OfInteger + - symbol: TDataStd_HDataMapOfStringHArray1OfReal + - symbol: TDataStd_HDataMapOfStringInteger + - symbol: TDataStd_HDataMapOfStringReal + - symbol: TDataStd_HDataMapOfStringString + - symbol: TDataStd_IntPackedMap + - symbol: TDataStd_Integer + - symbol: TDataStd_IntegerArray + - symbol: TDataStd_IntegerList + - symbol: TDataStd_Name + - symbol: TDataStd_NamedData + - symbol: TDataStd_NoteBook + - symbol: TDataStd_Real + - symbol: TDataStd_RealArray + - symbol: TDataStd_RealEnum + - symbol: TDataStd_RealList + - symbol: TDataStd_ReferenceArray + - symbol: TDataStd_ReferenceList + - symbol: TDataStd_Relation + - symbol: TDataStd_Tick + - symbol: TDataStd_TreeNode + - symbol: TDataStd_UAttribute + - symbol: TDataStd_Variable + - symbol: TDataXtd + - symbol: TDataXtd_Axis + - symbol: TDataXtd_Constraint + - symbol: TDataXtd_ConstraintEnum + - symbol: TDataXtd_Geometry + - symbol: TDataXtd_GeometryEnum + - symbol: TDataXtd_Pattern + - symbol: TDataXtd_PatternStd + - symbol: TDataXtd_Placement + - symbol: TDataXtd_Plane + - symbol: TDataXtd_Point + - symbol: TDataXtd_Position + - symbol: TDataXtd_Presentation + - symbol: TDataXtd_Shape + - symbol: TDataXtd_Triangulation + - symbol: TDocStd + - symbol: TDocStd_Application + - symbol: TDocStd_ApplicationDelta + - symbol: TDocStd_CompoundDelta + - symbol: TDocStd_Context + - symbol: TDocStd_Document + - symbol: TDocStd_FormatVersion + - symbol: TDocStd_Modified + - symbol: TDocStd_MultiTransactionManager + - symbol: TDocStd_Owner + - symbol: TDocStd_PathParser + - symbol: TDocStd_XLink + - symbol: TDocStd_XLinkIterator + - symbol: TDocStd_XLinkRoot + - symbol: TDocStd_XLinkTool + - symbol: TFunction_Driver + - symbol: TFunction_DriverTable + - symbol: TFunction_ExecutionStatus + - symbol: TFunction_Function + - symbol: TFunction_GraphNode + - symbol: TFunction_IFunction + - symbol: TFunction_Iterator + - symbol: TFunction_Logbook + - symbol: TFunction_Scope + - symbol: TNaming + - symbol: TNaming_Builder + - symbol: TNaming_CopyShape + - symbol: TNaming_DeltaOnModification + - symbol: TNaming_DeltaOnRemoval + - symbol: TNaming_Evolution + - symbol: TNaming_Identifier + - symbol: TNaming_Iterator + - symbol: TNaming_IteratorOnShapesSet + - symbol: TNaming_Localizer + - symbol: TNaming_Name + - symbol: TNaming_NameType + - symbol: TNaming_NamedShape + - symbol: TNaming_Naming + - symbol: TNaming_NamingTool + - symbol: TNaming_NewShapeIterator + - symbol: TNaming_OldShapeIterator + - symbol: TNaming_RefShape + - symbol: TNaming_SameShapeIterator + - symbol: TNaming_Scope + - symbol: TNaming_Selector + - symbol: TNaming_ShapesSet + - symbol: TNaming_Tool + - symbol: TNaming_TranslateTool + - symbol: TNaming_Translator + - symbol: TNaming_UsedShapes + - symbol: TopAbs + - symbol: TopAbs_Orientation + - symbol: TopAbs_ShapeEnum + - symbol: TopAbs_State + - symbol: TopBas_TestInterference + - symbol: TopCnx_EdgeFaceTransition + - symbol: TopExp + - symbol: TopExp_Explorer + - symbol: TopLoc_Datum3D + - symbol: TopLoc_ItemLocation + - symbol: TopLoc_Location + - symbol: TopLoc_SListNodeOfItemLocation + - symbol: TopLoc_SListOfItemLocation + - symbol: TopTools + - symbol: TopTools_FormatVersion + - symbol: TopTools_LocationSet + - symbol: TopTools_ShapeMapHasher + - symbol: TopTools_ShapeSet + - symbol: TopTrans_CurveTransition + - symbol: TopTrans_SurfaceTransition + - symbol: TopoDSToStep + - symbol: TopoDSToStep_Builder + - symbol: TopoDSToStep_BuilderError + - symbol: TopoDSToStep_FacetedError + - symbol: TopoDSToStep_FacetedTool + - symbol: TopoDSToStep_MakeBrepWithVoids + - symbol: TopoDSToStep_MakeEdgeError + - symbol: TopoDSToStep_MakeFaceError + - symbol: TopoDSToStep_MakeFacetedBrep + - symbol: TopoDSToStep_MakeFacetedBrepAndBrepWithVoids + - symbol: TopoDSToStep_MakeGeometricCurveSet + - symbol: TopoDSToStep_MakeManifoldSolidBrep + - symbol: TopoDSToStep_MakeShellBasedSurfaceModel + - symbol: TopoDSToStep_MakeStepEdge + - symbol: TopoDSToStep_MakeStepFace + - symbol: TopoDSToStep_MakeStepVertex + - symbol: TopoDSToStep_MakeStepWire + - symbol: TopoDSToStep_MakeTessellatedItem + - symbol: TopoDSToStep_MakeVertexError + - symbol: TopoDSToStep_MakeWireError + - symbol: TopoDSToStep_Root + - symbol: TopoDSToStep_Tool + - symbol: TopoDSToStep_WireframeBuilder + - symbol: TopoDS_AlertAttribute + - symbol: TopoDS_AlertWithShape + - symbol: TopoDS_Builder + - symbol: TopoDS_CompSolid + - symbol: TopoDS_Compound + - symbol: TopoDS_Edge + - symbol: TopoDS_Face + - symbol: TopoDS_FrozenShape + - symbol: TopoDS_HShape + - symbol: TopoDS_Iterator + - symbol: TopoDS_LockedShape + - symbol: TopoDS_Shape + - symbol: TopoDS_Shell + - symbol: TopoDS_Solid + - symbol: TopoDS_TCompSolid + - symbol: TopoDS_TCompound + - symbol: TopoDS_TEdge + - symbol: TopoDS_TFace + - symbol: TopoDS_TShape + - symbol: TopoDS_TShell + - symbol: TopoDS_TSolid + - symbol: TopoDS_TVertex + - symbol: TopoDS_TWire + - symbol: TopoDS_UnCompatibleShapes + - symbol: TopoDS_Vertex + - symbol: TopoDS_Wire + - symbol: TransferBRep_BinderOfShape + - symbol: TransferBRep_Reader + - symbol: TransferBRep_ShapeBinder + - symbol: TransferBRep_ShapeInfo + - symbol: TransferBRep_ShapeListBinder + - symbol: TransferBRep_ShapeMapper + - symbol: TransferBRep_TransferResultInfo + - symbol: Transfer_ActorDispatch + - symbol: Transfer_ActorOfFinderProcess + - symbol: Transfer_ActorOfProcessForFinder + - symbol: Transfer_ActorOfProcessForTransient + - symbol: Transfer_ActorOfTransientProcess + - symbol: Transfer_Binder + - symbol: Transfer_BinderOfTransientInteger + - symbol: Transfer_DataInfo + - symbol: Transfer_DispatchControl + - symbol: Transfer_FindHasher + - symbol: Transfer_Finder + - symbol: Transfer_FinderProcess + - symbol: Transfer_IteratorOfProcessForFinder + - symbol: Transfer_IteratorOfProcessForTransient + - symbol: Transfer_MapContainer + - symbol: Transfer_MultipleBinder + - symbol: Transfer_ProcessForFinder + - symbol: Transfer_ProcessForTransient + - symbol: Transfer_ResultFromModel + - symbol: Transfer_ResultFromTransient + - symbol: Transfer_SimpleBinderOfTransient + - symbol: Transfer_StatusExec + - symbol: Transfer_StatusResult + - symbol: Transfer_TransferDeadLoop + - symbol: Transfer_TransferDispatch + - symbol: Transfer_TransferFailure + - symbol: Transfer_TransferInput + - symbol: Transfer_TransferIterator + - symbol: Transfer_TransferOutput + - symbol: Transfer_TransientListBinder + - symbol: Transfer_TransientMapper + - symbol: Transfer_TransientProcess + - symbol: Transfer_UndefMode + - symbol: Transfer_VoidBinder + - symbol: Units + - symbol: UnitsAPI + - symbol: UnitsAPI_SystemUnits + - symbol: UnitsMethods + - symbol: UnitsMethods_LengthUnit + - symbol: Units_Dimensions + - symbol: Units_Explorer + - symbol: Units_Lexicon + - symbol: Units_MathSentence + - symbol: Units_Measurement + - symbol: Units_NoSuchType + - symbol: Units_NoSuchUnit + - symbol: Units_Quantity + - symbol: Units_Sentence + - symbol: Units_ShiftedToken + - symbol: Units_ShiftedUnit + - symbol: Units_Token + - symbol: Units_Unit + - symbol: Units_UnitSentence + - symbol: Units_UnitsDictionary + - symbol: Units_UnitsLexicon + - symbol: Units_UnitsSystem + - symbol: XCAFApp_Application + - symbol: XCAFDimTolObjects_AngularQualifier + - symbol: XCAFDimTolObjects_DatumModifWithValue + - symbol: XCAFDimTolObjects_DatumObject + - symbol: XCAFDimTolObjects_DatumSingleModif + - symbol: XCAFDimTolObjects_DatumTargetType + - symbol: XCAFDimTolObjects_DimensionFormVariance + - symbol: XCAFDimTolObjects_DimensionGrade + - symbol: XCAFDimTolObjects_DimensionModif + - symbol: XCAFDimTolObjects_DimensionObject + - symbol: XCAFDimTolObjects_DimensionQualifier + - symbol: XCAFDimTolObjects_DimensionType + - symbol: XCAFDimTolObjects_GeomToleranceMatReqModif + - symbol: XCAFDimTolObjects_GeomToleranceModif + - symbol: XCAFDimTolObjects_GeomToleranceObject + - symbol: XCAFDimTolObjects_GeomToleranceType + - symbol: XCAFDimTolObjects_GeomToleranceTypeValue + - symbol: XCAFDimTolObjects_GeomToleranceZoneModif + - symbol: XCAFDimTolObjects_ToleranceZoneAffectedPlane + - symbol: XCAFDimTolObjects_Tool + - symbol: XCAFDoc + - symbol: XCAFDoc_Area + - symbol: XCAFDoc_AssemblyGraph + - symbol: XCAFDoc_AssemblyGraph_Iterator + - symbol: XCAFDoc_AssemblyItemId + - symbol: XCAFDoc_AssemblyItemRef + - symbol: XCAFDoc_AssemblyIterator + - symbol: XCAFDoc_AssemblyTool + - symbol: XCAFDoc_Centroid + - symbol: XCAFDoc_ClippingPlaneTool + - symbol: XCAFDoc_Color + - symbol: XCAFDoc_ColorTool + - symbol: XCAFDoc_ColorType + - symbol: XCAFDoc_Datum + - symbol: XCAFDoc_DimTol + - symbol: XCAFDoc_DimTolTool + - symbol: XCAFDoc_Dimension + - symbol: XCAFDoc_DocumentTool + - symbol: XCAFDoc_Editor + - symbol: XCAFDoc_GeomTolerance + - symbol: XCAFDoc_GraphNode + - symbol: XCAFDoc_LayerTool + - symbol: XCAFDoc_LengthUnit + - symbol: XCAFDoc_Location + - symbol: XCAFDoc_Material + - symbol: XCAFDoc_MaterialTool + - symbol: XCAFDoc_Note + - symbol: XCAFDoc_NoteBalloon + - symbol: XCAFDoc_NoteBinData + - symbol: XCAFDoc_NoteComment + - symbol: XCAFDoc_NotesTool + - symbol: XCAFDoc_ShapeMapTool + - symbol: XCAFDoc_ShapeTool + - symbol: XCAFDoc_View + - symbol: XCAFDoc_ViewTool + - symbol: XCAFDoc_VisMaterial + - symbol: XCAFDoc_VisMaterialCommon + - symbol: XCAFDoc_VisMaterialPBR + - symbol: XCAFDoc_VisMaterialTool + - symbol: XCAFDoc_Volume + - symbol: XCAFNoteObjects_NoteObject + - symbol: XCAFPrs + - symbol: XCAFPrs_DocumentExplorer + - symbol: XCAFPrs_DocumentIdIterator + - symbol: XCAFPrs_DocumentNode + - symbol: XCAFPrs_Style + - symbol: XCAFView_Object + - symbol: XCAFView_ProjectionType + - symbol: XSAlgo + - symbol: XSAlgo_AlgoContainer + - symbol: XSControl + - symbol: XSControl_ConnectedShapes + - symbol: XSControl_Controller + - symbol: XSControl_FuncShape + - symbol: XSControl_Functions + - symbol: XSControl_Reader + - symbol: XSControl_SelectForTransfer + - symbol: XSControl_SignTransferStatus + - symbol: XSControl_TransferReader + - symbol: XSControl_TransferWriter + - symbol: XSControl_Utils + - symbol: XSControl_Vars + - symbol: XSControl_WorkSession + - symbol: XSControl_WorkSessionMap + - symbol: XSControl_Writer + - symbol: gce_ErrorType + - symbol: gce_MakeCirc + - symbol: gce_MakeCirc2d + - symbol: gce_MakeCone + - symbol: gce_MakeCylinder + - symbol: gce_MakeDir + - symbol: gce_MakeDir2d + - symbol: gce_MakeElips + - symbol: gce_MakeElips2d + - symbol: gce_MakeHypr + - symbol: gce_MakeHypr2d + - symbol: gce_MakeLin + - symbol: gce_MakeLin2d + - symbol: gce_MakeMirror + - symbol: gce_MakeMirror2d + - symbol: gce_MakeParab + - symbol: gce_MakeParab2d + - symbol: gce_MakePln + - symbol: gce_MakeRotation + - symbol: gce_MakeRotation2d + - symbol: gce_MakeScale + - symbol: gce_MakeScale2d + - symbol: gce_MakeTranslation + - symbol: gce_MakeTranslation2d + - symbol: gce_Root + - symbol: gp + - symbol: gp_Ax1 + - symbol: gp_Ax2 + - symbol: gp_Ax22d + - symbol: gp_Ax2d + - symbol: gp_Ax3 + - symbol: gp_Circ + - symbol: gp_Circ2d + - symbol: gp_Cone + - symbol: gp_Cylinder + - symbol: gp_Dir + - symbol: gp_Dir2d + - symbol: gp_Elips + - symbol: gp_Elips2d + - symbol: gp_EulerSequence + - symbol: gp_GTrsf + - symbol: gp_GTrsf2d + - symbol: gp_Hypr + - symbol: gp_Hypr2d + - symbol: gp_Lin + - symbol: gp_Lin2d + - symbol: gp_Mat + - symbol: gp_Mat2d + - symbol: gp_Parab + - symbol: gp_Parab2d + - symbol: gp_Pln + - symbol: gp_Pnt + - symbol: gp_Pnt2d + - symbol: gp_Quaternion + - symbol: gp_QuaternionNLerp + - symbol: gp_QuaternionSLerp + - symbol: gp_Sphere + - symbol: gp_Torus + - symbol: gp_Trsf + - symbol: gp_Trsf2d + - symbol: gp_TrsfForm + - symbol: gp_Vec + - symbol: gp_Vec2d + - symbol: gp_XY + - symbol: gp_XYZ + - symbol: math + - symbol: math_BFGS + - symbol: math_BissecNewton + - symbol: math_BracketMinimum + - symbol: math_BracketedRoot + - symbol: math_BrentMinimum + - symbol: math_BullardGenerator + - symbol: math_ComputeGaussPointsAndWeights + - symbol: math_ComputeKronrodPointsAndWeights + - symbol: math_Crout + - symbol: math_DirectPolynomialRoots + - symbol: math_DoubleTab + - symbol: math_EigenValuesSearcher + - symbol: math_FRPR + - symbol: math_Function + - symbol: math_FunctionAllRoots + - symbol: math_FunctionRoot + - symbol: math_FunctionRoots + - symbol: math_FunctionSample + - symbol: math_FunctionSet + - symbol: math_FunctionSetRoot + - symbol: math_FunctionSetWithDerivatives + - symbol: math_FunctionWithDerivative + - symbol: math_Gauss + - symbol: math_GaussLeastSquare + - symbol: math_GaussMultipleIntegration + - symbol: math_GaussSetIntegration + - symbol: math_GaussSingleIntegration + - symbol: math_GlobOptMin + - symbol: math_Jacobi + - symbol: math_KronrodSingleIntegration + - symbol: math_Matrix + - symbol: math_MultipleVarFunction + - symbol: math_MultipleVarFunctionWithGradient + - symbol: math_MultipleVarFunctionWithHessian + - symbol: math_NewtonFunctionRoot + - symbol: math_NotSquare + - symbol: math_PSO + - symbol: math_PSOParticlesPool + - symbol: math_Powell + - symbol: math_SVD + - symbol: math_SingularMatrix + - symbol: math_Status + - symbol: math_TrigonometricEquationFunction + - symbol: math_TrigonometricFunctionRoots + - symbol: math_Uzawa + - symbol: math_ValueAndWeight + additionalBindCode: | + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + #include + struct TopoDS_Cast {}; + using namespace emscripten; + EMSCRIPTEN_BINDINGS(ocjs_additional) { + function("FairCurve_Batten_Compute", optional_override([](FairCurve_Batten& self, int nbIter, double tol) -> int { + FairCurve_AnalysisCode code; + self.Compute(code, nbIter, tol); + return static_cast(code); + })); + function("FairCurve_MinimalVariation_Compute", optional_override([](FairCurve_MinimalVariation& self, int nbIter, double tol) -> int { + FairCurve_AnalysisCode code; + self.Compute(code, nbIter, tol); + return static_cast(code); + })); + class_("TopoDS_Cast") + .class_function("Edge", optional_override([](const TopoDS_Shape& s) -> TopoDS_Edge { return TopoDS::Edge(s); })) + .class_function("Wire", optional_override([](const TopoDS_Shape& s) -> TopoDS_Wire { return TopoDS::Wire(s); })) + .class_function("Face", optional_override([](const TopoDS_Shape& s) -> TopoDS_Face { return TopoDS::Face(s); })) + .class_function("Vertex", optional_override([](const TopoDS_Shape& s) -> TopoDS_Vertex { return TopoDS::Vertex(s); })) + .class_function("Shell", optional_override([](const TopoDS_Shape& s) -> TopoDS_Shell { return TopoDS::Shell(s); })) + .class_function("Solid", optional_override([](const TopoDS_Shape& s) -> TopoDS_Solid { return TopoDS::Solid(s); })) + .class_function("Compound", optional_override([](const TopoDS_Shape& s) -> TopoDS_Compound { return TopoDS::Compound(s); })) + ; + } + emccFlags: + - -fwasm-exceptions + - -sEXPORT_EXCEPTION_HANDLING_HELPERS + - -sEXPORT_ES6=1 + - -sMODULARIZE + - -sALLOW_MEMORY_GROWTH=1 + - -sEXPORTED_RUNTIME_METHODS=["FS"] + - -sINITIAL_MEMORY=128MB + - -sMAXIMUM_MEMORY=4GB + - -sUSE_FREETYPE=1 + - -sERROR_ON_UNDEFINED_SYMBOLS=0 + - --no-entry + - -Wl,--allow-undefined + - --emit-symbol-map + - -sSTACK_SIZE=8388608 + - -sWASM_BIGINT + - -msimd128 + - -O3 + # ── Multi-threading additions (delta from full.yml) ───────────── + # Recipe: docs-site/content/docs/package/guides/multi-threading.mdx (published /multi subpath). + # -sEVAL_CTORS=2 (present in full.yml) is DROPPED -- ctor evaluation + # order is non-deterministic under pthread workers. + - -pthread + - -sUSE_PTHREADS=1 + # Pre-spawn one worker per logical CPU on the host. The expression is evaluated by the + # generated JS glue at module-instantiation time, so a single binary adapts to whatever + # hardware loads it. See BENCHMARKS.md — Impact of R1 (PTHREAD_POOL_SIZE bump). + - -sPTHREAD_POOL_SIZE=navigator.hardwareConcurrency + - -sSHARED_MEMORY=1 + # R12 — browser-only ENVIRONMENT (no `node`). Node.js lacks + # `WebAssembly.Memory.prototype.toResizableBuffer()` (May 2026), so the + # generated JS glue for -sGROWABLE_ARRAYBUFFERS=1 below throws on + # module init under Node. Stripping `node` from ENVIRONMENT makes that + # incompatibility explicit at build time. + - -sENVIRONMENT=web,worker + # R12 — enable resizable SharedArrayBuffer views so consumers can hoist + # HEAP* references out of hot loops without re-fetching them after + # every growth event. Eliminates the `-Wpthreads-mem-growth` advisory. + # Requires Chrome/Edge >= 144, Firefox >= 145, Safari >= 26.2. + # See `full_multi_browser.yml` header for the full support matrix. + - -sGROWABLE_ARRAYBUFFERS=1 diff --git a/build-configs/link-filter-poc.yml b/build-configs/link-filter-poc.yml new file mode 100644 index 00000000..ead9320b --- /dev/null +++ b/build-configs/link-filter-poc.yml @@ -0,0 +1,69 @@ +# build-configs/link-filter-poc.yml +# +# 22-symbol replicad-like trim — smoke YAML for docker.yml CI. +# +# Refreshed against OCCT V8 per the production-readiness blueprint: +# docs/research/ocjs-docker-production-readiness-blueprint.md +# (Appendix: link-filter-poc.yml Refresh Procedure) +# +# Source of truth: tests/sentinel/test_link_filter_poc_yaml.py::POC_YAML_SCOPE. +# The sentinel reachability test (test_link_ncollection_reachability.py) MAY +# reference a wider superset (`_REPLICAD_LIKE_SCOPE`) for filter-completeness +# assertions, but this YAML MUST remain at exactly 22 symbols to keep CI smoke +# link time bounded. The drift-prevention test in tests/sentinel/ enforces this. +# +# Category coverage (6 OCCT subsystems × 22 symbols): +# Standard : 2 +# gp : 6 +# TopoDS : 8 +# BRepPrimAPI : 2 +# BRepBuilderAPI : 3 +# Bnd : 1 +mainBuild: + name: opencascade_linkfilter_poc.js + bindings: + # Standard infra (2) + - symbol: Standard_Transient + - symbol: Standard_Type + # gp (6) + - symbol: gp_Pnt + - symbol: gp_Vec + - symbol: gp_Dir + - symbol: gp_Trsf + - symbol: gp_Ax2 + - symbol: gp_XYZ + # TopoDS (8) + - symbol: TopoDS + - symbol: TopoDS_Shape + - symbol: TopoDS_Edge + - symbol: TopoDS_Wire + - symbol: TopoDS_Face + - symbol: TopoDS_Solid + - symbol: TopoDS_Compound + - symbol: TopoDS_Iterator + # BRepPrimAPI (2) + - symbol: BRepPrimAPI_MakeBox + - symbol: BRepPrimAPI_MakeSphere + # BRepBuilderAPI (3) + - symbol: BRepBuilderAPI_MakeEdge + - symbol: BRepBuilderAPI_MakeFace + - symbol: BRepBuilderAPI_MakeWire + # Bnd (1) + - symbol: Bnd_Box + emccFlags: + - -fwasm-exceptions + - -sEXPORT_EXCEPTION_HANDLING_HELPERS + - -sEXPORT_ES6=1 + - -sMODULARIZE + - -sALLOW_MEMORY_GROWTH=1 + - -sEXPORTED_RUNTIME_METHODS=["FS"] + - -sINITIAL_MEMORY=64MB + - -sMAXIMUM_MEMORY=2GB + - -sERROR_ON_UNDEFINED_SYMBOLS=0 + - --no-entry + - -Wl,--allow-undefined + - --emit-symbol-map + - -sSTACK_SIZE=8388608 + - -sWASM_BIGINT + - -msimd128 + - -O3 diff --git a/build-native.sh b/build-native.sh new file mode 100755 index 00000000..2bd02dc6 --- /dev/null +++ b/build-native.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -euo pipefail +cd "$(dirname "$0")" + +echo "=== OpenCascade.js Native Build ===" + +# Shared emsdk with assimpjs +export EMSDK="${EMSDK:-$(cd ../assimpjs/emsdk && pwd)}" +echo "Using EMSDK: $EMSDK" +source "$EMSDK/emsdk_env.sh" +echo "Emscripten: $(emcc --version | head -1)" + +# Dependency roots +export OCJS_ROOT="$(pwd)" +export OCCT_ROOT="${OCCT_ROOT:-$(cd ../OCCT && pwd)}" +export RAPIDJSON_ROOT="${RAPIDJSON_ROOT:-$(cd ../rapidjson && pwd)}" +export FREETYPE_ROOT="${FREETYPE_ROOT:-$(cd ../freetype && pwd)}" + +# Dev build flags: -O0 and no LTO for fast iteration +export OCJS_OPT="${OCJS_OPT:--O0}" +export OCJS_LTO="${OCJS_LTO:-0}" + +echo "OCJS_ROOT: $OCJS_ROOT" +echo "OCCT_ROOT: $OCCT_ROOT" +echo "RAPIDJSON_ROOT: $RAPIDJSON_ROOT" +echo "FREETYPE_ROOT: $FREETYPE_ROOT" +echo "OCJS_OPT: $OCJS_OPT" +echo "OCJS_LTO: $OCJS_LTO" +echo "" + +# Ensure build directories exist +mkdir -p build/{bindings,sources,dist} + +# Step 1: Apply OCCT patches +echo "=== Step 1: Applying patches ===" +python3 src/patches/patch_using_statements.py + +# Step 2: Build flat includes + PCH (25x compilation speedup) +echo "=== Step 2: Building flat includes + precompiled header ===" +python3 -c " +import sys; sys.path.insert(0, 'src') +from ocjs_bindgen.config.paths import buildFlatIncludes, buildPch +buildFlatIncludes() +buildPch() +" + +# Step 3: Generate bindings +echo "=== Step 3: Generating bindings ===" +python3 -m ocjs_bindgen --config bindgen-filters.yaml + +# Step 4: Compile bindings (uses PCH + flat includes) +echo "=== Step 4: Compiling bindings ===" +python3 src/compileBindings.py single-threaded + +# Step 5: Compile OCCT sources via CMake (replaces legacy src/compileSources.py) +echo "=== Step 5: Compiling OCCT sources (CMake) ===" +./build-wasm.sh sources + +echo "" +echo "=== Build complete ===" +echo "Run 'PYTHONPATH=src python3 -m ocjs_bindgen.link.yaml_build ' to link into final WASM." +echo "" +echo "Build optimization summary:" +echo " - Flat includes: 467 -I paths -> 1 (eliminates stat() overhead)" +echo " - PCH: 5,640 headers precompiled once (~92MB binary)" +echo " - Combined: ~25x per-file speedup (52s -> 2s per binding file)" diff --git a/build-wasm.sh b/build-wasm.sh new file mode 100755 index 00000000..0bb643b6 --- /dev/null +++ b/build-wasm.sh @@ -0,0 +1,1029 @@ +#!/bin/bash +set -euo pipefail + +# ── OpenCascade.js WASM Build Script ───────────────────────────────── +# +# Single entry point for all build operations: PCH rebuild, binding +# compilation, source compilation, and final WASM linking. +# Includes config-keyed compilation caching and provenance tracking. +# +# Usage: +# ./build-wasm.sh link # Link only (fastest, reuses .o) +# ./build-wasm.sh pch # Rebuild flat includes + PCH +# ./build-wasm.sh pch link # Rebuild PCH then link +# ./build-wasm.sh generate # Generate binding .cpp files from OCCT headers +# ./build-wasm.sh bindings # Compile bindings only +# ./build-wasm.sh sources # Compile OCCT sources only +# ./build-wasm.sh full # Full pipeline: pch + generate + bindings + sources + link +# ./build-wasm.sh --config single-threaded full # Full pipeline with named configuration +# +# Environment overrides (all optional, sensible defaults provided): +# EMSDK Path to emsdk (default: deps/emsdk/) +# OCCT_ROOT Path to OCCT source (default: deps/OCCT/) +# RAPIDJSON_ROOT Path to rapidjson (default: deps/rapidjson/) +# FREETYPE_ROOT Path to freetype (default: ./freetype) +# OCJS_OPT Compile optimization level (default: -O2) +# OCJS_EXTRA_CFLAGS Extra compile flags appended to C/CXX flags (e.g. "-mllvm -inline-threshold=128") +# OCJS_LTO Enable LTO at compile time: 0|1 (default: 1) +# OCJS_EXCEPTIONS Enable native WASM exceptions: 0|1 (default: 0) +# THREADING Threading mode: single-threaded|multi-threaded (default: single-threaded) +# +# Examples: +# # Production single build (-O2 compile, noLTO) +# OCJS_LTO=0 ./build-wasm.sh full build-configs/full.yml +# +# # Quick rebuild after changing filterPackages.py +# ./build-wasm.sh pch link build-configs/full.yml +# +# # Dev build (fast compile, no LTO) +# OCJS_OPT=-O0 OCJS_LTO=0 ./build-wasm.sh link custom_build.yml +# +# # Use named configuration +# ./build-wasm.sh --config single-threaded full consumer.yml +# ───────────────────────────────────────────────────────────────────── + +SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)" +cd "$SCRIPT_DIR" + +# ── Help ───────────────────────────────────────────────────────────── + +show_help() { + cat << 'HELPEOF' +Usage: ./build-wasm.sh [options] [] + +Commands: + full Full pipeline: apply-patches + pch + generate + bindings + sources + bind-symbols + link + apply-patches Apply OCCT source patches (idempotent — all 4 OCCT patches + libembind patch are hard requirements) + link Link only (reuses compiled .o files, fastest) + bind-symbols Extract Embind registrations to build/additional-bind-symbols.json (run before link) + pch Rebuild flat includes + precompiled header + generate Generate binding .cpp files from OCCT headers + bindings Compile bindings only + sources Compile OCCT sources only + validate Validate YAML config without building + clean-generated Remove all generated .d.ts.json and .cpp files (handles symlinks) + clean-objects Remove all compiled .o files from compiled-bindings/ (handles symlinks) + +Options: + --help Show this help message + --config Apply a named configuration from build-configs/configurations.json + +Environment Variables: + EMSDK Path to Emscripten SDK (default: deps/emsdk/) + OCCT_ROOT Path to OCCT source (default: deps/OCCT/) + RAPIDJSON_ROOT Path to rapidjson (default: deps/rapidjson/) + FREETYPE_ROOT Path to freetype (default: deps/freetype/) + OCJS_CONFIG Named configuration (alternative to --config flag) + OCJS_OPT Optimization level: -O0, -O2, -O3, -Os, -Oz (default: -O2) + OCJS_EXTRA_CFLAGS Extra compile flags (e.g. "-mllvm -inline-threshold=128") + OCJS_LTO Enable LTO: 0|1 (default: 0) + OCJS_EXCEPTIONS Native WASM exceptions: 0|1 (default: 0) + THREADING Threading mode: single-threaded|multi-threaded (default: single-threaded) + OCJS_STRICT_DEPS Fail on dependency commit mismatch: 0|1 (default: 0) + OCJS_FORCE_GENERATE Force regeneration of all bindings: 0|1 (default: 0) + +Examples: + # Full build with a named configuration + ./build-wasm.sh --config single-threaded full build-configs/full.yml + + # Link only with consumer YAML (reuses compile cache) + ./build-wasm.sh --config single-threaded link path/to/consumer.yml + + # Override a flag from the config + OCJS_WASM_OPT_LEVEL=-O4 ./build-wasm.sh --config single-threaded full consumer.yml + + # Raw env vars, no config (backward compat) + OCJS_OPT=-O3 OCJS_LTO=0 ./build-wasm.sh full build-configs/full.yml + + # Validate config without building + ./build-wasm.sh validate build-configs/full.yml +HELPEOF + exit 0 +} + +if [ "${1:-}" = "--help" ] || [ "${1:-}" = "-h" ]; then + show_help +fi + +# (cache-list and cache-gc removed -- caching is managed by Nx) + +_resolve_symlink_target() { + local path="$1" + if [ -L "$path" ]; then + readlink -f "$path" 2>/dev/null || readlink "$path" + else + echo "$path" + fi +} + +_ensure_doxygen() { + # System-only check. The pinned-tarball download path was removed because: + # - The doxygen GitHub release only ships an x86_64 Linux tarball. + # - On arm64 Linux (Docker Desktop on Apple Silicon, GitHub Actions + # ubuntu-24.04-arm, etc.) the binary fails to execute, then + # extract-docs.py silently fell back to system doxygen anyway — + # producing host-vs-container JSDoc divergence with no diagnostic. + # The OCCT XML extraction is stable across Doxygen 1.9.x through 1.16.x, + # so we accept whatever the system provides. On arm64, verify the binary is + # executable (not merely present on disk) before preferring the pinned copy — + # see extract-docs.py doxygen resolution logic. + # arm64 doxygen must be executable, not merely present on disk. + if ! command -v doxygen >/dev/null 2>&1; then + cat >&2 <<'EOF' +ERROR: doxygen not installed. + Linux : apt-get install -y doxygen (Ubuntu 22.04 ships 1.9.1+, 24.04 ships 1.10.x) + macOS : brew install doxygen (Homebrew ships 1.14.x) + Other : https://www.doxygen.nl/manual/install.html +This project no longer ships a pinned doxygen binary because upstream does +not publish arm64-linux releases. The generated JSDoc is functionally +identical across doxygen 1.9.x through 1.16.x for the OCCT corpus. +EOF + return 1 + fi + echo " Using system Doxygen $(doxygen --version 2>/dev/null | awk '{print $1}')" +} + +if [ "${1:-}" = "clean-generated" ]; then + echo "Cleaning generated .d.ts.json and .cpp files..." + target="$(_resolve_symlink_target "$SCRIPT_DIR/build/bindings")" + if [ -d "$target" ]; then + count=$(find "$target" \( -name "*.d.ts.json" -o \( -name "*.cpp" ! -name "*.cpp.o" \) \) | wc -l | tr -d ' ') + find "$target" -name "*.d.ts.json" -delete 2>/dev/null || true + find "$target" -name "*.cpp" ! -name "*.cpp.o" -delete 2>/dev/null || true + rm -f "$SCRIPT_DIR/build/bindings/.generator-hash" 2>/dev/null || true + echo " Removed $count generated files." + else + echo " No build/bindings directory found." + fi + echo "Done. Run 'generate' to regenerate." + exit 0 +fi + +if [ "${1:-}" = "clean-objects" ]; then + echo "Cleaning compiled .o files..." + target="$SCRIPT_DIR/build/compiled-bindings" + if [ -d "$target" ]; then + count=$(find "$target" -name "*.cpp.o" | wc -l | tr -d ' ') + rm -rf "$target" + echo " Removed $count object files from compiled-bindings/." + else + echo " No build/compiled-bindings directory found." + fi + # Also clean legacy .cpp.o from build/bindings/ if present + legacy="$(_resolve_symlink_target "$SCRIPT_DIR/build/bindings")" + if [ -d "$legacy" ]; then + legacy_count=$(find "$legacy" -name "*.cpp.o" 2>/dev/null | wc -l | tr -d ' ') + if [ "$legacy_count" -gt 0 ]; then + find "$legacy" -name "*.cpp.o" -delete 2>/dev/null || true + echo " Removed $legacy_count legacy object files from bindings/." + fi + fi + echo "Done. Run 'bindings' to recompile." + exit 0 +fi + +# ── Resolve paths ──────────────────────────────────────────────────── + +if [ -z "${EMSDK:-}" ] || [ ! -d "${EMSDK:-}" ]; then + if [ -d "$SCRIPT_DIR/deps/emsdk" ]; then + export EMSDK="$SCRIPT_DIR/deps/emsdk" + elif [ -d "$SCRIPT_DIR/../assimpjs/emsdk" ]; then + export EMSDK="$(cd "$SCRIPT_DIR/../assimpjs/emsdk" && pwd)" + else + echo "ERROR: EMSDK not found. Run scripts/clone-deps.sh or set EMSDK=" >&2 + exit 1 + fi +fi +source "$EMSDK/emsdk_env.sh" 2>/dev/null + +# Project-local Python venv is the canonical interpreter for every build script. +# Python 3.14 project-local venv for bindgen (see pyproject.toml). +export OCJS_PYTHON="$SCRIPT_DIR/.venv/bin/python" +if [ ! -x "$OCJS_PYTHON" ]; then + echo "ERROR: $OCJS_PYTHON not found. Run scripts/clone-deps.sh first." >&2 + exit 1 +fi + +export OCJS_ROOT="$SCRIPT_DIR" +export OCCT_ROOT="${OCCT_ROOT:-$(cd "$SCRIPT_DIR/deps/OCCT" 2>/dev/null && pwd || { cd "$SCRIPT_DIR/../OCCT" 2>/dev/null && pwd; } || echo "")}" +export RAPIDJSON_ROOT="${RAPIDJSON_ROOT:-$(cd "$SCRIPT_DIR/deps/rapidjson" 2>/dev/null && pwd || { cd "$SCRIPT_DIR/../rapidjson" 2>/dev/null && pwd; } || echo "$SCRIPT_DIR/rapidjson")}" +export FREETYPE_ROOT="${FREETYPE_ROOT:-$(cd "$SCRIPT_DIR/deps/freetype" 2>/dev/null && pwd || { cd "$SCRIPT_DIR/../freetype" 2>/dev/null && pwd; } || echo "$SCRIPT_DIR/freetype")}" + +for dep_name in OCCT_ROOT RAPIDJSON_ROOT FREETYPE_ROOT; do + dep_val="${!dep_name}" + if [ -z "$dep_val" ] || [ ! -d "$dep_val" ]; then + echo "ERROR: $dep_name not found at '$dep_val'" >&2 + exit 1 + fi +done + +# ── Validate dependency commits against DEPS.json ──────────────────── + +DEPS_FILE="$SCRIPT_DIR/DEPS.json" +if [ -f "$DEPS_FILE" ]; then + "$OCJS_PYTHON" -c " +import json, subprocess, os, sys +deps = json.load(open('$DEPS_FILE'))['dependencies'] +checks = [ + ('occt', os.environ.get('OCCT_ROOT', '')), + ('rapidjson', os.environ.get('RAPIDJSON_ROOT', '')), + ('freetype', os.environ.get('FREETYPE_ROOT', '')), +] +warnings = [] +for name, path in checks: + if not path or not os.path.isdir(os.path.join(path, '.git')): + continue + expected = deps[name]['commit'] + actual = subprocess.check_output(['git', '-C', path, 'rev-parse', 'HEAD'], text=True).strip() + if actual != expected: + warnings.append(f' {name}: expected {expected[:12]}, got {actual[:12]}') +if warnings: + print('WARNING: Dependency commit mismatch (vs DEPS.json):', file=sys.stderr) + for w in warnings: + print(w, file=sys.stderr) + if os.environ.get('OCJS_STRICT_DEPS', '') == '1': + print('ERROR: --strict deps check failed. Set OCJS_STRICT_DEPS=0 to override.', file=sys.stderr) + sys.exit(1) +" || true +fi + +# ── Pre-scan for --config flag ──────────────────────────────────────── + +_prescan_args=("$@") +for (( _i=0; _i<${#_prescan_args[@]}; _i++ )); do + if [ "${_prescan_args[$_i]}" = "--config" ] && [ $((_i+1)) -lt ${#_prescan_args[@]} ]; then + export OCJS_CONFIG="${_prescan_args[$((_i+1))]}" + break + fi +done + +# OCJS_CONFIG inheritance contract (R6 / W1 fix) — cached Nx subtasks +# (`apply-patches`, `pch`, `generate`, `compile-bindings`, `compile-sources`, +# `link`) all declare `{ "env": "OCJS_CONFIG" }` in their `inputs` so the +# cache key bifurcates on the named configuration. That means a parent +# `OCJS_CONFIG=multi-threaded nx run ocjs:link` will NOT reuse a +# single-threaded `pch` cache entry. Within this script we simply +# inherit whatever the parent process exported; the explicit `:-` default +# only fires on direct CLI invocation, not on the Nx-driven path. +# +# To override: +# OCJS_CONFIG=multi-threaded ./build-wasm.sh link +# ./build-wasm.sh --config multi-threaded link +# +# To inspect: +# echo "$OCJS_CONFIG" # current named configuration +# cat build-configs/configurations.json | jq 'keys' # available configurations +export OCJS_CONFIG="${OCJS_CONFIG:-single-threaded}" + +if [ -n "${OCJS_CONFIG:-}" ]; then + _CONFIG_FILE="$SCRIPT_DIR/build-configs/configurations.json" + if [ ! -f "$_CONFIG_FILE" ]; then + echo "ERROR: configurations.json not found at $_CONFIG_FILE" >&2 + exit 1 + fi + echo "Loading configuration: $OCJS_CONFIG" + eval "$("$OCJS_PYTHON" -c " +import json, sys +configs = json.load(open('$_CONFIG_FILE')) +name = '$OCJS_CONFIG' +if name not in configs: + print(f'echo \"ERROR: Configuration \"{name}\" not found. Available: {\", \".join(configs.keys())}\" >&2; exit 1') + sys.exit(0) +cfg = configs[name] +for key, val in cfg.items(): + print(f'export {key}=\"{val}\"') +")" + echo "" +fi + +# ── Build flags ────────────────────────────────────────────────────── + +export OCJS_OPT="${OCJS_OPT:--O3}" +export OCJS_EXTRA_CFLAGS="${OCJS_EXTRA_CFLAGS:-}" +export OCJS_LTO="${OCJS_LTO:-0}" +export OCJS_EXCEPTIONS="${OCJS_EXCEPTIONS:-0}" +export OCJS_WASM_OPT_LEVEL="${OCJS_WASM_OPT_LEVEL:--O4}" +export OCJS_CLOSURE="${OCJS_CLOSURE:-false}" +export OCJS_EVAL_CTORS="${OCJS_EVAL_CTORS:-false}" +export OCJS_CONVERGE="${OCJS_CONVERGE:-false}" +export OCJS_DEFINES="${OCJS_DEFINES:-}" +export OCJS_UNDEFINES="${OCJS_UNDEFINES:-}" +export OCJS_SIMD="${OCJS_SIMD:-0}" +export OCJS_RELAXED_SIMD="${OCJS_RELAXED_SIMD:-0}" +export OCJS_BIGINT="${OCJS_BIGINT:-0}" +export OCJS_MALLOC="${OCJS_MALLOC:-dlmalloc}" +export OCJS_FORCE_GENERATE="${OCJS_FORCE_GENERATE:-0}" +export THREADING="${THREADING:-single-threaded}" +export PYTHONPATH="$OCJS_ROOT/src:${PYTHONPATH:-}" +export BUILD_DIR="${BUILD_DIR:-$OCJS_ROOT/build}" +OCJS_OUTPUT_DIR="${OCJS_OUTPUT_DIR:-$OCJS_ROOT/dist}" +if [[ "$OCJS_OUTPUT_DIR" != /* ]]; then + OCJS_OUTPUT_DIR="$OCJS_ROOT/$OCJS_OUTPUT_DIR" +fi +export OCJS_OUTPUT_DIR + +# ── Print config ───────────────────────────────────────────────────── + +echo "╔══════════════════════════════════════════════════════════╗" +echo "║ OpenCascade.js WASM Build ║" +echo "╠══════════════════════════════════════════════════════════╣" +printf "║ %-14s %s\n" "EMSDK:" "$EMSDK ║" +printf "║ %-14s %s\n" "Emscripten:" "$(emcc --version 2>/dev/null | head -1) ║" +printf "║ %-14s %s\n" "OCCT_ROOT:" "$OCCT_ROOT ║" +printf "║ %-14s %s\n" "OCJS_OPT:" "$OCJS_OPT ║" +if [ -n "$OCJS_EXTRA_CFLAGS" ]; then +printf "║ %-14s %s\n" "EXTRA_CFLAGS:" "$OCJS_EXTRA_CFLAGS ║" +fi +printf "║ %-14s %s\n" "OCJS_LTO:" "$OCJS_LTO ║" +printf "║ %-14s %s\n" "OCJS_EXCEPTIONS:" "$OCJS_EXCEPTIONS ║" +printf "║ %-14s %s\n" "OCJS_SIMD:" "$OCJS_SIMD ║" +printf "║ %-14s %s\n" "OCJS_RELAXED_SIMD:" "$OCJS_RELAXED_SIMD ║" +printf "║ %-14s %s\n" "THREADING:" "$THREADING ║" +printf "║ %-14s %s\n" "OCJS_MALLOC:" "$OCJS_MALLOC ║" +printf "║ %-14s %s\n" "wasm-opt:" "$OCJS_WASM_OPT_LEVEL ║" +printf "║ %-14s %s\n" "BUILD_DIR:" "$BUILD_DIR ║" +printf "║ %-14s %s\n" "OCJS_CONFIG:" "${OCJS_CONFIG:-} ║" +echo "╚══════════════════════════════════════════════════════════╝" +echo "" + +mkdir -p "$BUILD_DIR"/{bindings,sources} +mkdir -p "$OCJS_OUTPUT_DIR" + +# ── Build flag validation ───────────────────────────────────────────── + +validate_build_flags() { + "$OCJS_PYTHON" -c " +import sys; sys.path.insert(0, 'src') +from ocjs_bindgen.config.flags import validate_build_flags, BuildFlagMismatch +try: + validate_build_flags() +except BuildFlagMismatch as e: + print(str(e), flush=True) + sys.exit(1) +" +} + +# ── Step functions ─────────────────────────────────────────────────── + +_ensure_standard_version_hxx() { + local target="$OCCT_ROOT/src/FoundationClasses/TKernel/Standard/Standard_Version.hxx" + local template="$OCCT_ROOT/adm/templates/Standard_Version.hxx.in" + if [ -f "$target" ]; then + return 0 + fi + if [ ! -f "$template" ]; then + echo " WARNING: Standard_Version.hxx.in template not found" >&2 + return 0 + fi + echo " Generating Standard_Version.hxx from cmake template..." + "$OCJS_PYTHON" -c " +import re +with open('$template') as f: c = f.read() +with open('$OCCT_ROOT/adm/cmake/version.cmake') as f: v = f.read() +major = re.search(r'OCC_VERSION_MAJOR\s+(\d+)', v).group(1) +minor = re.search(r'OCC_VERSION_MINOR\s+(\d+)', v).group(1) +maint = re.search(r'OCC_VERSION_MAINTENANCE\s+(\d+)', v).group(1) +c = c.replace('@OCC_VERSION_MAJOR@', major) +c = c.replace('@OCC_VERSION_MINOR@', minor) +c = c.replace('@OCC_VERSION_MAINTENANCE@', maint) +c = c.replace('@OCC_VERSION_DATE@', '2024-01-01') +c = c.replace('@SET_OCC_VERSION_DEVELOPMENT@', '#define OCC_VERSION_DEVELOPMENT \"dev\"') +with open('$target', 'w') as f: f.write(c) +print(f' Generated Standard_Version.hxx (OCCT {major}.{minor}.{maint})') +" +} + +step_pch() { + echo "═══ Rebuilding flat includes + PCH ═══" + _ensure_standard_version_hxx + rm -f build/pch.h.pch build/pch.h + rm -rf build/occt-includes + "$OCJS_PYTHON" -c " +import sys; sys.path.insert(0, 'src') +from ocjs_bindgen.config.paths import buildFlatIncludes, buildPch +buildFlatIncludes() +buildPch(threading='$THREADING') +" + echo "" +} + +step_docs() { + echo "═══ Generating OCCT documentation JSON ═══" + _ensure_doxygen + "$OCJS_PYTHON" src/extract-docs.py + echo "" +} + +step_generate() { + echo "═══ Generating bindings from OCCT headers ═══" + + step_docs + + find "$OCJS_ROOT/src" -type d -name "__pycache__" -exec rm -rf {} + 2>/dev/null || true + + if [ "${OCJS_FORCE_GENERATE:-0}" = "1" ]; then + echo " Force regeneration: clearing existing .d.ts.json and .cpp files" + local target="$OCJS_ROOT/build/bindings" + [ -L "$target" ] && target="$(readlink -f "$target")" + if [ -d "$target" ]; then + find "$target" -name "*.d.ts.json" -delete 2>/dev/null || true + find "$target" -name "*.cpp" ! -name "*.cpp.o" -delete 2>/dev/null || true + rm -f "$OCJS_ROOT/build/bindings/.generator-hash" 2>/dev/null || true + fi + fi + + local config="${OCJS_BINDGEN_CONFIG:-$OCJS_ROOT/bindgen-filters.yaml}" + if [ -f "$config" ]; then + echo " Using bindgen config: $config" + export OCJS_BINDGEN_CONFIG="$config" + fi + "$OCJS_PYTHON" -m ocjs_bindgen --config "$config" + echo "" +} + +step_bindings() { + echo "═══ Compiling bindings ═══" + "$OCJS_PYTHON" src/compileBindings.py "$THREADING" + echo "" +} + +step_sources() { + echo "═══ Compiling OCCT sources (CMake) ═══" + step_sources_cmake + echo "" +} + +step_sources_cmake() { + local cmake_build_dir="$OCJS_ROOT/build/occt-cmake" + local lib_dir="$cmake_build_dir/lin32/clang/lib" + + if [ -d "$lib_dir" ] && [ "$(ls "$lib_dir"/*.a 2>/dev/null | wc -l)" -gt 0 ]; then + echo " CMake build directory exists with $(ls "$lib_dir"/*.a | wc -l | tr -d ' ') libraries, checking if rebuild needed..." + fi + + local cmake_flags=( + -DCMAKE_BUILD_TYPE=Release + -DBUILD_LIBRARY_TYPE=Static + -DBUILD_MODULE_FoundationClasses=ON + -DBUILD_MODULE_ModelingData=ON + -DBUILD_MODULE_ModelingAlgorithms=ON + -DBUILD_MODULE_DataExchange=ON + -DBUILD_MODULE_ApplicationFramework=ON + -DBUILD_MODULE_Visualization=OFF + -DBUILD_MODULE_Draw=OFF + -DBUILD_DOC_Overview=OFF + -DUSE_TCL=OFF + -DUSE_TK=OFF + -DUSE_RAPIDJSON=ON + "-D3RDPARTY_RAPIDJSON_DIR=$RAPIDJSON_ROOT" + "-D3RDPARTY_RAPIDJSON_INCLUDE_DIR=$RAPIDJSON_ROOT/include" + "-D3RDPARTY_FREETYPE_DIR=$FREETYPE_ROOT" + "-D3RDPARTY_FREETYPE_INCLUDE_DIR_freetype2=$FREETYPE_ROOT/include" + "-D3RDPARTY_FREETYPE_INCLUDE_DIR_ft2build=$FREETYPE_ROOT/include" + ) + + local cflags="$OCJS_OPT -DIGNORE_NO_ATOMICS=1 -DOCCT_NO_PLUGINS -DHAVE_RAPIDJSON" + local cxxflags="$cflags -frtti" + + if [ "$OCJS_LTO" = "1" ]; then + cflags="$cflags -flto" + cxxflags="$cxxflags -flto" + fi + + if [ "$OCJS_EXCEPTIONS" = "1" ]; then + if [ "${OCJS_EH_MODE:-wasm}" = "js" ]; then + cxxflags="$cxxflags -fexceptions" + else + cxxflags="$cxxflags -fwasm-exceptions" + fi + cxxflags="$cxxflags -DOCJS_EXCEPTIONS_ENABLED=1" + else + cflags="$cflags -sSUPPORT_LONGJMP=0" + cxxflags="$cxxflags -sSUPPORT_LONGJMP=0" + fi + + if [ "$OCJS_SIMD" = "1" ]; then + cflags="$cflags -msimd128" + cxxflags="$cxxflags -msimd128" + if [ "$OCJS_RELAXED_SIMD" = "1" ]; then + cflags="$cflags -mrelaxed-simd" + cxxflags="$cxxflags -mrelaxed-simd" + fi + fi + + if [ "$THREADING" = "multi-threaded" ]; then + cflags="$cflags -pthread" + cxxflags="$cxxflags -pthread" + fi + + if [ -n "$OCJS_DEFINES" ]; then + IFS=',' read -ra defines <<< "$OCJS_DEFINES" + for d in "${defines[@]}"; do + d="$(echo "$d" | xargs)" + [ -n "$d" ] && cflags="$cflags -D$d" && cxxflags="$cxxflags -D$d" + done + fi + if [ -n "$OCJS_UNDEFINES" ]; then + IFS=',' read -ra undefines <<< "$OCJS_UNDEFINES" + for u in "${undefines[@]}"; do + u="$(echo "$u" | xargs)" + [ -n "$u" ] && cflags="$cflags -U$u" && cxxflags="$cxxflags -U$u" + done + fi + + if [ -n "$OCJS_EXTRA_CFLAGS" ]; then + cflags="$cflags $OCJS_EXTRA_CFLAGS" + cxxflags="$cxxflags $OCJS_EXTRA_CFLAGS" + fi + + cmake_flags+=( + "-DCMAKE_C_FLAGS=$cflags" + "-DCMAKE_CXX_FLAGS=$cxxflags" + ) + + if [ "$OCJS_EXCEPTIONS" != "1" ]; then + cmake_flags+=( + "-DCMAKE_C_FLAGS_RELEASE=-DNDEBUG -sDISABLE_EXCEPTION_CATCHING=1 -sSUPPORT_LONGJMP=0 -UOCC_CONVERT_SIGNALS" + "-DCMAKE_CXX_FLAGS_RELEASE=-DNDEBUG -sDISABLE_EXCEPTION_CATCHING=1 -sSUPPORT_LONGJMP=0 -UOCC_CONVERT_SIGNALS" + ) + fi + + echo " Configuring OCCT via CMake..." + emcmake cmake -B "$cmake_build_dir" \ + "${cmake_flags[@]}" \ + -Wno-dev \ + "$OCCT_ROOT" 2>&1 | tail -5 + + local nproc + nproc=$(sysctl -n hw.ncpu 2>/dev/null || nproc 2>/dev/null || echo 4) + echo " Building OCCT with $nproc parallel jobs..." + cmake --build "$cmake_build_dir" -j"$nproc" 2>&1 | tail -5 + + local lib_count + lib_count=$(ls "$lib_dir"/*.a 2>/dev/null | wc -l | tr -d ' ') + echo " CMake produced $lib_count static libraries in $lib_dir" + + echo "$lib_dir" > "$OCJS_ROOT/build/.cmake-lib-dir" +} + +step_dts() { + local yaml="$1" + if [ ! -f "$yaml" ]; then + echo "ERROR: YAML config not found: $yaml" >&2 + exit 1 + fi + local yaml_abs + yaml_abs="$(cd "$(dirname "$yaml")" && pwd)/$(basename "$yaml")" + echo "═══ Regenerating .d.ts from $yaml_abs (no compile/link) ═══" + cd "$(dirname "$yaml_abs")" + PYTHONPATH="$OCJS_ROOT/src" "$OCJS_PYTHON" -m ocjs_bindgen.link.yaml_build --dts-only "$(basename "$yaml_abs")" + cd "$SCRIPT_DIR" + echo "" +} + +step_bind_symbols() { + local yaml="$1" + if [ ! -f "$yaml" ]; then + echo "ERROR: YAML config not found: $yaml" >&2 + exit 1 + fi + local yaml_abs + yaml_abs="$(cd "$(dirname "$yaml")" && pwd)/$(basename "$yaml")" + echo "═══ Extracting Embind registration manifest from $yaml_abs ═══" + # Dedicated NX-graph stage between `generate` and `link` — writes + # `build/additional-bind-symbols.json` so the link-time `verifyBindings` + # consumer (and the post-link `validate-build.py` consumer) can both + # resolve Embind builtins without depending on the link stage having + # opened libclang first. NX `link.dependsOn` ordering enforces the + # producer/consumer contract; running this manually is fine too (e.g. + # for local diagnostics or smoke-test driven invocations). + PYTHONPATH="$OCJS_ROOT/src" "$OCJS_PYTHON" -m ocjs_bindgen.bind_symbols \ + --build-dir "$BUILD_DIR" "$yaml_abs" + echo "" +} + +step_link() { + local yaml="$1" + if [ ! -f "$yaml" ]; then + echo "ERROR: YAML config not found: $yaml" >&2 + exit 1 + fi + local yaml_abs + yaml_abs="$(cd "$(dirname "$yaml")" && pwd)/$(basename "$yaml")" + echo "═══ Linking WASM from $yaml_abs ═══" + echo " Output dir: $OCJS_OUTPUT_DIR" + mkdir -p "$OCJS_OUTPUT_DIR" + # Scope cleanup to the current build's name so multi-config workflows + # (e.g. single-threaded + multi-threaded coexisting in dist/) don't wipe + # the other config's artefacts. The build name lives at `mainBuild.name` + # in the YAML (always the first `name:` field at column 0+2 indentation). + local build_js build_base + build_js=$(awk '$1 == "name:" {print $2; exit}' "$yaml_abs") + if [ -z "$build_js" ]; then + echo "ERROR: could not parse mainBuild.name from $yaml_abs" >&2 + exit 1 + fi + build_base="${build_js%.js}" + find "$OCJS_OUTPUT_DIR" -maxdepth 1 \( \ + -name "${build_base}.wasm" \ + -o -name "${build_js}" \ + -o -name "${build_base}.d.ts" \ + -o -name "${build_base}.js.symbols" \ + -o -name "${build_base}.provenance.json" \ + -o -name "${build_base}.build-manifest.json" \ + \) -delete 2>/dev/null || true + cd "$OCJS_OUTPUT_DIR" + PYTHONPATH="$OCJS_ROOT/src" "$OCJS_PYTHON" -m ocjs_bindgen.link.yaml_build "$yaml_abs" + cd "$SCRIPT_DIR" + echo "" +} + +step_apply_patches() { + # The four OCCT source patches below are HARD REQUIREMENTS for every + # supported build (single-threaded and multi-threaded alike). The legacy + # OCJS_PATCH_DUMP / OCJS_PATCH_STEPCAF env-var toggles were removed — + # making required behaviour optional was a footgun (a `OCJS_PATCH_DUMP=false` + # build silently produces an unusable WASM that fails at link or at runtime + # depending on which symbols the consumer pulls in). + echo "═══ Applying OCCT source patches ═══" + + if [ -d "$OCCT_ROOT/.git" ]; then + echo " Reverting OCCT source tree to clean state..." + git -C "$OCCT_ROOT" checkout -- . 2>/dev/null || true + fi + + echo " Applying using-statement / V8 bugfix patches..." + "$OCJS_PYTHON" src/patches/patch_using_statements.py + echo " Applying Standard_Dump stub patch..." + "$OCJS_PYTHON" src/patches/patch_standard_dump.py + echo " Applying noexcept destructors patch (7 classes)..." + "$OCJS_PYTHON" src/patches/patch_noexcept_destructors.py + echo " Applying STEPCAFControl_Controller DynamicType patch..." + "$OCJS_PYTHON" src/patches/patch_stepcaf_dyntype.py + echo " All patches applied." + + step_patch_embind + + echo "$(date +%s)" > "$BUILD_DIR/patches-applied" + echo "" +} + +step_patch_embind() { + # Patch-hygiene contract (see docs/policy/ocjs-trailing-default-emission-policy.md + # rule 6 and docs/research/ocjs-libembind-phase-0-hygiene.md). On EVERY + # invocation we: + # 1. Verify the vendored pristine snapshot at + # src/vendor/pristine-libembind.js matches its expected SHA256. + # 2. Reset deps/emsdk/upstream/emscripten/src/lib/libembind.js from the + # pristine snapshot (overwriting any prior patched / hot-edited state). + # 3. Apply src/patches/libembind-overloading.patch. + # 4. Verify the patched file's SHA256 matches the expected hash recorded + # at src/patches/libembind-overloading.expected.sha256. + # + # The prior hash-skip + reverse-apply scheme accumulated five duplicate + # `$getSignature` definitions across iterative patch revisions because JS + # object-literal duplicate-key semantics silently kept only the last copy, + # producing non-deterministic dispatch behaviour across machines. The + # pristine-reset + hash-verify pipeline makes the step idempotent at the + # file level (not merely at the patch-hash level) and fails loudly if + # either the pristine snapshot or the post-patch result drifts. + echo "═══ Patching emsdk libembind.js (type-based overload dispatch) ═══" + + local embind_dir="$EMSDK/upstream/emscripten" + local embind_file="$embind_dir/src/lib/libembind.js" + local patch_file="$OCJS_ROOT/src/patches/libembind-overloading.patch" + local pristine_file="$OCJS_ROOT/src/vendor/pristine-libembind.js" + local pristine_hash_file="$OCJS_ROOT/src/vendor/pristine-libembind.expected.sha256" + local expected_hash_file="$OCJS_ROOT/src/patches/libembind-overloading.expected.sha256" + + if [ ! -d "$embind_dir" ]; then + echo "ERROR: emscripten directory not found at $embind_dir" >&2 + exit 1 + fi + if [ ! -f "$pristine_file" ]; then + echo "ERROR: pristine libembind snapshot not found at $pristine_file" >&2 + echo " Re-fetch from https://raw.githubusercontent.com/emscripten-core/emscripten//src/lib/libembind.js" >&2 + exit 1 + fi + if [ ! -f "$patch_file" ]; then + echo "ERROR: patch file not found at $patch_file" >&2 + exit 1 + fi + + local emsdk_version + emsdk_version="$(cat "$embind_dir/emscripten-version.txt" 2>/dev/null | tr -d '"' | tr -d '[:space:]')" + if [ "$emsdk_version" != "5.0.1" ]; then + echo "WARNING: libembind patch was created for emsdk 5.0.1 but found $emsdk_version" >&2 + echo " The patch may fail or produce incorrect results." >&2 + fi + + _sha256() { + if command -v shasum >/dev/null 2>&1; then + shasum -a 256 "$1" | awk '{print $1}' + else + sha256sum "$1" | awk '{print $1}' + fi + } + + if [ -f "$pristine_hash_file" ]; then + local pristine_actual pristine_expected + pristine_actual="$(_sha256 "$pristine_file")" + pristine_expected="$(cat "$pristine_hash_file" | tr -d '[:space:]')" + if [ "$pristine_actual" != "$pristine_expected" ]; then + echo "ERROR: pristine snapshot SHA256 mismatch." >&2 + echo " file: $pristine_file" >&2 + echo " expected: $pristine_expected" >&2 + echo " actual: $pristine_actual" >&2 + exit 1 + fi + fi + + echo " Resetting libembind.js from pristine snapshot..." + mkdir -p "$(dirname "$embind_file")" + cp "$pristine_file" "$embind_file" + local reset_actual reset_expected + reset_actual="$(_sha256 "$embind_file")" + reset_expected="$(_sha256 "$pristine_file")" + if [ "$reset_actual" != "$reset_expected" ]; then + echo "ERROR: post-reset SHA256 mismatch (copy failed or destination tampered with)." >&2 + exit 1 + fi + + echo " Applying libembind-overloading.patch..." + cd "$embind_dir" || exit 1 + if ! patch -p0 -N --no-backup-if-mismatch < "$patch_file"; then + patch_status=$? + echo "ERROR: libembind patch failed (exit $patch_status) against pristine snapshot." >&2 + echo " Pristine SHA256: $reset_actual" >&2 + echo " Patch file: $patch_file" >&2 + exit 1 + fi + cd "$OCJS_ROOT" || exit 1 + + local patched_actual + patched_actual="$(_sha256 "$embind_file")" + if [ -f "$expected_hash_file" ]; then + local patched_expected + patched_expected="$(cat "$expected_hash_file" | tr -d '[:space:]')" + if [ "$patched_actual" != "$patched_expected" ]; then + echo "ERROR: post-patch SHA256 mismatch." >&2 + echo " file: $embind_file" >&2 + echo " expected: $patched_expected (from $expected_hash_file)" >&2 + echo " actual: $patched_actual" >&2 + echo " Regenerate via:" >&2 + echo " cp ; patch -p0 < $patch_file" >&2 + echo " shasum -a 256 | awk '{print \$1}' > $expected_hash_file" >&2 + exit 1 + fi + else + echo " WARNING: expected hash file not found at $expected_hash_file" >&2 + echo " Skipping post-patch hash verification (run once and seed the hash)." >&2 + fi + + # Retain the hash-stamp file purely for diagnostic visibility — the + # decision to reset+reapply no longer depends on it (we ALWAYS reset). + echo "$patched_actual" > "$BUILD_DIR/embind-patch-hash" + echo " libembind.js patched successfully (sha256 $patched_actual)." +} + +# (step_compile_all removed -- Nx manages task orchestration and caching) + +# ── Parse commands ─────────────────────────────────────────────────── + +if [ $# -eq 0 ]; then + echo "Usage: $0 [...] []" + echo "" + echo "Commands:" + echo " apply-patches Apply OCCT source patches (idempotent)" + echo " pch Rebuild flat includes + PCH" + echo " docs Generate OCCT documentation JSON (for JSDoc)" + echo " generate Generate binding .cpp files from OCCT headers" + echo " bindings Compile bindings only" + echo " sources Compile OCCT sources only" + echo " dts Regenerate .d.ts only from existing fragments (no compile/link)" + echo " bind-symbols Extract Embind registrations -> build/additional-bind-symbols.json" + echo " link Link WASM binary from YAML config" + echo " full Full pipeline (apply-patches + pch + generate + bindings + sources + link)" + echo " clean-generated Remove generated .d.ts.json and .cpp (handles symlinks)" + echo " clean-objects Remove compiled .o files from compiled-bindings/ (handles symlinks)" + exit 1 +fi + +YAML_CONFIG="" +COMMANDS=() + +while [ $# -gt 0 ]; do + case "$1" in + --help|-h) + show_help + ;; + --config) + shift + if [ $# -eq 0 ]; then + echo "ERROR: --config requires a configuration name" >&2 + exit 1 + fi + export OCJS_CONFIG="$1" + shift + ;; + pch|docs|generate|bindings|sources|apply-patches|patch-embind) + COMMANDS+=("$1") + shift + ;; + validate) + COMMANDS+=("$1") + shift + if [ $# -eq 0 ]; then + echo "ERROR: validate requires a YAML config path argument" >&2 + exit 1 + fi + YAML_CONFIG="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" + shift + ;; + dts|link|full|provenance|bind-symbols) + COMMANDS+=("$1") + shift + if [ $# -eq 0 ]; then + echo "ERROR: command requires a YAML config path argument" >&2 + exit 1 + fi + YAML_CONFIG="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" + shift + ;; + *) + if [ -f "$1" ] && [[ "$1" == *.yml ]]; then + YAML_CONFIG="$(cd "$(dirname "$1")" && pwd)/$(basename "$1")" + shift + else + echo "ERROR: Unknown command or file: $1" >&2 + echo "Run './build-wasm.sh --help' for usage." >&2 + exit 1 + fi + ;; + esac +done + +START_TIME=$(date +%s) + +for cmd in "${COMMANDS[@]}"; do + case "$cmd" in + apply-patches) step_apply_patches ;; + patch-embind) step_patch_embind ;; + pch) step_pch ;; + docs) step_docs ;; + generate) step_generate ;; + bindings) validate_build_flags && step_bindings ;; + sources) step_sources ;; + dts) step_dts "$YAML_CONFIG" ;; + bind-symbols) step_bind_symbols "$YAML_CONFIG" ;; + link) + # `link` must be self-contained when invoked as the Docker + # ENTRYPOINT — no separate `provenance`/`validate` runs precede + # it. `provenance.py init` seeds `build/provenance.json` so the + # `prov.add_linking(...)` call inside `step_link` (which guards + # on `_load()` returning a non-empty dict) actually records the + # link section; the end-of-script `finalize` then promotes the + # scratchpad to `/.provenance.json`. + # `validate-build.py` writes the companion `.build-manifest.json` + # so CI smoke + downstream consumers (replicad, examples) can + # round-trip the build-flag fingerprint without reaching back + # into the build cache. + validate_build_flags + "$OCJS_PYTHON" "$OCJS_ROOT/src/provenance.py" init + # V3 RE-SHIP: extract Embind registrations into + # `build/additional-bind-symbols.json` BEFORE `step_link` runs the + # link-time `verifyBindings` consumer. NX's own dep-graph enforces + # this ordering when invoked via `nx run`; the shell entry mirrors + # the contract for direct `./build-wasm.sh link ` invocations + # so the producer never lags its consumer. + step_bind_symbols "$YAML_CONFIG" + step_link "$YAML_CONFIG" + echo "═══ Post-link validation ═══" + # V10 — unconditional hard-fail. Alias-resolved + builtin buckets + # absorb every historical false positive in validate-build.py; any + # surviving failure is a real link gap and must fail the wrapper. + "$OCJS_PYTHON" "$OCJS_ROOT/scripts/validate-build.py" "$YAML_CONFIG" "$OCJS_OUTPUT_DIR" --build-dir "$BUILD_DIR" + echo "" + ;; + validate) + echo "═══ Validating YAML config: $YAML_CONFIG ═══" + "$OCJS_PYTHON" -c " +import yaml, sys +sys.path.insert(0, '$OCJS_ROOT/src') +from cerberus import Validator +schema = eval(open('$OCJS_ROOT/src/customBuildSchema.py').read()) +config = yaml.safe_load(open('$YAML_CONFIG')) +v = Validator(schema) +if v.validate(config, schema): + normalized = v.normalized(config) + bindings = normalized['mainBuild']['bindings'] + name = normalized['mainBuild']['name'] + flags = normalized['mainBuild'].get('emccFlags', []) + print(f' Config valid: {len(bindings)} bindings') + print(f' Build name: {name}') + print(f' emccFlags: {len(flags)} flags') + has_exc = any('-fexceptions' in f or '-fwasm-exceptions' in f for f in flags) + has_exc_str = 'yes' if has_exc else 'no' + print(f' Exceptions: {has_exc_str}') +else: + print(f' INVALID: {v.errors}', file=sys.stderr) + sys.exit(1) +" + echo "" + ;; + provenance) + # V5 RE-SHIP — preserve the scratchpad written by the prior `link` + # subcommand. Calling `provenance.py init` here wiped the + # `linking{}`, `postProcessing{}`, and `nCollectionManifest{}` + # blocks `step_link` populates via `prov.add_linking(...)`; the + # subsequent `finalize` then promoted the *empty* scratchpad to + # `/.provenance.json`, dropping every link-time + # fact downstream consumers (audit doc V5/V9 contracts, + # `test_provenance_carries_ncollection_manifest_with_invariant`) + # depend on. The NX task graph guarantees `link` runs first + # (`provenance` `dependsOn: ["link"]`), so the scratchpad + # already exists when this subcommand fires — `init` only re- + # seeded for standalone CLI use, which we now serve by having + # `finalize` no-op cleanly when the scratchpad is absent. + echo "═══ Generating build provenance ═══" + "$OCJS_PYTHON" src/provenance.py finalize --wasm-dir "$OCJS_OUTPUT_DIR" --yaml "${YAML_CONFIG:-}" --duration 0 + echo "" + ;; + full) + # Same self-contained-`init` contract as `link` (see comment + # there). Without it, `prov.add_linking(...)` inside `step_link` + # silently no-ops and the end-of-script `finalize` writes + # nothing — published artefacts only had a `.provenance.json` + # because the host NX pipeline ran the `provenance` subcommand + # in a separate invocation beforehand. + "$OCJS_PYTHON" "$OCJS_ROOT/src/provenance.py" init + step_apply_patches + step_pch + step_generate + step_bindings + step_sources_cmake + # Same producer-before-consumer contract as the `link` subcommand — + # see comment there for full rationale. + step_bind_symbols "$YAML_CONFIG" + step_link "$YAML_CONFIG" + echo "═══ Post-build validation ═══" + # V10 — unconditional hard-fail. See `link` subcommand for rationale. + "$OCJS_PYTHON" "$OCJS_ROOT/scripts/validate-build.py" "$YAML_CONFIG" "$OCJS_OUTPUT_DIR" --build-dir "$BUILD_DIR" + echo "" + ;; + esac +done + +END_TIME=$(date +%s) +ELAPSED=$((END_TIME - START_TIME)) + +# ── Finalize provenance ────────────────────────────────────────────── +# +# Promotes the `build/provenance.json` scratchpad seeded by `init` (in +# either `link` or `full`) and updated by `step_link` (`add_linking`) +# into `/.provenance.json`. Stderr is no longer +# suppressed — when finalize fails (missing scratchpad, unwritable +# output dir, etc.) it now surfaces instead of silently dropping the +# artefact and tripping the CI smoke `Assert smoke artefacts present` +# step later. `|| true` is retained so non-YAML-driven commands +# (`pch`, `apply-patches`, `bindings`) that legitimately have nothing +# to finalize don't fail the wrapper. + +if [ -n "$YAML_CONFIG" ]; then + "$OCJS_PYTHON" src/provenance.py finalize --wasm-dir "$OCJS_OUTPUT_DIR" --yaml "$YAML_CONFIG" --duration "$ELAPSED" || true +fi + +echo "" +echo "╔══════════════════════════════════════════════════════════╗" +echo "║ Build Complete ║" +echo "╠══════════════════════════════════════════════════════════╣" +printf "║ %-14s %s\n" "Duration:" "${ELAPSED}s ║" +printf "║ %-14s %s\n" "Config:" "${OCJS_CONFIG:-} ║" + +if [ -n "$YAML_CONFIG" ]; then + for wasm in "$OCJS_OUTPUT_DIR"/*.wasm; do + if [ -f "$wasm" ]; then + BASENAME="$(basename "$wasm")" + SIZE=$(stat -f%z "$wasm" 2>/dev/null || stat -c%s "$wasm" 2>/dev/null || echo "0") + SIZE_MB=$(awk -v s="$SIZE" 'BEGIN { printf "%.2f", s / 1048576 }' 2>/dev/null || echo "?") + GZIP_SIZE=$(gzip -c "$wasm" 2>/dev/null | wc -c | tr -d ' ') + GZIP_MB=$(awk -v s="$GZIP_SIZE" 'BEGIN { printf "%.2f", s / 1048576 }' 2>/dev/null || echo "?") + printf "║ %-14s %s\n" "WASM:" "$BASENAME ($SIZE_MB MB, ${GZIP_MB} MB gzipped) ║" + fi + done + for js in "$OCJS_OUTPUT_DIR"/*.js; do + if [ -f "$js" ] && [[ "$js" != *.d.ts ]]; then + SIZE=$(stat -f%z "$js" 2>/dev/null || stat -c%s "$js" 2>/dev/null || echo "0") + SIZE_KB=$(awk -v s="$SIZE" 'BEGIN { printf "%.1f", s / 1024 }' 2>/dev/null || echo "?") + printf "║ %-14s %s\n" "JS:" "$(basename "$js") (${SIZE_KB} KB) ║" + fi + done + for dts in "$OCJS_OUTPUT_DIR"/*.d.ts; do + if [ -f "$dts" ]; then + SIZE=$(stat -f%z "$dts" 2>/dev/null || stat -c%s "$dts" 2>/dev/null || echo "0") + SIZE_KB=$(awk -v s="$SIZE" 'BEGIN { printf "%.1f", s / 1024 }' 2>/dev/null || echo "?") + printf "║ %-14s %s\n" "Types:" "$(basename "$dts") (${SIZE_KB} KB) ║" + fi + done +fi +echo "╚══════════════════════════════════════════════════════════╝" diff --git a/check.ts b/check.ts new file mode 100644 index 00000000..460d7d6e --- /dev/null +++ b/check.ts @@ -0,0 +1,9 @@ +import type { OpenCascadeInstance } from './build-configs/opencascade_full.js'; +declare const oc: OpenCascadeInstance; +declare const face: any; +declare const loc: any; +const triResult = oc.BRep_Tool.Triangulation(face, loc, 0); +const tri = triResult.result; +type TriType = typeof tri; +const _check: TriType = tri; +tri.isNull(); diff --git a/dist/.gitignore b/dist/.gitignore deleted file mode 100644 index 653af8dd..00000000 --- a/dist/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -** -!index.js -!index.d.ts -!node.js -!node.d.ts -!tsconfig.json diff --git a/dist/.npmignore b/dist/.npmignore deleted file mode 100644 index abd40ed8..00000000 --- a/dist/.npmignore +++ /dev/null @@ -1,2 +0,0 @@ -/reference-docs/ -/reference-docs.zip diff --git a/dist/index.d.ts b/dist/index.d.ts deleted file mode 100644 index 6bb23d10..00000000 --- a/dist/index.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import init, { OpenCascadeInstance } from "./opencascade.full"; -export * from "./opencascade.full"; - -type OpenCascadeModuleObject = { - [key: string]: any; -}; - -export default function initOpenCascade( - settings?: { - mainJS?: init; - mainWasm?: string; - worker?: string; - libs?: string[]; - module?: OpenCascadeModuleObject; - }, -): Promise; diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 2c486b2b..00000000 --- a/dist/index.js +++ /dev/null @@ -1,32 +0,0 @@ -import ocFullJS from "./opencascade.full.js"; -import ocFullWasm from "./opencascade.full.wasm"; - -const initOpenCascade = ({ - mainJS = ocFullJS, - mainWasm = ocFullWasm, - worker = undefined, - libs = [], - module = {}, -} = {}) => { - return new Promise((resolve, reject) => { - new mainJS({ - locateFile(path) { - if (path.endsWith('.wasm')) { - return mainWasm; - } - if (path.endsWith('.worker.js') && !!worker) { - return worker; - } - return path; - }, - ...module - }).then(async oc => { - for (let lib of libs) { - await oc.loadDynamicLibrary(lib, { loadAsync: true, global: true, nodelete: true, allowUndefined: false }); - } - resolve(oc); - }); - }); -}; - -export default initOpenCascade; diff --git a/dist/node.d.ts b/dist/node.d.ts deleted file mode 100644 index 6bb23d10..00000000 --- a/dist/node.d.ts +++ /dev/null @@ -1,16 +0,0 @@ -import init, { OpenCascadeInstance } from "./opencascade.full"; -export * from "./opencascade.full"; - -type OpenCascadeModuleObject = { - [key: string]: any; -}; - -export default function initOpenCascade( - settings?: { - mainJS?: init; - mainWasm?: string; - worker?: string; - libs?: string[]; - module?: OpenCascadeModuleObject; - }, -): Promise; diff --git a/dist/node.js b/dist/node.js deleted file mode 100644 index 60293b4d..00000000 --- a/dist/node.js +++ /dev/null @@ -1,40 +0,0 @@ -// patch __dirname -import { dirname } from 'path'; -import { fileURLToPath } from 'url'; -globalThis.__dirname = dirname(fileURLToPath(import.meta.url)); - -// patch require -import { createRequire } from 'module'; -globalThis.require = createRequire(import.meta.url); - -import ocFullJS from "./opencascade.full.js"; - -const initOpenCascade = ({ - mainJS = ocFullJS, - mainWasm = `${globalThis.__dirname}/opencascade.full.wasm`, - worker = undefined, - libs = [], - module = {}, -} = {}) => { - return new Promise((resolve, reject) => { - new mainJS({ - locateFile(path) { - if (path.endsWith('.wasm')) { - return mainWasm; - } - if (path.endsWith('.worker.js') && !!worker) { - return worker; - } - return path; - }, - ...module - }).then(async oc => { - for (let lib of libs) { - await oc.loadDynamicLibrary(lib, { loadAsync: true, global: true, nodelete: true, allowUndefined: false }); - } - resolve(oc); - }); - }); -}; - -export default initOpenCascade; diff --git a/docs-site/.gitignore b/docs-site/.gitignore new file mode 100644 index 00000000..442b66d4 --- /dev/null +++ b/docs-site/.gitignore @@ -0,0 +1,14 @@ +node_modules +.next +out +.source +.vercel +.env*.local +*.tsbuildinfo +next-env.d.ts + +content/docs/package/api/** +!content/docs/package/api/.gitkeep + +playwright-report +test-results diff --git a/docs-site/.vale.ini b/docs-site/.vale.ini new file mode 100644 index 00000000..8064c6b5 --- /dev/null +++ b/docs-site/.vale.ini @@ -0,0 +1,5 @@ +StylesPath = .vale/styles +MinAlertLevel = suggestion + +[*.mdx] +BasedOnStyles = Ocjs diff --git a/docs-site/.vale/styles/Ocjs/CondescendingFiller.yml b/docs-site/.vale/styles/Ocjs/CondescendingFiller.yml new file mode 100644 index 00000000..49e369a0 --- /dev/null +++ b/docs-site/.vale/styles/Ocjs/CondescendingFiller.yml @@ -0,0 +1,10 @@ +extends: existence +message: "Condescending filler '%s' adds no information — delete the word." +level: error +ignorecase: true +tokens: + - '\bsimply\b' + - "\\bjust\\b(?!\\s+(in\\s+time|now|the))" + - 'as you can see' + - 'obviously' + - 'clearly[,\\s]' diff --git a/docs-site/.vale/styles/Ocjs/NoEmojiBody.yml b/docs-site/.vale/styles/Ocjs/NoEmojiBody.yml new file mode 100644 index 00000000..7c1db7d1 --- /dev/null +++ b/docs-site/.vale/styles/Ocjs/NoEmojiBody.yml @@ -0,0 +1,6 @@ +extends: existence +message: "Emojis are reserved for the page-actions component — keep body content emoji-free." +level: warning +tokens: + - '[\x{1F300}-\x{1FAFF}]' + - '[\x{2600}-\x{27BF}]' diff --git a/docs-site/.vale/styles/Ocjs/NoWelcomeTo.yml b/docs-site/.vale/styles/Ocjs/NoWelcomeTo.yml new file mode 100644 index 00000000..0f7d4041 --- /dev/null +++ b/docs-site/.vale/styles/Ocjs/NoWelcomeTo.yml @@ -0,0 +1,6 @@ +extends: existence +message: "Pages must open with a concrete sentence stating purpose, not 'Welcome to…'." +level: error +ignorecase: true +tokens: + - '\bWelcome to\b' diff --git a/docs-site/.vale/styles/Ocjs/PowerfulFlexibleEasyToUse.yml b/docs-site/.vale/styles/Ocjs/PowerfulFlexibleEasyToUse.yml new file mode 100644 index 00000000..14b657c5 --- /dev/null +++ b/docs-site/.vale/styles/Ocjs/PowerfulFlexibleEasyToUse.yml @@ -0,0 +1,8 @@ +extends: existence +message: "Avoid the 'powerful, flexible, easy-to-use' marketing triplet — describe a concrete capability instead." +level: error +ignorecase: true +tokens: + - 'powerful' + - 'flexible' + - 'easy[\s-]?to[\s-]?use' diff --git a/docs-site/.vale/styles/Ocjs/Superlatives.yml b/docs-site/.vale/styles/Ocjs/Superlatives.yml new file mode 100644 index 00000000..60a1c1aa --- /dev/null +++ b/docs-site/.vale/styles/Ocjs/Superlatives.yml @@ -0,0 +1,14 @@ +extends: existence +message: "Marketing superlatives ('%s') are banned — use concrete numbers or capability claims." +level: error +ignorecase: true +tokens: + - 'blazing fast' + - 'lightning[\s-]?fast' + - 'state[\s-]?of[\s-]?the[\s-]?art' + - 'world[\s-]?class' + - 'cutting[\s-]?edge' + - 'best[\s-]?in[\s-]?class' + - 'next[\s-]?generation' + - 'revolutionary' + - 'game[\s-]?changing' diff --git a/docs-site/.vale/styles/Ocjs/meta.json b/docs-site/.vale/styles/Ocjs/meta.json new file mode 100644 index 00000000..89f54ef4 --- /dev/null +++ b/docs-site/.vale/styles/Ocjs/meta.json @@ -0,0 +1,4 @@ +{ + "feed": "https://github.com/taucad/opencascade.js", + "vale_version": ">=3.0.0" +} diff --git a/docs-site/app/(home)/layout.tsx b/docs-site/app/(home)/layout.tsx new file mode 100644 index 00000000..9dc1be49 --- /dev/null +++ b/docs-site/app/(home)/layout.tsx @@ -0,0 +1,9 @@ +import type { ReactNode } from 'react'; +import { HomeLayout } from 'fumadocs-ui/layouts/home'; +import { baseOptions } from '../layout.config'; + +const HomeShellLayout = ({ children }: { readonly children: ReactNode }): React.JSX.Element => { + return {children}; +}; + +export default HomeShellLayout; diff --git a/docs-site/app/(home)/page.tsx b/docs-site/app/(home)/page.tsx new file mode 100644 index 00000000..4d773721 --- /dev/null +++ b/docs-site/app/(home)/page.tsx @@ -0,0 +1,276 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import { HomeFooter } from '../../components/home-footer'; +import { usedByProjects } from '../../lib/home-used-by'; +import { renderInlineCode } from '../../lib/inline-code-text'; +import { resolveIcon } from '../../lib/icon-resolver'; +import { GITHUB_REPO_URL } from '../../lib/site'; + +const personaCards = [ + { + title: 'npm consumer', + description: 'Install `@taucad/opencascade.js@beta`, render a box, export STEP. 4 minutes.', + href: '/docs/package/getting-started/quick-start-npm', + cta: 'Start with npm', + icon: 'lib:npm', + iconKind: 'brand', + primary: true, + }, + { + title: 'Docker consumer', + description: 'Pull a GHCR image, link a YAML, build a trimmed wasm. 2 minutes.', + href: '/docs/toolchain/getting-started/quick-start-docker', + cta: 'Start with Docker', + icon: 'lib:docker', + iconKind: 'brand', + primary: false, + }, + { + title: 'Library author', + description: 'Trim symbols, add custom C++, ship reproducible CI. No fork.', + href: '/docs/toolchain/guides/extend-with-cpp', + cta: 'Extend with C++', + icon: 'lib:webassembly', + iconKind: 'brand', + primary: false, + }, + { + title: 'AI agent / LLM', + description: 'Fetch `/llms.txt` for the full surface, or any page as raw `.mdx`.', + href: '/llms.txt', + cta: 'Read llms.txt', + icon: 'lucide:bot text-fd-primary', + iconKind: 'lucide-tinted', + primary: false, + }, +] as const; + +const v3Highlights = [ + { + title: 'ESM-only build', + description: 'One wasm, one `init()` Promise. No CommonJS.', + icon: 'lucide:zap text-amber-500', + }, + { + title: 'Suffix-free symbols', + description: '`gp_Pnt`, not `gp_Pnt_3`. Overloads dispatched in C++.', + icon: 'lucide:scissors text-sky-500', + }, + { + title: '`using` disposables', + description: 'Every shape implements `Symbol.dispose` for scope-exit memory management.', + icon: 'lucide:recycle text-emerald-500', + }, + { + title: 'Multi-threaded WASM', + description: '1.24× geomean on mixed CAD. Opt in via `/multi`.', + icon: 'lucide:gauge text-fd-primary', + href: '/docs/package/guides/multi-threading', + }, +] as const; + +const v3Pillars = [ + { + title: 'OCCT V8', + description: + 'First WebAssembly binding to track OCCT V8 — BRepGraph, modern differential property packages, NCollection size_t migration, Gordon surface construction.', + icon: 'lucide:layers text-fd-muted-foreground', + }, + { + title: 'Agent-native', + description: + 'Every page is an `.mdx` resource. `/llms.txt` indexes the surface. Suffix-free symbols read like the C++ docs — LLMs hit the right overload without a lookup table.', + icon: 'lucide:bot text-fd-muted-foreground', + }, + { + title: 'Browser-first', + description: + 'ESM single-file, Vite / Next / Bun ready, COOP/COEP-aware threading, multi-arch GHCR images so Apple Silicon and Linux build the same bytes.', + icon: 'lucide:globe text-fd-muted-foreground', + }, +] as const; + +const CHANGELOG_URL = `${GITHUB_REPO_URL}/blob/master/CHANGELOG.md`; +const BREAKING_CHANGES_URL = `${GITHUB_REPO_URL}/blob/master/BREAKING_CHANGES.md`; + +const personaIconClass = (iconKind: 'brand' | 'lucide' | 'lucide-tinted'): string => { + if (iconKind === 'brand') { + return 'flex size-9 shrink-0 items-center justify-center rounded-lg border border-fd-border bg-fd-muted/30 p-1 [&_img]:size-full'; + } + if (iconKind === 'lucide-tinted') { + return 'flex size-9 shrink-0 items-center justify-center rounded-lg border border-fd-border bg-fd-primary/10 p-1.5 [&_svg]:size-5'; + } + return 'flex size-9 shrink-0 items-center justify-center rounded-lg border border-fd-border bg-fd-muted/30 p-1.5 [&_svg]:size-5'; +}; + +const personaCardClass = (primary: boolean): string => + primary + ? 'group block rounded-xl border border-yellow-500/60 bg-yellow-500/[0.03] p-5 shadow-sm transition-colors hover:border-yellow-500' + : 'group block rounded-xl border border-fd-border bg-fd-card p-5 transition-colors hover:border-fd-primary'; + +const HomePage = (): ReactNode => { + return ( +
+
+
+ {/* eslint-disable-next-line @next/next/no-img-element -- inline brand mark in hero */} + +
+

+ OpenCascade.js +

+

+ The OpenCASCADE 3D CAD kernel, compiled to WebAssembly with full TypeScript bindings. Build solids, run + booleans, fillet edges, mesh, and read/write STEP — in a browser tab, a Node CLI, or an LLM tool call. + Trim the wasm to the symbols you need, or extend it with your own C++ — no fork required. +

+
+
+
+ +
+
+ {personaCards.map((card) => ( + +
+
+ {resolveIcon(card.icon)} +
+
{renderInlineCode(card.title)}
+
+
{renderInlineCode(card.description)}
+
{card.cta} →
+ + ))} +
+ +

+ + FAQ — fork status, maintenance, contributing → + +

+
+ +
+

Used by

+ +

+ + See all projects → + +

+
+ +
+

+ V3 upgrades OCCT to V8 and modernizes the toolchain for the agentic, browser-first era. +

+

+ {renderInlineCode( + 'This is not a maintenance bump. V3 retargets the bindings at coding agents and modern bundlers — the same wasm runs unchanged in a Vite tab, a Bun CLI, and a Cursor agent tool call.', + )} +

+ +
+ {v3Pillars.map((pillar) => ( +
+
+
+ {resolveIcon(pillar.icon)} +
+
{pillar.title}
+
+

{renderInlineCode(pillar.description)}

+
+ ))} +
+ +

+ + Read the V3 breaking changes → + +

+
+ +
+

What's new in V3

+ +
+ {v3Highlights.map((item) => { + const body = ( + <> +
+
+ {resolveIcon(item.icon)} +
+
{renderInlineCode(item.title)}
+
+

{renderInlineCode(item.description)}

+ + ); + + if ('href' in item && item.href !== undefined) { + return ( + + {body} + + ); + } + + return ( +
+ {body} +
+ ); + })} +
+ +

+ + See full release notes → + +

+
+ + +
+ ); +}; + +export default HomePage; diff --git a/docs-site/app/api/search/route.ts b/docs-site/app/api/search/route.ts new file mode 100644 index 00000000..15ed189a --- /dev/null +++ b/docs-site/app/api/search/route.ts @@ -0,0 +1,89 @@ +import 'server-only'; +import { promises as fs } from 'node:fs'; +import { resolve } from 'node:path'; +import { initAdvancedSearch } from 'fumadocs-core/search/server'; +import type { AdvancedIndex } from 'fumadocs-core/search/server'; +import { source } from '../../../lib/source'; + +type ApiSearchEntry = { + readonly id: string; + readonly title: string; + readonly description: string; + readonly url: string; + readonly tag: string; + readonly structured: { + contents: ReadonlyArray<{ heading: string; content: string }>; + }; +}; + +const SEARCH_INDEX_PATH = resolve(process.cwd(), 'data/api-search-index.json'); + +/** + * Read the 20 MB JSON once per server process. Lives outside the Next + * module graph (no `import './api-search-index'`), so Turbopack / webpack + * never have to parse or bundle it. + */ +const loadApiEntries = async (): Promise => { + try { + const raw = await fs.readFile(SEARCH_INDEX_PATH, 'utf8'); + return JSON.parse(raw) as readonly ApiSearchEntry[]; + } catch { + return []; + } +}; + +const toAdvancedIndex = (entry: ApiSearchEntry): AdvancedIndex => ({ + id: entry.id, + title: entry.title, + description: entry.description, + url: entry.url, + tag: entry.tag, + structuredData: { + headings: [], + contents: entry.structured.contents.map((c) => ({ heading: c.heading, content: c.content })), + }, +}); + +const buildServer = async (): Promise> => { + // Hand-written docs: include only pages that carry MDX-derived + // structuredData. Virtual API pages (from `lib/api-source.ts`) have none, + // so they're filtered out here — their content is contributed by the + // dedicated `api-search-index.json` entries with `tag` of class | method | + // property below. + const sourceIndexes: AdvancedIndex[] = []; + for (const page of source.getPages()) { + if (page.type !== 'docs') continue; + if (page.url.startsWith('/docs/package/api/') || page.url === '/docs/package/api') continue; + const structuredData = page.data.structuredData; + if (!structuredData) continue; + sourceIndexes.push({ + id: page.url, + title: page.data.title ?? page.url, + description: page.data.description ?? '', + url: page.url, + tag: 'docs', + structuredData, + }); + } + + const apiEntries = await loadApiEntries(); + const apiIndexes = apiEntries.map(toAdvancedIndex); + + return initAdvancedSearch({ + indexes: [...sourceIndexes, ...apiIndexes], + language: 'english', + }); +}; + +const serverPromise = buildServer(); + +export const GET = async (request: Request): Promise => { + const server = await serverPromise; + const url = new URL(request.url); + const query = url.searchParams.get('query') ?? ''; + const tag = url.searchParams.get('tag') ?? undefined; + const results = await server.search(query, tag ? { tag } : undefined); + return new Response(JSON.stringify(results), { + headers: { 'Content-Type': 'application/json; charset=utf-8' }, + }); +}; diff --git a/docs-site/app/docs/[[...slug]]/page.tsx b/docs-site/app/docs/[[...slug]]/page.tsx new file mode 100644 index 00000000..19ce8add --- /dev/null +++ b/docs-site/app/docs/[[...slug]]/page.tsx @@ -0,0 +1,65 @@ +import type { Metadata } from 'next'; +import { notFound } from 'next/navigation'; +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'; +import { MarkdownCopyButton, ViewOptionsPopover } from 'fumadocs-ui/layouts/docs/page'; +import defaultMdxComponents from 'fumadocs-ui/mdx'; +import { TypeTable } from 'fumadocs-ui/components/type-table'; +import { source } from '../../../lib/source'; +import { Mermaid } from '../../../components/mermaid'; +import { TagBadge } from '../../../components/tag-badge'; +import { GITHUB_REPO_URL, DOCS_DIR } from '../../../lib/site'; + +type PageProps = { + readonly params: Promise<{ readonly slug?: string[] }>; +}; + +const DocsPageRoute = async ({ params }: PageProps): Promise => { + const { slug } = await params; + // Virtual API pages (from `lib/api-source.ts`) are served by + // `app/docs/package/api/[[...slug]]/page.tsx`, which is a more-specific route and + // wins under Next routing. This guard is defensive: it ensures that if + // routing ever changes, a virtual page with no MDX `body` can never reach + // the catch-all renderer below (which would crash on `page.data.body`). + if (slug?.[0] === 'package' && slug?.[1] === 'api') notFound(); + const page = source.getPage(slug); + if (!page || page.type !== 'docs') notFound(); + + const MdxContent = page.data.body; + const markdownUrl = `${page.url}.mdx`; + const githubUrl = `${GITHUB_REPO_URL}/blob/master/${DOCS_DIR}/${page.path}`; + + return ( + + {page.data.title} + {page.data.description} +
+ + +
+ + + +
+ ); +}; + +export default DocsPageRoute; + +export const generateStaticParams = (): Array<{ slug: string[] }> => source.generateParams(); + +export const generateMetadata = async ({ params }: PageProps): Promise => { + const { slug } = await params; + const page = source.getPage(slug); + if (!page) return {}; + return { + title: page.data.title, + description: page.data.description, + }; +}; diff --git a/docs-site/app/docs/layout.tsx b/docs-site/app/docs/layout.tsx new file mode 100644 index 00000000..eb59e146 --- /dev/null +++ b/docs-site/app/docs/layout.tsx @@ -0,0 +1,14 @@ +import type { ReactNode } from 'react'; +import { DocsLayout } from 'fumadocs-ui/layouts/docs'; +import { source } from '../../lib/source'; +import { baseOptions, TauAttributionFooter } from '../layout.config'; + +const DocsShellLayout = ({ children }: { readonly children: ReactNode }): React.JSX.Element => { + return ( + }}> + {children} + + ); +}; + +export default DocsShellLayout; diff --git a/docs-site/app/docs/package/api/[[...slug]]/page.tsx b/docs-site/app/docs/package/api/[[...slug]]/page.tsx new file mode 100644 index 00000000..5615407a --- /dev/null +++ b/docs-site/app/docs/package/api/[[...slug]]/page.tsx @@ -0,0 +1,114 @@ +import type { Metadata } from 'next'; +import { notFound } from 'next/navigation'; +import { DocsBody, DocsDescription, DocsPage, DocsTitle } from 'fumadocs-ui/page'; +import { MarkdownCopyButton, ViewOptionsPopover } from 'fumadocs-ui/layouts/docs/page'; +import { source } from '../../../../../lib/source'; +import { + enumerateApiRoutes, + resolveApiRoute, + type ApiRouteResolution, +} from '../../../../../lib/api-route-resolver'; +import { ApiHierarchyTree } from '../../../../../components/api/api-hierarchy-tree'; +import { ApiModuleIndex } from '../../../../../components/api/api-module-index'; +import { ApiToolkitIndex } from '../../../../../components/api/api-toolkit-index'; +import { ApiPackagePage } from '../../../../../components/api/api-package-page'; + +type PageProps = { + readonly params: Promise<{ readonly slug?: string[] }>; +}; + +const renderBody = (resolution: ApiRouteResolution): React.ReactNode => { + switch (resolution.kind) { + case 'root': + return ; + case 'module': + return ; + case 'toolkit': + return ( + + ); + case 'package': + return ( + + ); + } +}; + +const titleFor = (resolution: ApiRouteResolution): string => { + switch (resolution.kind) { + case 'root': + return 'API Reference'; + case 'module': + return resolution.moduleName; + case 'toolkit': + return resolution.toolkitName; + case 'package': + return resolution.pageCount > 1 + ? `${resolution.packageName} (page ${resolution.page} of ${resolution.pageCount})` + : resolution.packageName; + default: { + const _exhaustive: never = resolution; + return _exhaustive; + } + } +}; + +const descriptionFor = (resolution: ApiRouteResolution): string | undefined => { + if (resolution.kind === 'package') return resolution.description; + if (resolution.kind === 'root') { + return 'All bound OCCT classes, methods, and properties across every toolkit.'; + } + const slug = resolution.kind === 'module' ? [resolution.moduleSlug] : [resolution.moduleSlug, resolution.toolkitSlug]; + const page = source.getPage(['package', 'api', ...slug]); + return page?.data.description; +}; + +const ApiRoutePage = async ({ params }: PageProps): Promise => { + const { slug } = await params; + const resolution = resolveApiRoute(slug); + if (!resolution) notFound(); + + // Tie into the Fumadocs source so the sidebar tree highlights the right + // node and so `` picks up the toc context. The virtual page + // exists in `lib/api-source.ts`. + const page = source.getPage(['package', 'api', ...(slug ?? [])]); + const title = page?.data.title ?? titleFor(resolution); + const description = page?.data.description ?? descriptionFor(resolution); + const slugPath = (slug ?? []).join('/'); + const markdownUrl = slugPath.length > 0 ? `/docs/package/api/${slugPath}.mdx` : '/docs/package/api.mdx'; + + return ( + + {title} + {description ? {description} : null} +
+ + +
+ {renderBody(resolution)} +
+ ); +}; + +export default ApiRoutePage; + +export const generateStaticParams = (): Array<{ slug: string[] }> => enumerateApiRoutes(); + +export const generateMetadata = async ({ params }: PageProps): Promise => { + const { slug } = await params; + const resolution = resolveApiRoute(slug); + if (!resolution) return {}; + return { + title: titleFor(resolution), + description: descriptionFor(resolution), + }; +}; diff --git a/docs-site/app/docs/package/api/llms.txt/route.ts b/docs-site/app/docs/package/api/llms.txt/route.ts new file mode 100644 index 00000000..00d467b6 --- /dev/null +++ b/docs-site/app/docs/package/api/llms.txt/route.ts @@ -0,0 +1,37 @@ +import { apiTree } from '../../../../../lib/api-source'; +import { SITE_TITLE, SITE_URL } from '../../../../../lib/site'; + +export const revalidate = false; + +/** + * Compact, AI-consumer index of every API package with a stable Markdown + * deep link. The accompanying `[[...slug]].mdx` route renders one package + * at a time as full Markdown — fetch a specific package via, e.g. + * `/docs/package/api/foundation-classes/tk-math/gp.mdx`. + */ +export const GET = (): Response => { + const lines: string[] = []; + lines.push(`# ${SITE_TITLE} — API Reference`); + lines.push(`Site: ${SITE_URL}`, ''); + lines.push( + `This index lists every bound OCCT package. Fetch the full per-package reference as Markdown by appending \`.mdx\` to any URL below.`, + '', + ); + for (const ocModule of apiTree.modules) { + lines.push(`## ${ocModule.name}`); + if (ocModule.description) lines.push(ocModule.description); + lines.push(''); + for (const toolkit of ocModule.toolkits) { + lines.push(`### ${toolkit.name}`); + if (toolkit.description) lines.push(toolkit.description); + for (const pkg of toolkit.packages) { + const url = `${SITE_URL}/docs/package/api/${ocModule.slug}/${toolkit.slug}/${pkg.slug}`; + lines.push(`- [${pkg.name}](${url}): ${pkg.description}`); + } + lines.push(''); + } + } + return new Response(lines.join('\n'), { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }); +}; diff --git a/docs-site/app/global.css b/docs-site/app/global.css new file mode 100644 index 00000000..aa0e113a --- /dev/null +++ b/docs-site/app/global.css @@ -0,0 +1,95 @@ +@import 'tailwindcss'; +@import 'fumadocs-ui/css/neutral.css'; +@import 'fumadocs-ui/css/preset.css'; + +@source '../node_modules/fumadocs-ui/dist/**/*.js'; +@source '../node_modules/streamdown/dist/*.js'; + +/* + * Streamdown ships shadcn/ui token class names (`text-foreground`, `bg-muted`, + * `text-muted-foreground`, `text-primary`, `border-border`) on the markdown + * elements it renders by default — most visibly its Shiki code blocks and + * tables. Fumadocs exposes the same palette under `--color-fd-*` tokens, so we + * alias the shadcn names onto the Fumadocs ones. `@theme inline` keeps the + * utilities referencing the `--color-fd-*` variables at use-site, so they flip + * automatically between light and dark with the rest of the theme. + */ +@theme inline { + --color-foreground: var(--color-fd-foreground); + --color-muted: var(--color-fd-muted); + --color-muted-foreground: var(--color-fd-muted-foreground); + --color-border: var(--color-fd-border); + --color-primary: var(--color-fd-primary); +} + +/** + * API-reference signature token palette — aligned with VSCode's default + * TypeScript *semantic* highlighting (Default Light Modern / Default Dark + * Modern) so a signature line is coloured the way an editor would colour the + * equivalent `.d.ts`. The previous palette painted every OCCT identifier + * (class titles, `extends` chips, member names AND type references) with one + * purple `fn` hue, which made purple dominate the page. + * + * Mapping (VSCode semantic token → token below): + * keyword (`storage`/`keyword`: extends, readonly, new, constructor) → + * keyword hue (Light #AF00DB / Dark #C586C0 — VSCode's magenta) + * type (`entity.name.type`/`class`: OCCT classes, void, boolean, + * number, return + param types) → + * type hue (Light #267F99 / Dark #4EC9B0 — VSCode's teal) + * variable / `entity.name.function` (param names, method/property names, + * identifiers) → plain foreground (`--color-fd-foreground`) + * punctuation (`()`, `:`, `<>`, `|`, `?`, `...`) → + * muted foreground (`--color-fd-muted-foreground`) + * + * `--color-api-fn` is retained solely for `{@link}` cross-reference links in + * the description prose (`api-markdown.tsx`), where an accent link colour is + * conventional and intentional. + */ +@theme { + --color-api-keyword: #af00db; + --color-api-type: #267f99; + --color-api-fn: #6f42c1; +} + +.dark { + --color-api-keyword: #c586c0; + --color-api-type: #4ec9b0; + --color-api-fn: #b392f0; +} + +body { + font-family: + 'Inter', + ui-sans-serif, + system-ui, + -apple-system, + sans-serif; +} + +/** + * Deep-link highlight. When the page loads with (or navigates to) a + * `#Class` / `#Class__kind__idx` hash, `ApiHashHighlight` adds this class to + * the target class card / member row to flash a primary-tinted ring that fades + * out. Box-shadow only (no background) so the card's `bg-fd-card` is never + * momentarily overridden, and the ring respects each element's own rounded + * corners. Theme-aware via the Fumadocs `--color-fd-primary` token. + */ +@keyframes api-anchor-flash { + 0%, + 12% { + box-shadow: 0 0 0 2px color-mix(in oklab, var(--color-fd-primary) 65%, transparent); + } + 100% { + box-shadow: 0 0 0 2px transparent; + } +} + +.api-anchor-flash { + animation: api-anchor-flash 1.6s ease-out; +} + +@media (prefers-reduced-motion: reduce) { + .api-anchor-flash { + animation-duration: 0.01ms; + } +} diff --git a/docs-site/app/layout.config.tsx b/docs-site/app/layout.config.tsx new file mode 100644 index 00000000..c6403b1b --- /dev/null +++ b/docs-site/app/layout.config.tsx @@ -0,0 +1,38 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import type { BaseLayoutProps } from 'fumadocs-ui/layouts/shared'; +import { GITHUB_REPO_URL } from '../lib/site'; + +export const NavTitle = (): ReactNode => ( + + {/* eslint-disable-next-line @next/next/no-img-element -- inline SVG brand mark in nav chrome */} + + OpenCascade.js + +); + +export const TauAttributionFooter = (): ReactNode => ( +

+ Maintained by{' '} + + Tau + {' '} + during the V3 / OCCT V8 release window — see the{' '} + + FAQ + + . +

+); + +export const baseOptions: BaseLayoutProps = { + nav: { + title: , + }, + githubUrl: GITHUB_REPO_URL, + links: [ + { text: 'Package', url: '/docs/package' }, + { text: 'Toolchain', url: '/docs/toolchain' }, + { text: 'API', url: '/docs/package/api' }, + ], +}; diff --git a/docs-site/app/layout.tsx b/docs-site/app/layout.tsx new file mode 100644 index 00000000..5ac3569c --- /dev/null +++ b/docs-site/app/layout.tsx @@ -0,0 +1,27 @@ +import type { ReactNode } from 'react'; +import type { Metadata } from 'next'; +import { RootProvider } from 'fumadocs-ui/provider/next'; +import { SITE_TITLE, SITE_DESCRIPTION, SITE_URL } from '../lib/site'; +import './global.css'; + +export const metadata: Metadata = { + metadataBase: new URL(SITE_URL), + title: { default: SITE_TITLE, template: '%s — OpenCascade.js' }, + description: SITE_DESCRIPTION, + icons: { + icon: '/favicon.ico', + apple: '/favicon.ico', + }, +}; + +const RootLayout = ({ children }: { readonly children: ReactNode }): React.JSX.Element => { + return ( + + + {children} + + + ); +}; + +export default RootLayout; diff --git a/docs-site/app/llms-full.txt/route.ts b/docs-site/app/llms-full.txt/route.ts new file mode 100644 index 00000000..e29faf0e --- /dev/null +++ b/docs-site/app/llms-full.txt/route.ts @@ -0,0 +1,23 @@ +import { source } from '../../lib/source'; +import { getLlmText } from '../../lib/get-llms-text'; + +export const revalidate = false; + +export const GET = async (): Promise => { + const sections: string[] = []; + for (const page of source.getPages()) { + // Virtual API pages (under /docs/package/api/*) have no MDX body. They expose + // their full reference content through `/docs/package/api/<...>.mdx` instead, + // which is synthesised from the shard JSON in + // `app/docs/package/api/[[...slug]].mdx/route.ts`. + if (page.type !== 'docs') continue; + if (page.url === '/docs/package/api' || page.url.startsWith('/docs/package/api/')) continue; + sections.push(await getLlmText(page)); + } + sections.push( + '# API Reference\nThe full bound OCCT API (5 000+ classes) is exposed as one synthesised Markdown page per package at `/docs/package/api///.mdx`. Use the search endpoint at `/api/search?query=…` to discover entries.', + ); + return new Response(sections.join('\n\n---\n\n'), { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }); +}; diff --git a/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts b/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts new file mode 100644 index 00000000..3948c968 --- /dev/null +++ b/docs-site/app/llms.mdx/docs/[[...slug]]/route.ts @@ -0,0 +1,39 @@ +import { notFound } from 'next/navigation'; +import { source } from '../../../../lib/source'; +import { getLlmText } from '../../../../lib/get-llms-text'; + +type RouteParams = { readonly params: Promise<{ readonly slug?: string[] }> }; + +export const revalidate = false; + +/** + * Raw-Markdown handler for hand-written docs. + * + * URL shape exposed to consumers: `/docs/.mdx` (rewritten in + * `next.config.ts` to `/llms.mdx/docs/` so the literal `.mdx` + * sits on a static parent folder — the dynamic catch-all sibling of + * `.mdx` is the Next.js / Turbopack edge case that produces a 404). + * + * The more-specific synthesised API handler lives at + * `app/llms.mdx/docs/api/[[...slug]]/route.ts`. + */ +export const GET = async (_request: Request, { params }: RouteParams): Promise => { + const resolved = (await params) ?? {}; + if (resolved.slug?.[0] === 'package' && resolved.slug?.[1] === 'api') notFound(); + const page = source.getPage(resolved.slug); + if (!page || page.type !== 'docs') notFound(); + const text = await getLlmText(page); + return new Response(text, { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }); +}; + +export const generateStaticParams = (): Array<{ slug: string[] }> => + source + .generateParams() + .filter( + (entry) => + Array.isArray(entry.slug) && + entry.slug.length > 0 && + !(entry.slug[0] === 'package' && entry.slug[1] === 'api'), + ); diff --git a/docs-site/app/llms.mdx/docs/package/api/[[...slug]]/route.ts b/docs-site/app/llms.mdx/docs/package/api/[[...slug]]/route.ts new file mode 100644 index 00000000..7051a124 --- /dev/null +++ b/docs-site/app/llms.mdx/docs/package/api/[[...slug]]/route.ts @@ -0,0 +1,96 @@ +import { notFound } from 'next/navigation'; +import { resolveApiRoute, enumerateApiRoutes } from '../../../../../../lib/api-route-resolver'; +import { slicePackageClasses } from '../../../../../../lib/api-package-pagination'; +import { loadShard } from '../../../../../../components/api/api-data'; +import { shardToMarkdown } from '../../../../../../lib/shard-to-markdown'; +import { apiTree } from '../../../../../../lib/api-source'; + +type RouteParams = { readonly params: Promise<{ readonly slug?: string[] }> }; + +export const revalidate = false; + +const renderListing = (title: string, url: string, links: ReadonlyArray<{ name: string; url: string; description?: string }>): string => { + const lines: string[] = []; + lines.push(`# ${title}`, `URL: ${url}`, ''); + for (const link of links) { + if (link.description) { + lines.push(`- [${link.name}](${link.url}): ${link.description}`); + } else { + lines.push(`- [${link.name}](${link.url})`); + } + } + return lines.join('\n'); +}; + +/** + * Raw-Markdown handler for synthesised OCCT API package pages. + * + * URL shape exposed to consumers: `/docs/package/api/.mdx` and + * `/docs/package/api.mdx` for the root — rewritten in `next.config.ts` to + * `/llms.mdx/docs/package/api/` and `/llms.mdx/docs/package/api` respectively + * so the literal `.mdx` lives on a static parent folder. The + * `[[...slug]].mdx` folder pattern (literal extension on a dynamic + * catch-all) is silently broken in Next.js App Router and produces + * a route regex that collides with the sibling `[[...slug]]/page.tsx`. + */ +export const GET = async (_request: Request, { params }: RouteParams): Promise => { + const resolved = (await params) ?? {}; + const resolution = resolveApiRoute(resolved.slug); + if (!resolution) notFound(); + + let body: string; + if (resolution.kind === 'package') { + const shard = await loadShard(resolution.shardKey); + const { slice } = slicePackageClasses(shard.classes ?? [], resolution.page); + const title = + resolution.pageCount > 1 + ? `${resolution.packageName} (page ${resolution.page} of ${resolution.pageCount})` + : resolution.packageName; + const baseUrl = `/docs/package/api/${resolution.moduleSlug}/${resolution.toolkitSlug}/${resolution.packageSlug}`; + const url = + resolution.page > 1 ? `${baseUrl}/page-${resolution.page}` : baseUrl; + body = shardToMarkdown({ ...shard, classes: [...slice] }, { title, url }); + } else if (resolution.kind === 'toolkit') { + const ocModule = apiTree.modules.find((m) => m.slug === resolution.moduleSlug); + const toolkit = ocModule?.toolkits.find((t) => t.slug === resolution.toolkitSlug); + const packages = toolkit?.packages ?? []; + body = renderListing( + `${resolution.toolkitName} — Packages`, + `/docs/package/api/${resolution.moduleSlug}/${resolution.toolkitSlug}`, + packages.map((p) => ({ + name: p.name, + url: `/docs/package/api/${resolution.moduleSlug}/${resolution.toolkitSlug}/${p.slug}`, + description: p.description, + })), + ); + } else if (resolution.kind === 'module') { + const ocModule = apiTree.modules.find((m) => m.slug === resolution.moduleSlug); + const toolkits = ocModule?.toolkits ?? []; + body = renderListing( + `${resolution.moduleName} — Toolkits`, + `/docs/package/api/${resolution.moduleSlug}`, + toolkits.map((t) => ({ + name: t.name, + url: `/docs/package/api/${resolution.moduleSlug}/${t.slug}`, + description: t.description, + })), + ); + } else { + body = renderListing( + 'API Reference', + '/docs/package/api', + apiTree.modules.map((m) => ({ + name: m.name, + url: `/docs/package/api/${m.slug}`, + description: m.description, + })), + ); + } + + return new Response(body, { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }); +}; + +export const generateStaticParams = (): Array<{ slug: string[] }> => + enumerateApiRoutes().filter((entry) => entry.slug.length > 0); diff --git a/docs-site/app/llms.txt/route.ts b/docs-site/app/llms.txt/route.ts new file mode 100644 index 00000000..231ccbba --- /dev/null +++ b/docs-site/app/llms.txt/route.ts @@ -0,0 +1,11 @@ +import { getLlmRefText } from '../../lib/get-llms-text'; +import { SITE_TITLE, SITE_URL } from '../../lib/site'; + +export const revalidate = false; + +export const GET = (): Response => { + const body = getLlmRefText({ siteTitle: SITE_TITLE, siteUrl: SITE_URL }); + return new Response(body, { + headers: { 'Content-Type': 'text/plain; charset=utf-8' }, + }); +}; diff --git a/docs-site/app/og/[...slug]/route.tsx b/docs-site/app/og/[...slug]/route.tsx new file mode 100644 index 00000000..ecd5ec06 --- /dev/null +++ b/docs-site/app/og/[...slug]/route.tsx @@ -0,0 +1,41 @@ +import { ImageResponse } from '@vercel/og'; +import { source } from '../../../lib/source'; +import { SITE_TITLE } from '../../../lib/site'; + +export const runtime = 'nodejs'; + +type RouteParams = { readonly params: Promise<{ readonly slug: string[] }> }; + +export const GET = async (_request: Request, { params }: RouteParams): Promise => { + const { slug } = await params; + const page = source.getPage(slug); + const title = page?.data.title ?? SITE_TITLE; + const description = page?.data.description ?? ''; + + return new ImageResponse( + ( +
+
OpenCascade.js
+
{title}
+ {description ? ( +
+ {description} +
+ ) : undefined} +
+ ), + { width: 1200, height: 630 }, + ); +}; diff --git a/docs-site/components/api/api-anchor.tsx b/docs-site/components/api/api-anchor.tsx new file mode 100644 index 00000000..6c20cc3f --- /dev/null +++ b/docs-site/components/api/api-anchor.tsx @@ -0,0 +1,63 @@ +'use client'; + +import { useState } from 'react'; +import type { ReactNode } from 'react'; +import { Link2, Check } from 'lucide-react'; + +export type ApiAnchorProps = { + /** Stable element id this anchor targets (also becomes the URL hash). */ + readonly anchorId: string; + /** Human-readable label (class or member name) for accessible naming. */ + readonly label: string; +}; + +/** + * Hover-revealed "copy link" affordance shown to the right of a class title + * or member name. Clicking copies the absolute deep-link URL (`…#`) + * to the clipboard, updates the address-bar hash, and flashes a tick on + * success — reusing the tick-on-copy pattern from `tag-badge.tsx`. + * + * The icon stays hidden until the surrounding `group` element (the card + * header / member row) is hovered or this button is keyboard-focused, + * matching the standard docs "#"/link-icon affordance. Replacing the hash via + * `history.replaceState` (rather than assigning `location.hash`) avoids both a + * history entry and a native jump — the item is already in view — while the + * manual `hashchange` dispatch lets `ApiHashHighlight` flash the linked target + * so the user can confirm exactly what was copied. + */ +export const ApiAnchor = ({ anchorId, label }: ApiAnchorProps): ReactNode => { + const [copied, setCopied] = useState(false); + + const handleCopy = async (): Promise => { + const origin = globalThis.location?.origin ?? ''; + const pathname = globalThis.location?.pathname ?? ''; + // Update the hash + flash the target first so the anchor still works even + // if the Clipboard API is unavailable (it rejects when the document is + // unfocused or permission is denied). The tick only shows on a real copy. + globalThis.history?.replaceState(null, '', `#${anchorId}`); + globalThis.dispatchEvent?.(new HashChangeEvent('hashchange')); + try { + await globalThis.navigator?.clipboard?.writeText(`${origin}${pathname}#${anchorId}`); + setCopied(true); + globalThis.setTimeout?.(() => setCopied(false), 1200); + } catch { + // Clipboard blocked; the address-bar hash is already updated, so the + // deep-link remains shareable via the URL bar. + } + }; + + const Icon = copied ? Check : Link2; + return ( + + ); +}; diff --git a/docs-site/components/api/api-class-card.tsx b/docs-site/components/api/api-class-card.tsx new file mode 100644 index 00000000..712c0f3f --- /dev/null +++ b/docs-site/components/api/api-class-card.tsx @@ -0,0 +1,372 @@ +import { Fragment } from 'react'; +import type { ReactNode } from 'react'; +import { ApiSignature } from './api-signature'; +import { ApiInheritanceChip } from './api-inheritance-chip'; +import { ApiProse } from './api-prose'; +import { ApiTypeLink } from './api-type-link'; +import { ApiAnchor } from './api-anchor'; +import { parseComment, type ParsedComment } from './parse-comment'; +import { buildClassAnchorMap } from './types'; +import type { ApiClass, ApiMethod, ApiProperty } from './types'; + +const IDENT_RE = /([A-Za-z_]\w*)/g; + +/** + * Same renderer as `ApiSignature.renderTypeTokens` but inlined so property + * rows can linkify their type strings without depending on the signature + * module. Punctuation gets the muted foreground; the identifier itself runs + * through `ApiTypeLink` (keywords take the keyword hue, types take the type + * hue), matching VSCode's default TypeScript semantic highlighting. + */ +const renderTypeTokens = (raw: string): ReactNode[] => { + const out: ReactNode[] = []; + let cursor = 0; + for (const match of raw.matchAll(IDENT_RE)) { + if (match.index === undefined) continue; + if (match.index > cursor) { + out.push( + + {raw.slice(cursor, match.index)} + , + ); + } + out.push(); + cursor = match.index + match[0].length; + } + if (cursor < raw.length) { + out.push( + + {raw.slice(cursor)} + , + ); + } + return out; +}; + +const isOverload = (arr: readonly ApiMethod[], i: number): boolean => { + const name = arr[i]?.name; + if (!name) return false; + const before = i > 0 && arr[i - 1]?.name === name; + const after = i < arr.length - 1 && arr[i + 1]?.name === name; + return before || after; +}; + +const collectChain = (cls: ApiClass): string[] => { + const seen = new Set(); + const out: string[] = []; + const push = (t: string | undefined): void => { + if (!t) return; + const norm = t.trim(); + if (!norm || seen.has(norm)) return; + seen.add(norm); + out.push(norm); + }; + for (const t of cls.extends ?? []) push(t); + const anc = cls.ancestors; + if (Array.isArray(anc)) { + for (const a of anc) push(typeof a === 'string' ? a : undefined); + } else if (anc && typeof anc === 'object') { + for (const key of Object.keys(anc)) push(key); + } + return out; +}; + +/** + * Member names that are TypeScript keywords (rather than identifiers) take + * the keyword hue; every other member name is a plain identifier and renders + * in the foreground colour — matching VSCode's semantic highlighting, where + * `constructor`/`new` are keywords but method/property names are not. + */ +const KEYWORD_MEMBER_NAMES = new Set(['constructor', 'new']); + +const memberNameClass = (name: string): string => + KEYWORD_MEMBER_NAMES.has(name) ? 'text-api-keyword' : 'text-fd-foreground'; + +const DefList = ({ + label, + children, +}: { + readonly label: string; + readonly children: ReactNode; +}): ReactNode => ( +
+
+ {label} +
+
{children}
+
+); + +const ParametersList = ({ + parameters, + parsed, +}: { + readonly parameters: readonly ApiMethod['parameters'][number][]; + readonly parsed: ParsedComment; +}): ReactNode => { + if (parameters.length === 0) return undefined; + return ( + +
    + {parameters.map((p) => { + const description = parsed.params.get(p.name); + return ( +
  • + {p.name} + {description ? ( + <> + + + + ) : undefined} +
  • + ); + })} +
+
+ ); +}; + +const ReturnsBlock = ({ + returnType, + text, +}: { + readonly returnType: string; + readonly text: string | null; +}): ReactNode => { + if (!text && (returnType === 'void' || returnType === 'undefined')) return undefined; + if (!text) return undefined; + return ( + + + + ); +}; + +const RemarksBlock = ({ text }: { readonly text: string | null }): ReactNode => { + if (!text) return undefined; + return ( + + + + ); +}; + +const SeeBlock = ({ items }: { readonly items: readonly string[] }): ReactNode => { + if (items.length === 0) return undefined; + return ( + +
    + {items.map((entry, idx) => ( +
  • + +
  • + ))} +
+
+ ); +}; + +const DeprecatedBanner = ({ text }: { readonly text: string | null }): ReactNode => { + if (text === null) return undefined; + return ( +
+ + Deprecated + + {text ? ( + + ) : undefined} +
+ ); +}; + +const renderMemberRow = ( + anchorId: string, + arr: readonly ApiMethod[], + i: number, +): ReactNode => { + const member = arr[i]!; + const overload = isOverload(arr, i); + const parsed = parseComment(member.comment); + const isDeprecated = parsed.deprecated !== null; + return ( +
  • + + {parsed.description ? ( +
    + +
    + ) : undefined} + + + + + +
  • + ); +}; + +const renderPropertyRow = ( + anchorId: string, + arr: readonly ApiProperty[], + i: number, +): ReactNode => { + const prop = arr[i]!; + const parsed = parseComment(prop.comment); + const isDeprecated = parsed.deprecated !== null; + return ( +
  • +
    + + {prop.name} + + + : + {renderTypeTokens(prop.type)} + {prop.readonly ? ( + + readonly + + ) : undefined} +
    + {parsed.description ? ( +
    + +
    + ) : undefined} + + + +
  • + ); +}; + +const Section = ({ + title, + count, + children, +}: { + readonly title: string; + readonly count: number; + readonly children: ReactNode; +}): ReactNode => ( +
    +

    + {title} + ({count}) +

    +
      {children}
    +
    +); + +export type ApiClassCardProps = { + readonly cls: ApiClass; +}; + +/** + * Single OCCT class card. Composes signature/chip/prose components into + * sections for constructors, static methods, instance methods, and + * properties. Each member row now structures its JSDoc payload — the raw + * comment is parsed (see `parse-comment.ts`) and laid out as a description + * paragraph plus dedicated Parameters / Returns / Remarks / See-also + * blocks, instead of dumping `@param ... @returns ...` text into a single + * paragraph. + * + * Adjacent same-name members are flagged as connected overloads via dashed + * borders. Anchor IDs are deterministic, human-readable + * `-` strings (with a 0-indexed ordinal on overloaded + * tokens); see `buildClassAnchorMap` in `./types.ts`. + * + * Wrapped in `not-prose` so Tailwind Typography's `prose a` underline-all + * rule doesn't bleed into the structured layout (member names, chips, + * cross-reference links each have their own intentional styling). + */ +export const ApiClassCard = ({ cls }: ApiClassCardProps): ReactNode => { + const chain = collectChain(cls); + const classDoc = parseComment(cls.summary); + const anchors = buildClassAnchorMap(cls); + return ( +
    +
    +

    + + {cls.name} + + +

    + {chain.length > 0 ? ( +
    + {chain.map((t) => ( + + + + ))} +
    + ) : undefined} +
    + + {classDoc.description ? ( +
    + +
    + ) : undefined} + + {cls.constructors.length > 0 ? ( +
    + {cls.constructors.map((_, i) => renderMemberRow(anchors.get(`ctor:${i}`)!, cls.constructors, i))} +
    + ) : undefined} + + {cls.staticMethods.length > 0 ? ( +
    + {cls.staticMethods.map((_, i) => renderMemberRow(anchors.get(`static:${i}`)!, cls.staticMethods, i))} +
    + ) : undefined} + + {cls.instanceMethods.length > 0 ? ( +
    + {cls.instanceMethods.map((_, i) => renderMemberRow(anchors.get(`inst:${i}`)!, cls.instanceMethods, i))} +
    + ) : undefined} + + {cls.properties.length > 0 ? ( +
    + {cls.properties.map((_, i) => renderPropertyRow(anchors.get(`prop:${i}`)!, cls.properties, i))} +
    + ) : undefined} +
    + ); +}; diff --git a/docs-site/components/api/api-data.ts b/docs-site/components/api/api-data.ts new file mode 100644 index 00000000..0d8d5fd9 --- /dev/null +++ b/docs-site/components/api/api-data.ts @@ -0,0 +1,29 @@ +import { promises as fs } from 'node:fs'; +import { join, resolve } from 'node:path'; +import type { ApiIndex, ApiShard } from './types'; + +const DATA_DIR = resolve(process.cwd(), 'data'); + +let indexPromise: Promise | undefined; + +export const loadIndex = (): Promise => { + if (!indexPromise) { + indexPromise = fs + .readFile(join(DATA_DIR, 'index.json'), 'utf8') + .then((raw) => JSON.parse(raw) as ApiIndex); + } + return indexPromise; +}; + +const shardCache = new Map>(); + +export const loadShard = (shardKey: string): Promise => { + let promise = shardCache.get(shardKey); + if (!promise) { + promise = fs + .readFile(join(DATA_DIR, `${shardKey}.json`), 'utf8') + .then((raw) => JSON.parse(raw) as ApiShard); + shardCache.set(shardKey, promise); + } + return promise; +}; diff --git a/docs-site/components/api/api-hash-highlight.tsx b/docs-site/components/api/api-hash-highlight.tsx new file mode 100644 index 00000000..21dbc421 --- /dev/null +++ b/docs-site/components/api/api-hash-highlight.tsx @@ -0,0 +1,44 @@ +'use client'; + +import { useEffect } from 'react'; + +const FLASH_CLASS = 'api-anchor-flash'; + +/** + * Scrolls the element matching the current URL hash into view and briefly + * flashes a highlight ring on it. Re-adding the animation class after a forced + * reflow restarts the keyframes even when the same target is re-linked. + */ +const focusHash = (): void => { + const hash = globalThis.location?.hash; + if (!hash || hash.length < 2) return; + const id = decodeURIComponent(hash.slice(1)); + const element = globalThis.document?.getElementById(id); + if (!element) return; + element.scrollIntoView({ behavior: 'smooth', block: 'start' }); + element.classList.remove(FLASH_CLASS); + void element.offsetWidth; + element.classList.add(FLASH_CLASS); + globalThis.setTimeout?.(() => element.classList.remove(FLASH_CLASS), 1600); +}; + +/** + * Client-only behaviour for API anchor deep-links. On initial mount (page + * loaded with a `#Class` / `#Class-Member` hash) and on every subsequent + * `hashchange` — whether from clicking a member-name link or copying a link + * via `ApiAnchor` — smooth-scrolls the target into view and flashes a + * highlight so the linked class/member is easy to spot. Renders nothing. + */ +export const ApiHashHighlight = (): null => { + useEffect(() => { + // Defer the initial pass so the SSR'd target is in the DOM and any native + // hash jump has settled before the smooth-scroll + flash. + const initial = globalThis.setTimeout?.(focusHash, 60); + globalThis.addEventListener?.('hashchange', focusHash); + return () => { + globalThis.clearTimeout?.(initial); + globalThis.removeEventListener?.('hashchange', focusHash); + }; + }, []); + return null; +}; diff --git a/docs-site/components/api/api-hierarchy-tree.tsx b/docs-site/components/api/api-hierarchy-tree.tsx new file mode 100644 index 00000000..b346ba57 --- /dev/null +++ b/docs-site/components/api/api-hierarchy-tree.tsx @@ -0,0 +1,107 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import { loadIndex } from './api-data'; + +const kebab = (input: string): string => + input + .replace(/([a-z\d])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + .toLowerCase(); + +const ApiStat = ({ label, value }: { readonly label: string; readonly value: ReactNode }): ReactNode => ( +
    + + {label} + + {value} +
    +); + +/** + * Renders the full API hierarchy on the `/docs/package/api` landing page as a + * Module / Toolkit / Package tree. Reads `data/index.json` at build time; + * no client JS. + */ +export const ApiHierarchyTree = async (): Promise => { + const index = await loadIndex(); + const manifest = index.manifest; + + return ( +
    +
    +
    + + + + + +
    +
    + +
    + {index.modules.map((ocModule) => { + const moduleSlug = kebab(ocModule.name); + return ( +
    + + + ▸ + + + {ocModule.name} + + + {ocModule.classCount} classes ·{' '} + {ocModule.toolkitCount} toolkits + + +
    + {ocModule.toolkits.map((toolkit) => { + const toolkitSlug = kebab(toolkit.name); + return ( +
    +
    + + {toolkit.name} + + + {toolkit.classCount} classes + +
    +
    + {toolkit.packages.map((pkg) => ( + + {pkg.name} + + ))} +
    +
    + ); + })} +
    +
    + ); + })} +
    +
    + ); +}; diff --git a/docs-site/components/api/api-inheritance-chip.tsx b/docs-site/components/api/api-inheritance-chip.tsx new file mode 100644 index 00000000..8ccbd2dc --- /dev/null +++ b/docs-site/components/api/api-inheritance-chip.tsx @@ -0,0 +1,24 @@ +import type { ReactNode } from 'react'; +import { ApiTypeLink } from './api-type-link'; + +export type ApiInheritanceChipProps = { + readonly type: string; +}; + +/** + * Clickable type chip used in the inheritance chain (`extends`) row of + * `ApiClassCard`. Rendered with the `plain` tone so the parent class name + * reads as a quiet, foreground-coloured chip rather than a coloured type + * reference — the chip's border + muted background already signal it as a + * distinct element. Resolves through `ApiTypeLink`; misses render as a plain + * chip. + */ +export const ApiInheritanceChip = ({ type }: ApiInheritanceChipProps): ReactNode => { + const trimmed = (type ?? '').trim(); + if (!trimmed) return undefined; + return ( + + + + ); +}; diff --git a/docs-site/components/api/api-markdown.tsx b/docs-site/components/api/api-markdown.tsx new file mode 100644 index 00000000..1879efb9 --- /dev/null +++ b/docs-site/components/api/api-markdown.tsx @@ -0,0 +1,156 @@ +'use client'; + +import Link from 'next/link'; +import type { ComponentProps, ReactNode } from 'react'; +import { Streamdown, defaultRemarkPlugins } from 'streamdown'; +import remarkBreaks from 'remark-breaks'; + +/** + * The `remarkPlugins` prop replaces Streamdown's defaults rather than extending + * them, so we re-include the bundled defaults (GFM + code-meta) and append + * `remark-breaks` to honour single-newline line breaks. + */ +const REMARK_PLUGINS = [...Object.values(defaultRemarkPlugins), remarkBreaks]; + +/** + * Matches fumadocs-ui prose `:where(code)` styling (kept in sync with + * `lib/inline-code-text.tsx`) so inline code inside API prose reads the same as + * inline code in the surrounding MDX docs. + */ +const INLINE_CODE_CLASS = + 'rounded-[5px] border border-fd-border bg-fd-muted px-[0.3em] py-[0.15em] font-mono text-[0.85em] font-normal text-fd-foreground'; + +/** + * Cross-reference link styling, carried over verbatim from `ApiTypeLink` so + * `{@link ...}` references resolved into markdown links keep their existing + * appearance: function/class purple, no rest-state underline, a subtle + * underline on hover. + */ +const LINK_CLASS = + 'text-api-fn underline decoration-current/0 underline-offset-2 transition-[text-decoration-color] hover:decoration-current/60'; + +/** + * Renders a markdown link. Internal cross-references (resolved from + * `{@link ...}` to an absolute `/docs/...` path during the server pre-pass) use + * Next's `` for client-side navigation; anything else (absolute URLs in + * the upstream JSDoc) falls back to a new-tab anchor. Both share the API + * cross-reference styling so linkification never visually regresses. + */ +const MarkdownLink = ({ href, children }: ComponentProps<'a'>): ReactNode => { + if (typeof href === 'string' && href.startsWith('/')) { + return ( + + {children} + + ); + } + return ( + + {children} + + ); +}; + +const InlineCode = ({ children }: ComponentProps<'code'>): ReactNode => ( + {children} +); + +const Strong = ({ children }: ComponentProps<'strong'>): ReactNode => ( + {children} +); + +const Emphasis = ({ children }: ComponentProps<'em'>): ReactNode => {children}; + +export type ApiMarkdownProps = { + /** Pre-resolved markdown (with `{@link ...}` already turned into links). */ + readonly markdown: string; + /** Render as inline flow (no block paragraph margins). */ + readonly inline?: boolean; + readonly className?: string; +}; + +/** + * Renders OCCT JSDoc prose as real markdown via Streamdown: bold, lists, + * inline code, fenced code blocks, tables, and paragraph/line breaks. Runs in + * static (non-streaming) mode with link-safety modals disabled and Shiki + * pinned to the GitHub light/dark themes that the rest of the API surface is + * sampled from. + * + * `remark-breaks` is added so the upstream JSDoc's single-newline line breaks + * (one logical statement per line) survive as visible breaks instead of being + * collapsed into run-on paragraphs. + * + * Inline mode collapses paragraphs to plain inline flow so short prose + * (parameter descriptions, `@returns`, `@remarks`, `@see`, `@deprecated`) reads + * as a sentence rather than a stacked block, while still resolving bold, inline + * code, and `{@link}` links. + */ +export const ApiMarkdown = ({ markdown, inline = false, className }: ApiMarkdownProps): ReactNode => { + if (inline) { + return ( + {children}, + inlineCode: ({ children }) => {children}, + strong: ({ children }) => {children}, + em: ({ children }) => {children}, + p: ({ children }) => {children}, + ul: ({ children }) => ( +
      {children}
    + ), + ol: ({ children }) => ( +
      {children}
    + ), + li: ({ children }) =>
  • {children}
  • , + }} + > + {markdown} +
    + ); + } + + return ( + {children}, + inlineCode: ({ children }) => {children}, + strong: ({ children }) => {children}, + em: ({ children }) => {children}, + p: ({ children }) =>

    {children}

    , + ul: ({ children }) => ( +
      {children}
    + ), + ol: ({ children }) => ( +
      {children}
    + ), + li: ({ children }) =>
  • {children}
  • , + h1: ({ children }) =>

    {children}

    , + h2: ({ children }) =>

    {children}

    , + h3: ({ children }) =>

    {children}

    , + h4: ({ children }) =>

    {children}

    , + blockquote: ({ children }) => ( +
    + {children} +
    + ), + hr: () =>
    , + }} + > + {markdown} +
    + ); +}; diff --git a/docs-site/components/api/api-module-index.tsx b/docs-site/components/api/api-module-index.tsx new file mode 100644 index 00000000..864b81be --- /dev/null +++ b/docs-site/components/api/api-module-index.tsx @@ -0,0 +1,55 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import { loadIndex } from './api-data'; + +const kebab = (input: string): string => + input + .replace(/([a-z\d])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + .toLowerCase(); + +export type ApiModuleIndexProps = { + readonly moduleName: string; +}; + +/** + * Toolkit grid for a single OCCT module. Rendered inside Fumadocs' + * ``, which applies Tailwind Typography prose styles by default — + * `not-prose` opts the structured nav out so links don't pick up the + * underline-everything `prose a` rule. + */ +export const ApiModuleIndex = async ({ moduleName }: ApiModuleIndexProps): Promise => { + const index = await loadIndex(); + const ocModule = index.modules.find((m) => m.name === moduleName); + if (!ocModule) { + return
    Unknown module: {moduleName}
    ; + } + const moduleSlug = kebab(ocModule.name); + return ( +
    +
    + {ocModule.toolkits.map((toolkit) => ( + +
    + {toolkit.name} +
    +
    + {toolkit.headline} +
    +
    + {toolkit.classCount} + {toolkit.classCount === 1 ? 'class' : 'classes'} + · + {toolkit.packages.length} + {toolkit.packages.length === 1 ? 'package' : 'packages'} +
    + + ))} +
    +
    + ); +}; diff --git a/docs-site/components/api/api-package-page.tsx b/docs-site/components/api/api-package-page.tsx new file mode 100644 index 00000000..8ca2854b --- /dev/null +++ b/docs-site/components/api/api-package-page.tsx @@ -0,0 +1,88 @@ +import type { ReactNode } from 'react'; +import { slicePackageClasses } from '../../lib/api-package-pagination'; +import { loadShard } from './api-data'; +import { ApiClassCard } from './api-class-card'; +import { ApiHashHighlight } from './api-hash-highlight'; +import { ApiPackagePagination } from './api-package-pagination'; + +export type ApiPackagePageProps = { + readonly shardKey: string; + readonly basePath: string; + readonly page: number; + readonly pageCount: number; + readonly classCount: number; +}; + +/** + * RSC. Reads the shard JSON at build time, renders one `ApiClassCard` per + * bound class inline, and generates a sidebar class jumplist. Build-time + * only — no client JS for the class cards themselves. + */ +export const ApiPackagePage = async ({ + shardKey, + basePath, + page, + pageCount, + classCount, +}: ApiPackagePageProps): Promise => { + const shard = await loadShard(shardKey); + const { slice: classes } = slicePackageClasses(shard.classes ?? [], page); + + if (classes.length === 0) { + return ( +
    + No bound classes in this package. +
    + ); + } + + return ( +
    + + +
    + + +
    + {classes.map((cls) => ( + + ))} +
    +
    + {pageCount > 1 ? ( + + ) : null} +
    + ); +}; diff --git a/docs-site/components/api/api-package-pagination.tsx b/docs-site/components/api/api-package-pagination.tsx new file mode 100644 index 00000000..8c81f113 --- /dev/null +++ b/docs-site/components/api/api-package-pagination.tsx @@ -0,0 +1,51 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; + +export type ApiPackagePaginationProps = { + readonly basePath: string; + readonly page: number; + readonly pageCount: number; + readonly classCount: number; +}; + +export const ApiPackagePagination = ({ + basePath, + page, + pageCount, + classCount, +}: ApiPackagePaginationProps): ReactNode => { + if (pageCount <= 1) return null; + + const pageHref = (target: number): string => + target === 1 ? basePath : `${basePath}/page-${target}`; + + return ( + + ); +}; diff --git a/docs-site/components/api/api-prose.tsx b/docs-site/components/api/api-prose.tsx new file mode 100644 index 00000000..15dc7525 --- /dev/null +++ b/docs-site/components/api/api-prose.tsx @@ -0,0 +1,98 @@ +import type { ReactNode } from 'react'; +import { loadTypeIndex } from '../../lib/api-type-index'; +import { ApiMarkdown } from './api-markdown'; + +export type ApiProseProps = { + readonly text: string; + /** Render as inline flow (parameter descriptions, `@returns`, `@see`, …). */ + readonly inline?: boolean; + readonly className?: string; +}; + +const LINK_RE = /\{@link\s+([^}|]+?)(?:\s*\|\s*`?([^`}]+?)`?)?\s*\}/g; + +/** + * Splits prose into alternating non-code / code segments. Fenced blocks + * (```` ``` ````) and inline code (`` ` `` or `` `` ``) are captured so callers + * can transform only the prose between them. + */ +const CODE_SEGMENT_RE = /(```[\s\S]*?```|``[^`]*``|`[^`]*`)/g; + +const isCodeSegment = (segment: string): boolean => segment.startsWith('`'); + +/** + * Strips one optional layer of backticks/whitespace from a `{@link}` label so + * it can be re-wrapped consistently as inline code in the emitted markdown. + */ +const cleanLabel = (raw: string): string => raw.trim().replace(/^`(.*)`$/s, '$1').trim(); + +/** + * Escapes stray `<`/`>` that appear in prose (e.g. the C++ template arguments + * in `BRepGraph_Iterator`). Left unescaped, Streamdown's HTML + * sanitizer parses them as raw HTML tags and silently drops the enclosed text. + * Code spans and fenced blocks are skipped so C++ snippets containing `<`/`>` + * (and `&`) render verbatim. + */ +const escapeStrayHtml = (text: string): string => + text + .split(CODE_SEGMENT_RE) + .map((segment) => + isCodeSegment(segment) + ? segment + : segment.replace(/&(?![a-zA-Z#][a-zA-Z0-9]*;)/g, '&').replace(//g, '>'), + ) + .join(''); + +/** + * Resolves OCCT JSDoc prose into standard markdown so it can be rendered by + * `ApiMarkdown` (Streamdown). The only transform applied here is turning + * `{@link Target | Label}` references into markdown links — every other + * markdown construct (bold, lists, inline/fenced code, paragraphs) is authored + * in the upstream comment and passes through untouched. + * + * Targets are resolved against the build-time `data/api-type-index.json`: + * + * - resolved identifier → `[`Label`](/docs/.../shard#fragment)` (a real + * markdown link; the label stays wrapped in code so cross-references read as + * monospace identifiers, matching the previous `ApiTypeLink` rendering); + * - denylisted / unresolved identifier → `` `Label` `` (inline code, no link), + * so nothing turns into a dead link. + * + * Runs on the server (RSC) because the type index lives on disk. + */ +const resolveLinks = async (text: string): Promise => { + if (!text.includes('{@link')) return text; + const { denylist, entries } = await loadTypeIndex(); + return text.replace(LINK_RE, (_match, rawTarget: string, rawLabel: string | undefined) => { + const target = rawTarget.trim(); + const label = cleanLabel(rawLabel ?? target); + const code = `\`${label}\``; + if (denylist.has(target) || denylist.has(target.toLowerCase())) return code; + const hit = entries.get(target); + if (!hit) return code; + return `[${code}](${hit.url}#${hit.fragment})`; + }); +}; + +const resolveProseMarkdown = async (text: string): Promise => { + if (!text) return ''; + // Resolve `{@link}` first (targets may contain template `<...>`), then escape + // any remaining stray angle brackets in the prose. Resolved labels are wrapped + // in code spans, so the escape pass leaves them — and any C++ snippets — + // untouched. + const linked = await resolveLinks(text); + return escapeStrayHtml(linked); +}; + +/** + * Renders OCCT JSDoc prose as real markdown. `{@link Target | Label}` + * references are resolved to markdown links (cross-package navigation comes + * from the build-time `nameToHit` map) before the text is handed to + * `ApiMarkdown`, which renders bold, lists, inline/fenced code, tables, and + * paragraph/line breaks via Streamdown. + */ +export const ApiProse = async ({ text, inline, className }: ApiProseProps): Promise => { + if (!text) return undefined; + const markdown = await resolveProseMarkdown(text); + return ; +}; diff --git a/docs-site/components/api/api-signature.tsx b/docs-site/components/api/api-signature.tsx new file mode 100644 index 00000000..cbf28c55 --- /dev/null +++ b/docs-site/components/api/api-signature.tsx @@ -0,0 +1,84 @@ +import { Fragment } from 'react'; +import type { ReactNode } from 'react'; +import { ApiTypeLink } from './api-type-link'; +import type { ApiMethod, ApiParameter } from './types'; + +const IDENT_RE = /([A-Za-z_]\w*)/g; + +/** + * Splits a raw type string into linkified tokens. Identifiers run through + * `ApiTypeLink` (keywords take the keyword hue, types take the type hue); + * everything else (punctuation, generics, whitespace) is preserved verbatim + * and tinted with the muted foreground, matching VSCode's treatment of + * punctuation in a type annotation. + */ +const renderTypeTokens = (raw: string): ReactNode[] => { + const out: ReactNode[] = []; + let cursor = 0; + for (const match of raw.matchAll(IDENT_RE)) { + if (match.index === undefined) continue; + if (match.index > cursor) { + out.push( + + {raw.slice(cursor, match.index)} + , + ); + } + out.push(); + cursor = match.index + match[0].length; + } + if (cursor < raw.length) { + out.push( + + {raw.slice(cursor)} + , + ); + } + return out; +}; + +const renderParameter = (param: ApiParameter, idx: number): ReactNode => { + const prefix = param.rest ? '...' : ''; + const opt = param.optional ? '?' : ''; + return ( + + {prefix ? {prefix} : undefined} + {param.name} + {opt ? {opt} : undefined} + : + {renderTypeTokens(param.type)} + + ); +}; + +export type ApiSignatureProps = { + readonly method: ApiMethod; +}; + +/** + * Overload-aware signature renderer. Tokens are coloured to match VSCode's + * default TypeScript semantic highlighting: + * + * keyword magenta (keywords, via `ApiTypeLink`) + * type / class teal (OCCT class identifiers, primitive types) + * variable foreground (parameter names) + * punctuation muted (brackets, `:`, `,`, `?`, `...`, separators) + */ +export const ApiSignature = ({ method }: ApiSignatureProps): ReactNode => { + const params = (method.parameters ?? []).map(renderParameter); + const ret = method.returnType ?? 'void'; + return ( + + ( + {params.map((node, idx) => ( + + {idx > 0 ? , : undefined} + {node} + + ))} + ) + : + {renderTypeTokens(ret)} + + ); +}; diff --git a/docs-site/components/api/api-toolkit-index.tsx b/docs-site/components/api/api-toolkit-index.tsx new file mode 100644 index 00000000..9186c2dc --- /dev/null +++ b/docs-site/components/api/api-toolkit-index.tsx @@ -0,0 +1,57 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import { loadIndex } from './api-data'; + +const kebab = (input: string): string => + input + .replace(/([a-z\d])([A-Z])/g, '$1-$2') + .replace(/([A-Z])([A-Z][a-z])/g, '$1-$2') + .toLowerCase(); + +export type ApiToolkitIndexProps = { + readonly moduleName: string; + readonly toolkitName: string; +}; + +/** + * Package grid for a single toolkit. Uses `not-prose` to opt out of + * Fumadocs prose typography (which underlines every link by default). + */ +export const ApiToolkitIndex = async ({ + moduleName, + toolkitName, +}: ApiToolkitIndexProps): Promise => { + const index = await loadIndex(); + const ocModule = index.modules.find((m) => m.name === moduleName); + const toolkit = ocModule?.toolkits.find((t) => t.name === toolkitName); + if (!ocModule || !toolkit) { + return ( +
    + Unknown toolkit: {moduleName}/{toolkitName} +
    + ); + } + const moduleSlug = kebab(ocModule.name); + const toolkitSlug = kebab(toolkit.name); + return ( +
    +
    + {toolkit.packages.map((pkg) => ( + +
    + {pkg.name} +
    +
    + {pkg.classes.length} + {pkg.classes.length === 1 ? 'class' : 'classes'} +
    + + ))} +
    +
    + ); +}; diff --git a/docs-site/components/api/api-type-link.tsx b/docs-site/components/api/api-type-link.tsx new file mode 100644 index 00000000..2239e7ae --- /dev/null +++ b/docs-site/components/api/api-type-link.tsx @@ -0,0 +1,89 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import { loadTypeIndex } from '../../lib/api-type-index'; + +export type ApiTypeLinkProps = { + readonly name: string; + readonly children?: ReactNode; + /** + * Colour tone for the rendered token: + * - `type` (default) — VSCode semantic highlighting for a type position: + * keywords take the keyword hue, everything else (primitives, resolved + * and unresolved OCCT identifiers) takes the type hue. + * - `plain` — foreground colour regardless of resolution. Used by the + * `extends` inheritance chip, which the design keeps as a quiet, + * foreground-coloured chip rather than a coloured type reference. + */ + readonly tone?: 'type' | 'plain'; +}; + +/** + * TypeScript keywords that the build-time denylist + * (`data/api-type-index.json`) lumps together with primitive type names. + * VSCode's semantic highlighting colours these two groups differently — true + * keywords (`extends`, `readonly`, …) take the keyword hue, while primitive + * types (`void`, `boolean`, `number`, …) take the type hue — so we split the + * flat denylist back apart here. + */ +const TS_KEYWORDS = new Set([ + 'readonly', + 'infer', + 'abstract', + 'declare', + 'extends', + 'implements', + 'keyof', + 'this', + 'return', + 'new', + 'typeof', +]); + +/** + * Inline type reference. Colours follow VSCode's default TypeScript semantic + * highlighting so a signature reads like the editor would render it: + * + * - TypeScript keywords (`readonly`, `extends`, …) → keyword hue, no link. + * - Primitive types (`void`, `boolean`, `number`, …) → type hue, no link. + * - Resolved OCCT identifiers (`TopoDS_Face`, `Geom_Surface`, …) → type hue, + * navigable Next link with a subtle hover underline (no rest-state + * underline — matches the rest of the API surface). + * - Unresolved identifiers → type hue, no link (still a type position). + * + * With `tone="plain"` every branch renders in plain foreground instead, used + * by the `extends` inheritance chip. + * + * Resolution data comes from the build-time `data/api-type-index.json`. + * Async RSC — no client JS for the lookup. + */ +export const ApiTypeLink = async ({ + name, + children, + tone = 'type', +}: ApiTypeLinkProps): Promise => { + const trimmed = name.trim(); + const label = children ?? trimmed; + const { denylist, entries } = await loadTypeIndex(); + + if (denylist.has(trimmed) || denylist.has(trimmed.toLowerCase())) { + const isKeyword = TS_KEYWORDS.has(trimmed) || TS_KEYWORDS.has(trimmed.toLowerCase()); + const keywordClass = isKeyword ? 'text-api-keyword' : 'text-api-type'; + return {label}; + } + + const colorClass = tone === 'plain' ? 'text-fd-foreground' : 'text-api-type'; + const hit = entries.get(trimmed); + if (!hit) { + return {label}; + } + return ( + + {label} + + ); +}; diff --git a/docs-site/components/api/parse-comment.ts b/docs-site/components/api/parse-comment.ts new file mode 100644 index 00000000..151006db --- /dev/null +++ b/docs-site/components/api/parse-comment.ts @@ -0,0 +1,128 @@ +/** + * Parses an OCCT-flavored JSDoc comment into a structured shape so the + * renderer can lay out each tag in its own dedicated section instead of + * dumping the raw text (`@param ... @returns ...`) into a single paragraph. + * + * Observed tag inventory across all shipped shards (May 2026): + * + * @param — 10045 occurrences (by far the most common; each binds a + * description to one of the method's typed parameters) + * @returns — 3051 occurrences + * @link — 858 occurrences (handled separately by `ApiProse`) + * @remarks — 243 occurrences + * @deprecated — 172 occurrences + * @see — 44 occurrences + * @Returns — 2 occurrences (capitalisation typo upstream; aliased) + * + * `{@link ...}` references stay embedded in each description fragment and + * are resolved downstream by `ApiProse`, so the parser deliberately does + * not try to interpret them itself. + */ + +export type ParsedComment = { + readonly description: string; + readonly params: ReadonlyMap; + readonly returns: string | null; + readonly remarks: string | null; + readonly deprecated: string | null; + readonly see: readonly string[]; +}; + +const EMPTY: ParsedComment = { + description: '', + params: new Map(), + returns: null, + remarks: null, + deprecated: null, + see: [], +}; + +/** + * A block-level tag boundary. Tags are matched only at the start of a line + * after optional whitespace; this prevents stray `@param` strings inside + * the description body from being treated as section delimiters. The regex + * also tolerates one-leading-asterisk prose (OCCT JSDoc sometimes retains + * the leading `*` even after the bindgen strip). + */ +const BLOCK_TAG_RE = /(^|\n)\s*\*?\s*@([a-zA-Z]+)\b[ \t]*/g; + +const collapseWhitespace = (text: string): string => + text.replace(/[ \t]+\n/g, '\n').replace(/\n{3,}/g, '\n\n').trim(); + +/** + * Split a `@param` body into `(name, description)`. The first whitespace- + * separated token is the parameter name; the rest is its description. + * Handles the upstream pattern `@param theFoo description ...` and + * gracefully degrades when the description is empty. + */ +const splitParam = (raw: string): { name: string; description: string } | null => { + const trimmed = raw.trim(); + if (!trimmed) return null; + const match = trimmed.match(/^([A-Za-z_][\w$]*)\s*(.*)$/s); + if (!match) return null; + return { name: match[1]!, description: match[2]!.trim() }; +}; + +export const parseComment = (raw: string | undefined | null): ParsedComment => { + if (!raw || !raw.trim()) return EMPTY; + + const segments: Array<{ tag: string | null; body: string }> = []; + let cursor = 0; + let currentTag: string | null = null; + + BLOCK_TAG_RE.lastIndex = 0; + for (const match of raw.matchAll(BLOCK_TAG_RE)) { + const startOfTag = match.index! + match[1]!.length; + segments.push({ tag: currentTag, body: raw.slice(cursor, startOfTag) }); + currentTag = match[2]!.toLowerCase(); + cursor = match.index! + match[0].length; + } + // Always push the trailing segment, even when its body is empty — this is + // what makes a body-less `@deprecated` register as a present-but-empty + // marker rather than disappearing entirely. + segments.push({ tag: currentTag, body: raw.slice(cursor) }); + + let description = ''; + const params = new Map(); + let returns: string | null = null; + let remarks: string | null = null; + let deprecated: string | null = null; + const see: string[] = []; + + for (const seg of segments) { + const body = collapseWhitespace(seg.body); + if (seg.tag === null) { + description = body; + continue; + } + switch (seg.tag) { + case 'param': { + const parsed = splitParam(body); + if (parsed && parsed.name) params.set(parsed.name, parsed.description); + break; + } + case 'returns': + case 'return': { + returns = body || returns; + break; + } + case 'remarks': + case 'remark': { + remarks = body || remarks; + break; + } + case 'deprecated': { + deprecated = body || ''; + break; + } + case 'see': { + if (body) see.push(body); + break; + } + default: + break; + } + } + + return { description, params, returns, remarks, deprecated, see }; +}; diff --git a/docs-site/components/api/types.ts b/docs-site/components/api/types.ts new file mode 100644 index 00000000..b98f3a8a --- /dev/null +++ b/docs-site/components/api/types.ts @@ -0,0 +1,166 @@ +export type ApiParameter = { + readonly name: string; + readonly type: string; + readonly optional: boolean; + readonly rest: boolean; +}; + +export type ApiMethod = { + readonly name: string; + readonly signature: string; + readonly parameters: readonly ApiParameter[]; + readonly returnType: string; + readonly comment: string; +}; + +export type ApiProperty = { + readonly name: string; + readonly type: string; + readonly comment: string; + readonly readonly?: boolean; +}; + +export type ApiClass = { + readonly name: string; + readonly kind: 'class' | 'interface'; + readonly summary: string; + readonly extends: readonly string[]; + readonly ancestors: readonly string[] | Record; + readonly constructors: readonly ApiMethod[]; + readonly staticMethods: readonly ApiMethod[]; + readonly instanceMethods: readonly ApiMethod[]; + readonly properties: readonly ApiProperty[]; +}; + +export type ApiShard = { + readonly schema: number; + readonly shard: string; + readonly generatedAt: string; + readonly classes: readonly ApiClass[]; +}; + +export type ApiManifest = { + readonly wasm_bytes?: number; + readonly validation_passed?: boolean; + readonly requested?: number; + readonly compiled?: number; + readonly built_at?: string; +}; + +export type ApiIndexPackage = { + readonly name: string; + readonly shard: string; + readonly classes: ReadonlyArray<{ + readonly name: string; + readonly kind: string; + readonly extends: readonly string[]; + readonly summary: string; + readonly members: { readonly constructors: number; readonly staticMethods: number; readonly instanceMethods: number; readonly properties: number }; + }>; +}; + +export type ApiIndexToolkit = { + readonly name: string; + readonly headline: string; + readonly classCount: number; + readonly packages: readonly ApiIndexPackage[]; +}; + +export type ApiIndexModule = { + readonly name: string; + readonly headline: string; + readonly classCount: number; + readonly toolkitCount: number; + readonly toolkits: readonly ApiIndexToolkit[]; +}; + +export type ApiIndex = { + readonly schema: number; + readonly manifest: ApiManifest; + readonly totals: { + readonly modules: number; + readonly toolkits: number; + readonly packages: number; + readonly classes: number; + readonly searchEntries: number; + }; + readonly quickLinks: ReadonlyArray<{ + readonly name: string; + readonly kind: string; + readonly p: string; + readonly s: string; + }>; + readonly modules: readonly ApiIndexModule[]; + readonly searchIndex: ReadonlyArray<{ + readonly n: string; + readonly k: string; + readonly p: string; + readonly s: string; + readonly a: string; + readonly q: string; + }>; +}; + +export type ApiSearchEntry = { + readonly id: string; + readonly title: string; + readonly description: string; + readonly url: string; + readonly tag: string; + readonly structured: { contents: ReadonlyArray<{ heading: string; content: string }> }; +}; + +export type MemberKind = 'ctor' | 'static' | 'inst' | 'prop'; + +/** + * Anchor token for a member. Constructors render under the literal + * `Constructor` token (the upstream JSDoc names them `constructor`, but the + * capitalised, kind-agnostic token reads better in a URL and avoids clashing + * with the TypeScript keyword); every other member uses its real name. + */ +const anchorToken = (kind: MemberKind, name: string): string => + kind === 'ctor' ? 'Constructor' : name; + +/** + * Builds deterministic, human-readable anchor ids for every member of a class. + * + * Scheme: `-`. The hyphen is the single level + * separator as we descend from class to member, so the underscores inside + * OCCT class names (`Message_Gravity`) and member/enum-value names + * (`Message_Trace`) stay unambiguous — e.g. `Message_Gravity-Message_Trace`. + * + * Overloaded members (and multi-constructor classes) get a 0-indexed ordinal + * appended directly to the token: `…-Clear0`, `…-Clear1`, `…-Constructor0`, + * `…-Constructor1`. The ordinal is the member's position within its own + * same-token group, counted in stable declaration order, so adding an + * *unrelated* member never shifts an existing anchor. Members whose token is + * unique in the class stay clean with no number (`…-GetAlerts`). + * + * The result is keyed by `:` (the member's kind + array index) + * so the caller can map each rendered row back to its anchor. Returned ids are + * collision-free: distinct tokens differ by token, shared tokens differ by + * ordinal. + */ +export const buildClassAnchorMap = (cls: ApiClass): ReadonlyMap => { + const entries: ReadonlyArray<{ readonly key: string; readonly token: string }> = [ + ...cls.constructors.map((_, i) => ({ key: `ctor:${i}`, token: anchorToken('ctor', 'constructor') })), + ...cls.staticMethods.map((m, i) => ({ key: `static:${i}`, token: anchorToken('static', m.name) })), + ...cls.instanceMethods.map((m, i) => ({ key: `inst:${i}`, token: anchorToken('inst', m.name) })), + ...cls.properties.map((p, i) => ({ key: `prop:${i}`, token: anchorToken('prop', p.name) })), + ]; + + const totalByToken = new Map(); + for (const entry of entries) { + totalByToken.set(entry.token, (totalByToken.get(entry.token) ?? 0) + 1); + } + + const ordinalByToken = new Map(); + const anchors = new Map(); + for (const entry of entries) { + const ordinal = ordinalByToken.get(entry.token) ?? 0; + ordinalByToken.set(entry.token, ordinal + 1); + const needsOrdinal = (totalByToken.get(entry.token) ?? 1) > 1; + anchors.set(entry.key, `${cls.name}-${entry.token}${needsOrdinal ? ordinal : ''}`); + } + return anchors; +}; diff --git a/docs-site/components/home-footer.tsx b/docs-site/components/home-footer.tsx new file mode 100644 index 00000000..8db29e17 --- /dev/null +++ b/docs-site/components/home-footer.tsx @@ -0,0 +1,93 @@ +import Link from 'next/link'; +import type { ReactNode } from 'react'; +import { GITHUB_REPO_URL } from '../lib/site'; + +const UPSTREAM_REPO_URL = 'https://github.com/donalffons/opencascade.js'; +const LICENSE_URL = `${GITHUB_REPO_URL}/blob/master/LICENSE`; + +const footerLinkClass = 'text-fd-muted-foreground hover:text-fd-primary hover:underline'; + +const FooterColumn = ({ + title, + children, +}: { + readonly title: string; + readonly children: ReactNode; +}): ReactNode => ( +
    +
    {title}
    +
      {children}
    +
    +); + +const FooterExternalLink = ({ + href, + children, +}: { + readonly href: string; + readonly children: ReactNode; +}): ReactNode => ( + + {children} + +); + +export const HomeFooter = (): ReactNode => { + return ( +
    +
    + +
  • + GitHub repository +
  • +
  • + Discussions +
  • +
  • + Issues +
  • +
    + + +
  • + + llms.txt + +
  • +
  • + + llms-full.txt + +
  • +
  • + + API reference + +
  • +
    + + +
  • + LGPL-2.1-only WITH OCCT Exception +
  • +
  • + Maintained by Tau +
  • +
  • + + FAQ + +
  • +
    +
    + +

    + OpenCascade.js — fork of{' '} + + donalffons/opencascade.js + + . Upstream OCCT © OPEN CASCADE SAS. +

    +
    + ); +}; diff --git a/docs-site/components/mermaid.tsx b/docs-site/components/mermaid.tsx new file mode 100644 index 00000000..2624d0d5 --- /dev/null +++ b/docs-site/components/mermaid.tsx @@ -0,0 +1,88 @@ +'use client'; + +import { useEffect, useRef, useState } from 'react'; +import type { ReactNode } from 'react'; + +const fontFamily = "'Inter', ui-sans-serif, system-ui, sans-serif"; + +let mermaidIdCounter = 0; + +const MermaidRenderer = ({ chart }: { readonly chart: string }): ReactNode => { + const [id] = useState(() => `mermaid-${mermaidIdCounter++}`); + const [svg, setSvg] = useState(); + const [isDark, setIsDark] = useState(false); + const containerRef = useRef(null); + const bindFunctionsRef = useRef<((element: Element) => void) | undefined>(undefined); + + useEffect(() => { + const media = globalThis.matchMedia?.('(prefers-color-scheme: dark)'); + const detect = (): void => { + const root = document.documentElement; + setIsDark(root.classList.contains('dark') || media?.matches === true); + }; + detect(); + const observer = new MutationObserver(detect); + observer.observe(document.documentElement, { attributes: true, attributeFilter: ['class'] }); + media?.addEventListener('change', detect); + return () => { + observer.disconnect(); + media?.removeEventListener('change', detect); + }; + }, []); + + useEffect(() => { + let cancelled = false; + // Reset render state when chart/theme inputs change. + // eslint-disable-next-line react-hooks/set-state-in-effect -- async mermaid render owns the follow-up setState + setSvg(undefined); + + void (async () => { + const { default: mermaid } = await import('mermaid'); + if (cancelled) return; + + mermaid.initialize({ + startOnLoad: false, + securityLevel: 'loose', + fontFamily, + theme: isDark ? 'dark' : 'default', + flowchart: { curve: 'basis', padding: 20 }, + }); + + const result = await mermaid.render(id, chart.replaceAll(String.raw`\n`, '\n')); + if (cancelled) return; + bindFunctionsRef.current = result.bindFunctions; + setSvg(result.svg); + })(); + + return () => { + cancelled = true; + }; + }, [chart, isDark, id]); + + useEffect(() => { + if (containerRef.current && bindFunctionsRef.current) { + bindFunctionsRef.current(containerRef.current); + bindFunctionsRef.current = undefined; + } + }, [svg]); + + if (!svg) return undefined; + + return ( +
    +
    +
    + ); +}; + +/** + * Renders a Mermaid diagram from chart definition text. Client-only. + */ +export const Mermaid = ({ chart }: { readonly chart: string }): ReactNode => { + return ; +}; diff --git a/docs-site/components/ocjs-example.tsx b/docs-site/components/ocjs-example.tsx new file mode 100644 index 00000000..ab05aaaf --- /dev/null +++ b/docs-site/components/ocjs-example.tsx @@ -0,0 +1,104 @@ +'use client'; + +import { useEffect, useState } from 'react'; +import type { ReactNode } from 'react'; +import { ThreeViewer } from './three-viewer'; + +export type OcjsExampleProps = { + readonly title: string; + readonly description?: string; + /** Raw TypeScript source string — typically supplied via a server-side `?raw` import. */ + readonly source: string; + /** Function returning a GLB byte array. Receives the lazy-initialised OCCT module. */ + readonly run: (oc: unknown) => Promise; + readonly defaultOpen?: boolean; +}; + +const initState: { promise?: Promise } = {}; +const lazyInitOcct = async (): Promise => { + if (!initState.promise) { + initState.promise = (async () => { + const initModule: { default: (options?: { locateFile?: (file: string) => string }) => Promise } = + await import('@taucad/opencascade.js'); + return initModule.default({ + locateFile: (file: string) => `/${file}`, + }); + })(); + } + return initState.promise; +}; + +/** + * Embeds a runnable OCCT example inside an MDX page. The `run` callback is + * executed in the browser against a lazily-initialised `@taucad/opencascade.js` + * instance and the resulting GLB bytes are handed to ``. + */ +export const OcjsExample = ({ + title, + description, + source, + run, + defaultOpen = false, +}: OcjsExampleProps): ReactNode => { + const [glb, setGlb] = useState(undefined); + const [error, setError] = useState(undefined); + const [sourceOpen, setSourceOpen] = useState(defaultOpen); + const [running, setRunning] = useState(true); + + useEffect(() => { + let cancelled = false; + // eslint-disable-next-line react-hooks/set-state-in-effect -- async example runner owns the follow-up setState + setRunning(true); + setError(undefined); + void (async () => { + try { + const oc = await lazyInitOcct(); + const bytes = await run(oc); + if (cancelled) return; + setGlb(bytes); + } catch (caught: unknown) { + if (cancelled) return; + setError(caught instanceof Error ? caught.message : String(caught)); + } finally { + if (!cancelled) setRunning(false); + } + })(); + return () => { + cancelled = true; + }; + }, [run]); + + return ( +
    +
    +
    +
    {title}
    + {description ? ( +
    {description}
    + ) : undefined} +
    + +
    +
    + {running ? ( +
    Initialising OCCT…
    + ) : undefined} + {error ? ( +
    Example failed: {error}
    + ) : undefined} + {glb ? : undefined} +
    + {sourceOpen ? ( +
    +          {source}
    +        
    + ) : undefined} +
    + ); +}; diff --git a/docs-site/components/tag-badge.tsx b/docs-site/components/tag-badge.tsx new file mode 100644 index 00000000..acf855c2 --- /dev/null +++ b/docs-site/components/tag-badge.tsx @@ -0,0 +1,36 @@ +'use client'; + +import { useState } from 'react'; +import type { ReactNode } from 'react'; + +export type TagBadgeProps = { + /** GHCR tag, e.g. `ghcr.io/taucad/opencascade.js:3.0.0-beta.5` */ + readonly tag: string; + readonly label?: string; +}; + +/** + * Inline pill rendering a container image / GHCR tag with one-click copy. + */ +export const TagBadge = ({ tag, label }: TagBadgeProps): ReactNode => { + const [copied, setCopied] = useState(false); + const display = label ?? tag; + + const handleClick = async (): Promise => { + await globalThis.navigator?.clipboard?.writeText(tag); + setCopied(true); + globalThis.setTimeout?.(() => setCopied(false), 1200); + }; + + return ( + + ); +}; diff --git a/docs-site/components/three-viewer.tsx b/docs-site/components/three-viewer.tsx new file mode 100644 index 00000000..d343d629 --- /dev/null +++ b/docs-site/components/three-viewer.tsx @@ -0,0 +1,95 @@ +'use client'; + +import { useEffect, useRef } from 'react'; +import type { ReactNode } from 'react'; + +export type ThreeViewerProps = { + readonly glb: Uint8Array | undefined; + readonly height?: number; + readonly background?: number; +}; + +/** + * Tiny three.js GLB viewer with orbit controls. Used inside `` + * to render the result of an in-browser OCCT example. Mounts client-only. + */ +export const ThreeViewer = ({ + glb, + height = 360, + background = 0x111111, +}: ThreeViewerProps): ReactNode => { + const containerRef = useRef(null); + + useEffect(() => { + if (!glb || !containerRef.current) return; + + let cancelled = false; + let cleanup: (() => void) | undefined; + + void (async () => { + const THREE = await import('three'); + const { GLTFLoader } = await import('three/examples/jsm/loaders/GLTFLoader.js'); + const { OrbitControls } = await import('three/examples/jsm/controls/OrbitControls.js'); + if (cancelled || !containerRef.current) return; + + const container = containerRef.current; + const width = container.clientWidth || 600; + + const scene = new THREE.Scene(); + scene.background = new THREE.Color(background); + + const camera = new THREE.PerspectiveCamera(45, width / height, 0.1, 5000); + camera.position.set(100, 100, 100); + + scene.add(new THREE.AmbientLight(0xffffff, 0.5)); + const dirLight = new THREE.DirectionalLight(0xffffff, 1); + dirLight.position.set(1, 1, 1); + scene.add(dirLight); + + const renderer = new THREE.WebGLRenderer({ antialias: true }); + renderer.setSize(width, height, false); + renderer.setPixelRatio(globalThis.devicePixelRatio || 1); + container.replaceChildren(renderer.domElement); + + const controls = new OrbitControls(camera, renderer.domElement); + controls.target.set(0, 0, 0); + + const loader = new GLTFLoader(); + const blob = new Blob([glb as BlobPart], { type: 'model/gltf-binary' }); + const url = URL.createObjectURL(blob); + loader.load(url, (gltf) => { + scene.add(gltf.scene); + URL.revokeObjectURL(url); + }); + + let raf = 0; + const tick = (): void => { + controls.update(); + renderer.render(scene, camera); + raf = globalThis.requestAnimationFrame(tick); + }; + tick(); + + cleanup = () => { + globalThis.cancelAnimationFrame(raf); + controls.dispose(); + renderer.dispose(); + container.replaceChildren(); + }; + })(); + + return () => { + cancelled = true; + cleanup?.(); + }; + }, [glb, height, background]); + + return ( +
    + ); +}; diff --git a/docs-site/content/docs/meta.json b/docs-site/content/docs/meta.json new file mode 100644 index 00000000..320cd42d --- /dev/null +++ b/docs-site/content/docs/meta.json @@ -0,0 +1,4 @@ +{ + "title": "OpenCascade.js", + "pages": ["package", "toolchain"] +} diff --git a/docs-site/content/docs/package/concepts/calling-occt-from-js.mdx b/docs-site/content/docs/package/concepts/calling-occt-from-js.mdx new file mode 100644 index 00000000..eba4807c --- /dev/null +++ b/docs-site/content/docs/package/concepts/calling-occt-from-js.mdx @@ -0,0 +1,167 @@ +--- +title: Calling OCCT from JavaScript +description: How OCCT C++ surfaces project into JS — suffix-free overloads, val-dispatched calls, string enums, default args, and the TopoDS bridge. +--- + +The OCJS bindings present OCCT to JavaScript through a handful of conventions +that hide most of the C++ idioms. This page covers the call-site rules that +apply to every API surface — constructors, methods, statics, and downcasts. For +the shape of what comes back, see [Return shapes](./return-shapes). + +## A worked example, top to bottom + +Most of the rules below show up in this 8-line construction of an arc-edge: + +```typescript +using p1 = new oc.gp_Pnt(0, 0, 0); +using p2 = new oc.gp_Pnt(5, 0, 5); +using p3 = new oc.gp_Pnt(10, 0, 0); +using arcMaker = new oc.GC_MakeArcOfCircle(p1, p2, p3); +using curve = arcMaker.Value(); // Geom_TrimmedCurve smart pointer +using edge = new oc.BRepBuilderAPI_MakeEdge(curve); +using shape = edge.Edge(); // TopoDS_Edge +using wire = new oc.BRepBuilderAPI_MakeWire(shape); +``` + +No `_2` / `_3` suffixes. No `Handle_*` wrappers. No `.get()` unwraps. No +manual `.delete()`. The rest of the page explains why each line works. + +## No more `_N` overload suffixes + +OCJS V3 removed the legacy `_N` overload suffixes. You always call the +suffix-free constructor or method; the runtime picks the right overload based +on arity and argument shape. + +```typescript +using p = new oc.gp_Pnt(1, 2, 3); // not gp_Pnt_3 +using box1 = new oc.BRepPrimAPI_MakeBox(10, 20, 30); +using origin = new oc.gp_Pnt(1, 2, 3); +using box2 = new oc.BRepPrimAPI_MakeBox(origin, 10, 20, 30); +using corner = new oc.gp_Pnt(5, 10, 15); +using box3 = new oc.BRepPrimAPI_MakeBox(origin, corner); +``` + +`gp_Pnt`, `BRepPrimAPI_MakeBox`, `BRepBuilderAPI_MakeEdge` — every multi-arity +constructor surface works this way. + +## Overload dispatch is by argument shape + +Same-arity overloads are picked at call time by a small JS-side dispatcher. +You don't pick the overload — you pass arguments of the right shape and the +binding routes the call. + +Three kinds of dispatch you'll see most often: + +- **By class type** — `BRepBuilderAPI_MakeEdge(gp_Pnt, gp_Pnt)` and + `BRepBuilderAPI_MakeEdge(TopoDS_Vertex, TopoDS_Vertex)` both have arity 2; + the dispatcher routes by `instanceof`. +- **By integer vs float** — `gp_XY.SetCoord(1, 5.0)` routes to the indexed + overload (`Number.isInteger(1) === true`). Float-only forms use the + coordinate overload. +- **By enum value** — passing `oc.IntSurf_TypeTrans.IntSurf_In` selects the + enum-tagged constructor variant. + +Where C++ has parallel `int` and `size_t` overloads the bindgen collapses them +to a single JS signature. `list.FindKey(1)` works without disambiguation. + +## Methods returning values use `()` + +Every value-returning accessor is a method call, not a property. The most +common gotcha is reading a `gp_Pnt` as if its coordinates were fields: + +```typescript +// Right — method calls. +using p = new oc.gp_Pnt(1, 2, 3); +console.log(p.X(), p.Y(), p.Z()); // 1 2 3 + +// Wrong — these are the bound functions, not numbers. +console.log(p.X, p.Y, p.Z); // [Function: X] [Function: Y] [Function: Z] +``` + +The same rule applies to `face.IsNull()`, `list.Size()`, `curve.FirstParameter()`, +and every other "looks like a getter" surface in the binding. + +## Enums are string-valued object members + +Every C++ enum is exposed as a plain JS object whose members are strings whose +value equals the member name: + +```typescript +oc.TopAbs_ShapeEnum.TopAbs_EDGE === 'TopAbs_EDGE'; // true +oc.TopAbs_Orientation.TopAbs_FORWARD === 'TopAbs_FORWARD'; +``` + +Always reach for the object-member spelling — it's the form IntelliSense +surfaces, the bindings emit `.d.ts` types for, and the smoke tests use: + +```typescript +using box = new oc.BRepPrimAPI_MakeBox(10, 10, 10); +using shape = box.Shape(); +using explorer = new oc.TopExp_Explorer( + shape, + oc.TopAbs_ShapeEnum.TopAbs_FACE, + oc.TopAbs_ShapeEnum.TopAbs_SHAPE, +); +``` + +Enum-typed return values are strings too: + +```typescript +const transition = aline.TransitionOnS1(); // 'IntSurf_In' +``` + +There is no `.value` accessor — the member already _is_ the value. + +## Trailing default args fill themselves + +C++ default arguments work the way you'd expect: omit trailing parameters and +the binding fills the C++ defaults. + +```typescript +// BRepMesh_IncrementalMesh(shape, linearDeflection, isRelative=false, +// angDeflection=0.5, isInParallel=false) +using mesh = new oc.BRepMesh_IncrementalMesh(shape, 0.1); + +// BRepAlgoAPI_Fuse(S1, S2, ProgressRange=...) +using fuse = new oc.BRepAlgoAPI_Fuse(s1, s2); +``` + +Non-trailing positions still need an argument — if you want to override +`angDeflection` you must also pass `isRelative`. + +## `TopoDS` is the downcast bridge + +`oc.TopoDS` is the namespace bridge for casting a `TopoDS_Shape` down to its +concrete subtype. Each member is a free function that takes a generic shape +and returns the typed wrapper. + +```typescript +using explorer = new oc.TopExp_Explorer( + shape, + oc.TopAbs_ShapeEnum.TopAbs_EDGE, + oc.TopAbs_ShapeEnum.TopAbs_SHAPE, +); +using current = explorer.Current(); +using edge = oc.TopoDS.Edge(current); // typed TopoDS_Edge +``` + +The same shape exists for `Face`, `Wire`, `Vertex`, `Shell`, `Solid`, +`CompSolid`, and `Compound`. Each is a function, not a constructor — no `new`. + +## Errors throw `WebAssembly.Exception` + +When OCCT raises a C++ exception, it surfaces in JS as a `WebAssembly.Exception` +carrying the typed C++ tag. Decoding the tag gives you the actual OCCT error +(e.g. `Standard_DomainError`, `Standard_NullObject`). See the dedicated +[Debugging WASM exceptions](../guides/debugging-wasm-exceptions) guide for the +matching pattern; this concepts page intentionally stays out of the +runtime-decoding weeds. + +## Related + +- [Return shapes](./return-shapes) — what comes back from a call: native values, + in-place class outputs, envelopes, and Handle elision. +- [Handles and collections](./handles-and-collections) — smart-pointer surfaces + (`isNull` / `nullify`) and the `NCollection_*` containers. +- [Memory and disposables](./memory-and-disposables) — the `using` rule and the + `DisposableStack` patterns for ownership transfer. diff --git a/docs-site/content/docs/package/concepts/handles-and-collections.mdx b/docs-site/content/docs/package/concepts/handles-and-collections.mdx new file mode 100644 index 00000000..bf2b2875 --- /dev/null +++ b/docs-site/content/docs/package/concepts/handles-and-collections.mdx @@ -0,0 +1,200 @@ +--- +title: Handles and collections +description: Smart-pointer surfaces (isNull / nullify) and the NCollection_* container family — what shows up in JS and how to use it. +--- + +OCCT carries two long-running C++ idioms that V3's JS surface unifies under +JS-native shapes: the `Handle` smart pointer family and the `NCollection_*` +templated container family. This page covers both and the everyday patterns +they bring to your call sites. + +## Smart pointers are unified + +In OCCT C++, a `Handle` is an intrusive refcount wrapper around a +heap-allocated `Geom_Curve`. In the V3 JS bindings, the wrapper and the +pointee are the same JS object — every `Standard_Transient` subclass _is_ the +Handle. + +```typescript +using pnt = new oc.gp_Pnt(0, 0, 0); +using dir = new oc.gp_Dir(0, 0, 1); +using ax2 = new oc.gp_Ax2(pnt, dir); +using circle = new oc.Geom_Circle(ax2, 5); +circle.isNull(); // false +``` + +You never reach for a `Handle_` wrapper class — they don't exist on the +binding object: + +```typescript +oc['Handle_Geom_Curve']; // undefined +``` + +You never call `.get()` to unwrap a Handle. Functions that expect a +`Handle` accept the `Geom_Line` directly: + +```typescript +using line = new oc.Geom_Line(ax1); +using edge = new oc.BRepBuilderAPI_MakeEdge(line); +``` + +## `isNull()` vs `nullify()` + +Two methods carry the Handle nullability semantics into JS: + +- `isNull()` is a read — `true` if the smart pointer holds no object. +- `nullify()` clears the smart pointer. **Method calls on a nullified Handle + throw.** + +```typescript +using circle = new oc.Geom_Circle(ax2, 5); +circle.isNull(); // false +circle.nullify(); +circle.isNull(); // true +circle.Radius(); // throws — decode via WebAssembly.Exception +``` + +The throw surfaces as a `WebAssembly.Exception` carrying the C++ tag; see +[Debugging WASM exceptions](../guides/debugging-wasm-exceptions). + +Plain primitive value types (`gp_Pnt`, `gp_Dir`, `gp_Vec`) do **not** have +`isNull` / `nullify` — they're not smart pointers, they're directly-owned +value objects. + +## The `NCollection_*` container family + +OCCT predates `std::vector`, so it ships its own container family. The +bindgen auto-discovers `NCollection_*` types referenced by surviving bound +classes and emits one JS class per template instantiation. The JS class name +is the mangled C++ name — `NCollection_List` becomes +`NCollection_List_TopoDS_Shape`, the legacy `TopTools_ListOfShape` typedef +does **not** appear on the binding object. + +Auto-discovery is driven by C++ `using` typedef declarations in the +generated bindings — not by the JS `using` declaration keyword. These two +keywords share a name but solve different problems. + +### List — `NCollection_List_TopoDS_Shape` + +The list family is sequence-ordered, supports head/tail access and reversal, +and is the workhorse for accumulating shapes during a topological walk. + +```typescript +using box1 = new oc.BRepPrimAPI_MakeBox(10, 10, 10); +using box2 = new oc.BRepPrimAPI_MakeBox(20, 20, 20); +using shape1 = box1.Shape(); +using shape2 = box2.Shape(); + +using list = new oc.NCollection_List_TopoDS_Shape(); +list.Size(); // 0 + +using appended1 = list.Append(shape1); // see note below +using appended2 = list.Append(shape2); +appended1; appended2; // suppress unused-var lint + +list.Size(); // 2 +using first = list.First(); +using last = list.Last(); +list.Reverse(); +list.RemoveFirst(); +``` + +**Critical:** `list.Append(shape)` returns a disposable iterator handle. +Capture it with `using` — leaving it unbound leaks the handle. The +`require-using-on-disposable` lint rule catches this automatically. + +### Sequence — `NCollection_Sequence_TDF_Label` + +Sequence is the same conceptual shape as List but a different OCCT template; +it shows up most often in XDE / TDocStd workflows. **Its `Append` does not +return a disposable** — call it as a statement: + +```typescript +using seq = new oc.NCollection_Sequence_TDF_Label(); +using label = new oc.TDF_Label(); +seq.Append(label); // void; no `using` +seq.Size(); // 1 +``` + +The general rule across the `NCollection_*` family: `Append` semantics differ +per template. Trust the `.d.ts` types — they're the source of truth — and +check the smoke tests when uncertain. + +### Indexed map — `NCollection_IndexedMap_TopoDS_Shape_TopTools_ShapeMapHasher` + +Indexed maps combine set semantics with insertion-order indexing. The classic +use is dedup-then-iterate over the faces of a shape: + +```typescript +using box = new oc.BRepPrimAPI_MakeBox(10, 10, 10); +using shape = box.Shape(); +using explorer = new oc.TopExp_Explorer( + shape, + oc.TopAbs_ShapeEnum.TopAbs_FACE, + oc.TopAbs_ShapeEnum.TopAbs_SHAPE, +); +using map = new oc.NCollection_IndexedMap_TopoDS_Shape_TopTools_ShapeMapHasher(); +while (explorer.More()) { + using current = explorer.Current(); + map.Add(current); + explorer.Next(); +} + +map.Size(); // 6 (cube faces) +using face1 = map.FindKey(1); // 1-based +map.Contains(face1); // true +map.FindIndex(face1); // 1 +``` + +`FindKey` is **1-based**, matching OCCT's index convention. + +### Fixed-size array — `NCollection_Array1_gp_Pnt` + +`Array1` is OCCT's fixed-bounds array. The constructor takes lower and upper +bounds; the array is 1-indexed by default. + +```typescript +using arr = new oc.NCollection_Array1_gp_Pnt(1, 5); +arr.Length(); // 5 +arr.Lower(); // 1 +arr.Upper(); // 5 + +const pts = [ + new oc.gp_Pnt(1, 0, 0), + new oc.gp_Pnt(2, 0, 0), + new oc.gp_Pnt(3, 0, 0), + new oc.gp_Pnt(4, 0, 0), + new oc.gp_Pnt(5, 0, 0), +]; +for (let i = 0; i < pts.length; i++) arr.SetValue(i + 1, pts[i]); + +using third = arr.Value(3); // gp_Pnt at index 3 +using first = arr.First(); +using last = arr.Last(); +``` + +Expect 1-based indexing everywhere in the `NCollection_*` family — `Value(0)` +throws `Standard_OutOfRange`. + +## Lifetimes at a glance + +| Holder | Owns the heap allocation? | +| ------------------------------- | -------------------------------------------------- | +| Smart-pointer subclass (`Geom_Circle`, `Poly_Triangulation`, …) | Yes — refcounted; copying bumps the count. | +| Value class (`gp_Pnt`, `gp_Dir`, `gp_Vec`) | Yes — directly owned; dispose to free. | +| `T&` parameter | No — borrowed for the duration of the call. | +| `NCollection_*` | Yes — disposing the container disposes its contents.| + +In JS terms: every wrapper class — handles, value types, containers — exposes +`[Symbol.dispose]`. Bind them with `using` so the wasm heap releases at scope +exit. See [Memory and disposables](./memory-and-disposables) for the full +ruleset and the `DisposableStack` patterns for ownership transfer. + +## Related + +- [Memory and disposables](./memory-and-disposables) — when `using` is + required, and the `DisposableStack` patterns. +- [Return shapes](./return-shapes) — `NCollection_*` instances showing up + inside envelope fields. +- [Debugging WASM exceptions](../guides/debugging-wasm-exceptions) — decoding + the throw from a nullified-Handle method call. diff --git a/docs-site/content/docs/package/concepts/memory-and-disposables.mdx b/docs-site/content/docs/package/concepts/memory-and-disposables.mdx new file mode 100644 index 00000000..7f9fe604 --- /dev/null +++ b/docs-site/content/docs/package/concepts/memory-and-disposables.mdx @@ -0,0 +1,212 @@ +--- +title: Memory and disposables +description: How OCCT wraps the wasm heap — `using` syntax, Symbol.dispose, leak diagnostics, pool patterns. +--- + +Every OCCT object you allocate in JS — `gp_Pnt`, `TopoDS_Shape`, +`BRepPrimAPI_MakeBox`, every handle, every container — owns memory inside the +WebAssembly linear memory. Failing to release it leaks the wasm heap, which +grows up to the 4 GB wasm32 ceiling and then crashes the runtime. + +## The `using` rule + +Declare every disposable OCCT object with `using` so the runtime invokes +`[Symbol.dispose]()` when control leaves the scope. + +```typescript +{ + using box = new oc.BRepPrimAPI_MakeBox(10, 10, 10); + using shape = box.Shape(); // also disposable + // ... use box / shape ... +} // ← both disposed here, in reverse declaration order +``` + +The OCJS repo includes an oxlint rule, `ocjs-lint/require-using-on-disposable`, +that flags any plain `const`/`let` declaration of a disposable as an error. +It's wired into the in-repo `eslint.config.mjs` for the smoke-test suite but +is **not** auto-installed by `pnpm add opencascade.js` — the published npm +tarball ships only the wasm, JS loader, `.d.ts`, manifest, provenance, and +changelogs. If you want the rule in your own project, copy it from the OCJS +repo into your local lint setup. + +## Pure-data containers + +Return-by-value (RBV) containers whose fields are all primitives (no nested +disposables) **do not** auto-emit `[Symbol.dispose]`. You can use them without +`using`: + +```typescript +// gp_Pnt has only doubles — no dispose +const point = transform.TransformedPoint(p0); +console.log(point.X(), point.Y(), point.Z()); +``` + +Coordinate accessors like `X` / `Y` / `Z` are methods, not properties — see +[Calling OCCT from JS](./calling-occt-from-js#methods-returning-values-use-) +for the pattern. + +Containers with at least one disposable child auto-emit a `[Symbol.dispose]` +that walks the children and disposes each. The lint rule above handles the +classification automatically. + +## When `using` is not required + +`using` is required for anything that owns wasm memory and surfaces a +`[Symbol.dispose]`. Four common shapes do **not** need a `using` on the call +site — see [Return shapes](./return-shapes#when-do-i-need-using) for the full +decision table. + +- **`void` methods with class-only outputs** — `curve.D0(u, pt)` returns + `void`; the `using` lives on the input `pt`, not the call result. +- **Primitive / enum-only envelopes** — `surface.Bounds(0,0,0,0)` returns a + plain `{ U1, U2, V1, V2 }` object with no disposer; bind it with `const`. +- **Native primitive returns** — `pnt.X()`, `list.Size()`, `face.IsNull()` + return numbers / booleans, never disposables. +- **Forwarding ownership out of a helper** — when a function passes ownership + to its caller, the helper returns the disposable without `using` so the + caller binds it. The `DisposableStack.move()` pattern below is the + canonical OCCT idiom. + +## Composing lifetimes with `DisposableStack` + +The TC39 explicit-resource-management proposal also ships a built-in +`DisposableStack` — a LIFO container that adopts disposables and disposes +each one when the stack itself is disposed. Two OCCT-specific patterns +recur often enough to keep in your toolbox. + +### `stack.use(...)` — adopt a multi-handle return value as one resource + +Some BRep_Tool overloads return an RBV envelope that owns several embind +handles (e.g. `PolygonOnTriangulation` in its 2-arg form returns a +`{ P, T, L }` triple). Binding the whole envelope through `using` is the +easy path, but if you only want to forward it once and free everything in +one shot — `stack.use()` adopts the envelope and lets the parent stack +cascade through its `[Symbol.dispose]`. + +```typescript +using stack = new DisposableStack(); +const r = stack.use(oc.BRep_Tool.PolygonOnTriangulation(edge, loc)); +// ... read r.P / r.T / r.L ... +// stack disposes here, which disposes r, which disposes P/T/L in turn. +``` + +### `stack.move()` — transfer ownership out of a search loop + +The hardest OCCT lifetime puzzle is "iterate through a topology looking +for a match; on hit, hand the owning handles to the caller; on miss, free +everything before the next iteration". `using` alone can't express this +because a `using` binding always disposes at scope exit. `DisposableStack` +solves it: each iteration creates a fresh stack, adopts every interim +handle, and on success `move()`s the stack into the return value (which +empties the iteration-scoped stack so its scope-exit dispose is a no-op). + +```typescript +function findFirstTriangulatedEdge(shape: TopoDS_Shape): + DisposableStack & { edge: TopoDS_Edge; tri: Poly_Triangulation; loc: TopLoc_Location } { + const oc = getOC(); + using explorer = new oc.TopExp_Explorer(shape, oc.TopAbs_ShapeEnum.TopAbs_EDGE, oc.TopAbs_ShapeEnum.TopAbs_SHAPE); + + while (explorer.More()) { + using iterStack = new DisposableStack(); + using current = explorer.Current(); + const edge = iterStack.use(oc.TopoDS.Edge(current)); + const loc = iterStack.use(new oc.TopLoc_Location()); + // ... walk faces, look up triangulation ... + const tri = iterStack.use(oc.BRep_Tool.Triangulation(face, loc, 0)); + if (!tri.isNull()) { + // Match: transfer ownership. `iterStack` is now empty, its scope-exit + // dispose is a no-op, and the returned stack owns edge/tri/loc. + return Object.assign(iterStack.move(), { edge, tri, loc }); + } + explorer.Next(); + // No match: `iterStack` disposes here, freeing edge/loc/tri this round. + } + throw new Error('no triangulated edge'); +} + +// Caller side — one `using` collects three handles: +using ctx = findFirstTriangulatedEdge(shape); +// The 3-arg PolygonOnTriangulation overload returns a native Handle smart +// pointer (disposable). For the elision overload that returns the {P, T, L} +// envelope, see the `stack.use()` example above. +using polygon = oc.BRep_Tool.PolygonOnTriangulation(ctx.edge, ctx.tri, ctx.loc); +``` + +`DisposableStack` is part of the JS standard library wherever +`[Symbol.dispose]` is — no OCJS-specific runtime is involved. See +[MDN: DisposableStack](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DisposableStack) +for the full surface (`defer`, `adopt`, `disposed`, etc.). + +## Pool pattern for hot loops + +In a render loop you may allocate the same OCCT object hundreds of times per +second. Allocate once, reuse, dispose once: + +```typescript +class TransformPool { + private readonly transforms = new Map(); + + get(key: string): typeof oc.gp_Trsf { + let trsf = this.transforms.get(key); + if (!trsf) { + trsf = new oc.gp_Trsf(); + this.transforms.set(key, trsf); + } + return trsf; + } + + [Symbol.dispose]() { + for (const trsf of this.transforms.values()) trsf[Symbol.dispose](); + this.transforms.clear(); + } +} + +using pool = new TransformPool(); +for (let i = 0; i < 1000; i++) { + const trsf = pool.get(`rot-${i % 8}`); + trsf.SetRotation(axis, i * 0.01); + // ... +} +``` + +## Diagnosing leaks + +Wasm heap grows monotonically — to detect a leak, measure +`oc.HEAP8.byteLength` before and after a representative workload. + +```typescript +const before = oc.HEAP8.byteLength; +runWorkload(); +const after = oc.HEAP8.byteLength; +console.log(`heap delta: ${(after - before) / 1024} KB`); +``` + +For deep audits, build with `-sASSERTIONS=2 -fsanitize=leak` (debug builds +only) and the runtime prints a leak summary on `process.exit()`. + +## What `[Symbol.dispose]` actually does + +Calls the wrapped object's C++ destructor through the embind glue. For +handles, this decrements the refcount; for value types, it frees the C++ +allocation. The JS wrapper object becomes invalid — subsequent method calls +throw an embind error (text varies, typically along the lines of +`BindingError: instance already deleted`). + +## Pitfalls + +- **`using` inside an `if (cond)` branch** disposes when control exits the + branch, not when the outer block ends. Move the declaration up if you need + it across the branch. +- **Returning a `using` value** disposes it before the caller sees it. Use a + plain `const` for return values and disposal at the call site. +- **Passing a disposed object as a parameter** throws on every method. + Disciplined `using` placement is the cheapest defence. + +## Related + +- [Calling OCCT from JS](./calling-occt-from-js) — overload dispatch, enums, + defaults, and the `TopoDS` downcast bridge. +- [Return shapes](./return-shapes) — when a call returns an envelope, a + native value, or an in-place class output, and which of those need `using`. +- [Handles and collections](./handles-and-collections) — `isNull` / `nullify` + on smart pointers and the `NCollection_*` container family. diff --git a/docs-site/content/docs/package/concepts/return-shapes.mdx b/docs-site/content/docs/package/concepts/return-shapes.mdx new file mode 100644 index 00000000..56924cae --- /dev/null +++ b/docs-site/content/docs/package/concepts/return-shapes.mdx @@ -0,0 +1,183 @@ +--- +title: Return shapes +description: What OCCT methods return in JS — native values, in-place class outputs, primitive envelopes, returnValue, and Handle elision. +--- + +A single OCCT method can have multiple output channels: its native C++ return, +plus any number of `T&` output parameters. The bindings collapse these into a +small set of JS-shaped return forms. This page covers each shape, how to +recognise it from a signature, and whether the result needs `using`. + +For the rules on _how to call_ a method (overload dispatch, enums, defaults), +see [Calling OCCT from JS](./calling-occt-from-js). + +## TL;DR + +| What the C++ method outputs | What JS sees | +| ---------------------------------------------------------- | ----------------------------------------------------------------------- | +| Class output param (`Bnd_Box&`, `gp_Pnt&`, …) | The class you passed in is mutated in place. Read it after the call. | +| Primitive / enum output param (`double&`, `Standard_Real&`) | An envelope is returned; **keep passing placeholder values** at the slot. | +| Non-const `Handle&` output param | The slot is **elided** from the JS signature; the Handle appears as an envelope field. | +| Native C++ return alongside any output(s) | Surfaced on the envelope as `returnValue`. | + +## Decision tree + +Walk this table top-to-bottom for any signature you're reading off the `.d.ts`: + +| C++ return | C++ output params | Resulting JS shape | +| ---------- | ------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- | +| Non-`void` | None | Native return (no envelope). Smart pointers count as native — see Handles below. | +| Non-`void` | Class only (mutated in place) | Native return. Read mutated classes from your input variables; they are not echoed in the return. | +| `void` | Class only | `void`. Read mutated classes from your input variables. | +| Non-`void` | Primitives / enums / elided Handles (± class outputs) | Envelope with `returnValue` for the C++ return + one named field per non-class, non-elided output. Class outputs are NOT echoed. | +| `void` | Primitives / enums / elided Handles (± class outputs) | Same envelope shape, minus `returnValue`. | + +The four sections below walk each row with worked examples. + +## Class outputs mutate in place + +When a method takes a non-const class reference (`gp_Pnt&`, `Bnd_Box&`, +`GProp_GProps&`, `TopoDS_Shape&`), the binding passes the JS wrapper's +underlying C++ pointer straight through. The C++ method mutates the object you +allocated; you read the result by querying your own variable after the call. + +```typescript +using curve = makeSomeCurve(); +using inStartPt = new oc.gp_Pnt2d(0, 0); +using inEndPt = new oc.gp_Pnt2d(0, 0); + +curve.D0(curve.FirstParameter(), inStartPt); +curve.D0(curve.LastParameter(), inEndPt); + +console.log(inStartPt.X(), inStartPt.Y()); // mutated by D0 +console.log(inEndPt.X(), inEndPt.Y()); +``` + +Same pattern for whole-shape evaluators: + +```typescript +using props = new oc.GProp_GProps(); +oc.BRepGProp.VolumeProperties(shape, props, false, false, false); +const volume = props.Mass(); +``` + +The call itself returns `void` or a native value — never an envelope echoing +the class output. The `using` declaration that matters is the one on your +input class; the call site doesn't need its own `using`. + +## Primitive / enum envelopes — placeholder inputs are required + +When the method has primitive or enum output parameters, the binding wraps the +return in an envelope object whose fields mirror those outputs. The C++ +signature is preserved at the call site — you keep passing values for those +slots, but the values are placeholders that C++ overwrites. + +```typescript +using surface = new oc.Geom_SphericalSurface(ax, 10); +const bounds = surface.Bounds(0, 0, 0, 0); // placeholders +console.log(bounds.U1, bounds.U2, bounds.V1, bounds.V2); +``` + +The four `0`s are **not optional**. The binding uses input-passthrough +return-by-value: it preserves the C++ argument list so overload resolution +still works, then reads back the mutated values into the envelope. Calling +`surface.Bounds()` with zero arguments either fails dispatch or picks the +wrong overload. + +Primitive-only envelopes (every field is a number, boolean, or string) **do +not carry `[Symbol.dispose]`**. Plain `const` works; you don't need `using` on +the result. This is enforced by the type-level contract in +`tests/disposable-containers.test-d.ts` — the type tests are the canonical +truth even where the `BREAKING_CHANGES.md` §B2 table row still shows a +disposer on the `Bounds` shape. + +## `returnValue`, not `result` + +When a method has a non-`void` C++ return _and_ primitive/enum/Handle +outputs, the envelope grows a `returnValue` field carrying the native return. +The OCJS v2 name `result` is gone in V3. + +```typescript +using batten = new oc.FairCurve_Batten(p1, p2, /* height */ 0.5); +const r = batten.Compute( + oc.FairCurve_AnalysisCode.FairCurve_OK, // input-passthrough enum + /* nbIters */ 50, + /* tolerance */ 1e-3, +); +console.log(r.returnValue); // boolean, the C++ return +console.log(r.Code); // enum output mirror +``` + +`BRep_Tool.Curve` is another common case: the primitive-only outputs (`First`, +`Last`) and the native Handle return appear together on a `{ returnValue, +First, Last }` envelope. + +## Handle output elision + +Non-const `Handle&` output parameters are the one case where the JS +signature is _smaller_ than the C++ signature. The binding drops those +positions from the JS argument list entirely; the freshly-assigned Handle +surfaces as an envelope field instead. + +```typescript +using r = oc.BRep_Tool.PolygonOnTriangulation(edge, loc); // 2 args, not 4 +console.log(r.P, r.T); // Handle outputs +// `loc` (a class output) is mutated in place; not echoed in r. +``` + +Compare to the same method called with a triangulation in its overload slot — +note that this is a **different overload**, picked by argument shape, that +returns a native Handle instead of an envelope: + +```typescript +using handle = oc.BRep_Tool.PolygonOnTriangulation(edge, tri, loc); // 3 args +// handle is a Handle, not an envelope. +``` + +This is the asymmetry to internalise: + +- Primitive / enum output slots → **stay** in the JS arg list as placeholders. +- `Handle&` output slots → **disappear** from the JS arg list. + +Other elided signatures: `GeomInt_IntSS.BuildPCurves`, +`ShapeAnalysis_Edge.TreatRLine`, the `ShapeConstruct.New*` family, +`HelixGeom_BuilderApproxCurve3d.ApprHelix`. + +Handle-bearing envelopes do carry `[Symbol.dispose]` — they own embind +wrappers that must be released. Always bind them with `using`. + +## When do I need `using`? + +| Return shape | `using` on the call site? | +| ----------------------------------------------------------------------- | ------------------------- | +| `void` with class-only outputs (e.g. `curve.D0(u, pt)`) | No — `using` goes on the input class. | +| Native primitive return (`pnt.X()`, `list.Size()`) | No — plain values. | +| Native Handle return (`arcMaker.Value() → Geom_TrimmedCurve`) | Yes — Handle is disposable. | +| Primitive / enum-only envelope (`surface.Bounds(0,0,0,0)`) | No — envelope has no disposer. | +| Handle-bearing envelope (`BRep_Tool.PolygonOnTriangulation(edge, loc)`) | Yes — `[Symbol.dispose]` cascades through the Handle fields. | + +The canonical type-level contract lives in +`tests/disposable-containers.test-d.ts` and `tests/output-params.test-d.ts` +in the OCJS repo — when in doubt, the type definitions are the source of +truth. + +## Disposer idempotency + +Manual `r[Symbol.dispose]()` followed by a `using` scope-exit re-dispose is +safe — the second call is a no-op rather than a `BindingError`. This is +intentional so try/finally migration paths can co-exist with `using`: + +```typescript +using r = oc.BRep_Tool.PolygonOnTriangulation(edge, loc); +r[Symbol.dispose](); // no-op for the scope-exit dispose +``` + +## Related + +- [Calling OCCT from JS](./calling-occt-from-js) — overload dispatch, + defaults, enums, and the `TopoDS` downcast bridge. +- [Handles and collections](./handles-and-collections) — the smart-pointer + surface (`isNull` / `nullify`) and the `NCollection_*` containers that show + up in envelope fields. +- [Memory and disposables](./memory-and-disposables) — when `using` is + required vs. optional, and the `DisposableStack` patterns. diff --git a/docs-site/content/docs/package/examples/boolean-logo.mdx b/docs-site/content/docs/package/examples/boolean-logo.mdx new file mode 100644 index 00000000..2928e5d9 --- /dev/null +++ b/docs-site/content/docs/package/examples/boolean-logo.mdx @@ -0,0 +1,102 @@ +--- +title: Boolean logo +description: Build the OCJS logo with boolean cuts and rotations against a sphere. +--- + +A worked example of boolean operations — start with a sphere, cut it four +times with translated and scaled copies, fuse a rotated duplicate, and +visualise the result. + +```typescript title="examples/boolean-logo.ts" +import type { TopoDS_Shape } from '@taucad/opencascade.js'; +import { getOc } from './ocjs-init'; + +export const buildLogo = async (): Promise => { + const oc = await getOc(); + using sphere = new oc.BRepPrimAPI_MakeSphere(1); + + const makeCut = (shape: TopoDS_Shape, translation: readonly [number, number, number], scale: number) => { + using tf = new oc.gp_Trsf(); + tf.SetTranslation(new oc.gp_Vec(translation[0], translation[1], translation[2])); + tf.SetScaleFactor(scale); + using loc = new oc.TopLoc_Location(tf); + using progress = new oc.Message_ProgressRange(); + using cut = new oc.BRepAlgoAPI_Cut(shape, sphere.Shape().Moved(loc, false), progress); + cut.Build(progress); + return cut.Shape(); + }; + + const cut1 = makeCut(sphere.Shape(), [0, 0, 0.7], 1); + const cut2 = makeCut(cut1, [0, 0, -0.7], 1); + const cut3 = makeCut(cut2, [0, 0.25, 1.75], 1.825); + const cut4 = makeCut(cut3, [4.8, 0, 0], 5); + + const makeRotation = (rotation: number) => { + const tf = new oc.gp_Trsf(); + tf.SetRotation(new oc.gp_Ax1(new oc.gp_Pnt(), new oc.gp_Dir(0, 0, 1)), rotation); + return new oc.TopLoc_Location(tf); + }; + + using progress = new oc.Message_ProgressRange(); + using fuse = new oc.BRepAlgoAPI_Fuse(cut4, cut4.Moved(makeRotation(Math.PI), false), progress); + fuse.Build(progress); + const result = fuse.Shape().Moved(makeRotation(-30 * Math.PI / 180), false); + + // XCAF — per-subset PBR materials (brass + gray zones) + using doc = new oc.TDocStd_Document(new oc.TCollection_ExtendedString_1()); + const shapeTool = oc.XCAFDoc_DocumentTool.ShapeTool(doc.Main()).get(); + + using it1 = new oc.TopoDS_Iterator(result, true, true); + for (; it1.More(); it1.Next()) { + let i = 0; + using it2 = new oc.TopoDS_Iterator(it1.Value(), true, true); + for (; it2.More(); it2.Next()) { + const newShape = shapeTool.NewShape(); + shapeTool.SetShape(newShape, it2.Value()); + + const vmtool = oc.XCAFDoc_DocumentTool.VisMaterialTool(newShape).get(); + using visMat = new oc.XCAFDoc_VisMaterial(); + const matLabel = vmtool.AddMaterial( + new oc.Handle_XCAFDoc_VisMaterial(visMat), + new oc.TCollection_AsciiString(`logoMat${i}`), + ); + vmtool.SetShapeMaterial(newShape, matLabel); + + using visMatPbr = new oc.XCAFDoc_VisMaterialPBR(); + if (i === 3) { + visMatPbr.BaseColor = new oc.Quantity_ColorRGBA(0.6, 0.5, 0, 1); + } else { + visMatPbr.BaseColor = new oc.Quantity_ColorRGBA(0.3, 0.3, 0.3, 1); + } + visMat.SetPbrMaterial(visMatPbr); + i++; + } + } + + return result; +}; +``` + +## What's happening + +1. `BRepPrimAPI_MakeSphere(1)` builds a unit sphere. +2. `makeCut` constructs a transform (translate + scale), wraps it in a + `TopLoc_Location`, moves a copy of the sphere, and subtracts it via + `BRepAlgoAPI_Cut`. +3. Four sequential cuts produce one half of the OCJS logo glyph. +4. `BRepAlgoAPI_Fuse` welds the half to a 180°-rotated copy of itself. +5. A final 30° rotation tilts the logo. + +The takeaway: boolean operations allow you to create highly complex shapes +that would be difficult or impossible with classical polygon-based modelling. + +## Render it + +```typescript +const logoShape = await buildLogo(); +const glb = await shapeToGlb(logoShape); +renderGlb(canvas, glb); +``` + +See [Render with three.js](../guides/render-with-three-js) for the GLB → three.js wiring. +See also [Visualize shape helper](../guides/visualize-shape-helper). diff --git a/docs-site/content/docs/package/examples/classic-bottle.mdx b/docs-site/content/docs/package/examples/classic-bottle.mdx new file mode 100644 index 00000000..db1e5132 --- /dev/null +++ b/docs-site/content/docs/package/examples/classic-bottle.mdx @@ -0,0 +1,202 @@ +--- +title: Classic bottle +description: The canonical OCCT tutorial — bottle profile, fillets, neck, threading — translated to V3 TypeScript. +--- + +The [OpenCASCADE bottle tutorial](https://dev.opencascade.org/doc/overview/html/occt__tutorial.html) +ported to V3 TypeScript with `using` syntax and suffix-free API. + +The example demonstrates **every major OCCT capability** in one script: 2D +profile construction, mirroring, extrusion, fillets, cylinder primitives, +boolean fuse, hollow-solid generation, threading via `ThruSections`, and +final compound assembly. + +```typescript title="examples/classic-bottle.ts" +import type { TopoDS_Shape } from '@taucad/opencascade.js'; +import { getOc } from './ocjs-init'; + +export type BottleParams = { + width: number; // 20–100, default 50 + height: number; // 50–120, default 70 + thickness: number; // 15–50, default 30 +}; + +export const buildBottle = async ( + { width, height, thickness }: BottleParams = { width: 50, height: 70, thickness: 30 }, +): Promise => { + const oc = await getOc(); + + // Profile — define support points + const aPnt1 = new oc.gp_Pnt(-width / 2, 0, 0); + const aPnt2 = new oc.gp_Pnt(-width / 2, -thickness / 4, 0); + const aPnt3 = new oc.gp_Pnt(0, -thickness / 2, 0); + const aPnt4 = new oc.gp_Pnt(width / 2, -thickness / 4, 0); + const aPnt5 = new oc.gp_Pnt(width / 2, 0, 0); + + // Profile — define the geometry + using arc = new oc.GC_MakeArcOfCircle(aPnt2, aPnt3, aPnt4); + using seg1 = new oc.GC_MakeSegment(aPnt1, aPnt2); + using seg2 = new oc.GC_MakeSegment(aPnt4, aPnt5); + + // Profile — define the topology + using edge1 = new oc.BRepBuilderAPI_MakeEdge(seg1.Value()); + using edge2 = new oc.BRepBuilderAPI_MakeEdge(arc.Value()); + using edge3 = new oc.BRepBuilderAPI_MakeEdge(seg2.Value()); + using wire = new oc.BRepBuilderAPI_MakeWire(edge1.Edge(), edge2.Edge(), edge3.Edge()); + + // Mirror the wire across the X axis + const xAxis = oc.gp.OX(); + using trsf = new oc.gp_Trsf(); + trsf.SetMirror(xAxis); + using mirroredBuilder = new oc.BRepBuilderAPI_Transform(wire.Wire(), trsf, false); + const mirroredShape = mirroredBuilder.Shape(); + + using fullProfile = new oc.BRepBuilderAPI_MakeWire(); + fullProfile.Add(wire.Wire()); + fullProfile.Add(oc.TopoDS.Wire(mirroredShape)); + + // Body — extrude the profile + using faceProfile = new oc.BRepBuilderAPI_MakeFace(fullProfile.Wire(), false); + using prismVec = new oc.gp_Vec(0, 0, height); + using body = new oc.BRepPrimAPI_MakePrism(faceProfile.Face(), prismVec, false, true); + let workingBody = body.Shape(); + + // Body — apply edge fillets + using fillet = new oc.BRepFilletAPI_MakeFillet(workingBody, oc.ChFi3d_FilletShape.ChFi3d_Rational); + using edgeExp = new oc.TopExp_Explorer(workingBody, oc.TopAbs_ShapeEnum.TopAbs_EDGE); + while (edgeExp.More()) { + fillet.Add(thickness / 12, oc.TopoDS.Edge(edgeExp.Current())); + edgeExp.Next(); + } + workingBody = fillet.Shape(); + + // Body — add the neck + using neckLocation = new oc.gp_Pnt(0, 0, height); + const neckAxis = oc.gp.DZ(); + using neckAx2 = new oc.gp_Ax2(neckLocation, neckAxis); + const neckRadius = 5; + const neckHeight = 5; + using cyl = new oc.BRepPrimAPI_MakeCylinder(neckAx2, neckRadius, neckHeight); + using progress = new oc.Message_ProgressRange(); + using fuse = new oc.BRepAlgoAPI_Fuse(workingBody, cyl.Shape(), progress); + workingBody = fuse.Shape(); + + // Body — hollow the solid (remove the top face of the neck) + let faceToRemove: ReturnType | undefined; + let zMax = -1; + using faceExp = new oc.TopExp_Explorer(workingBody, oc.TopAbs_ShapeEnum.TopAbs_FACE); + for (; faceExp.More(); faceExp.Next()) { + const aFace = oc.TopoDS.Face(faceExp.Current()); + const aSurface = oc.BRep_Tool.Surface(aFace); + if (aSurface.get().$$.ptrType.name === 'Geom_Plane*') { + const aPlane = new oc.Handle_Geom_Plane(aSurface.get()).get(); + const aPnt = aPlane.Location(); + if (aPnt.Z() > zMax) { + zMax = aPnt.Z(); + using topFaceExp = new oc.TopExp_Explorer(aFace, oc.TopAbs_ShapeEnum.TopAbs_FACE); + faceToRemove = oc.TopoDS.Face(topFaceExp.Current()); + } + } + } + + using facesToRemove = new oc.TopTools_ListOfShape(); + if (faceToRemove) facesToRemove.Append(faceToRemove); + using thickSolid = new oc.BRepOffsetAPI_MakeThickSolid(); + thickSolid.MakeThickSolidByJoin( + workingBody, + facesToRemove, + -thickness / 50, + 1e-3, + oc.BRepOffset_Mode.BRepOffset_Skin, + false, + false, + oc.GeomAbs_JoinType.GeomAbs_Arc, + false, + progress, + ); + workingBody = thickSolid.Shape(); + + // Threading — cylindrical surfaces + elliptical 2D curves + using aCyl1 = new oc.Geom_CylindricalSurface(new oc.gp_Ax3(neckAx2), neckRadius * 0.99); + using aCyl2 = new oc.Geom_CylindricalSurface(new oc.gp_Ax3(neckAx2), neckRadius * 1.05); + + const aPnt2d = new oc.gp_Pnt2d(2 * Math.PI, neckHeight / 2); + const aDir2d = new oc.gp_Dir2d(2 * Math.PI, neckHeight / 4); + using anAx2d = new oc.gp_Ax2d(aPnt2d, aDir2d); + + const aMajor = 2 * Math.PI; + const aMinor = neckHeight / 10; + + using anEllipse1 = new oc.Geom2d_Ellipse(anAx2d, aMajor, aMinor, true); + using anEllipse2 = new oc.Geom2d_Ellipse(anAx2d, aMajor, aMinor / 4, true); + using anArc1 = new oc.Geom2d_TrimmedCurve(new oc.Handle_Geom2d_Curve(anEllipse1), 0, Math.PI, true, true); + using anArc2 = new oc.Geom2d_TrimmedCurve(new oc.Handle_Geom2d_Curve(anEllipse2), 0, Math.PI, true, true); + + const tmp1 = anEllipse1.Value(0); + const anEllipsePnt1 = new oc.gp_Pnt2d(tmp1.X(), tmp1.Y()); + const tmp2 = anEllipse1.Value(Math.PI); + const anEllipsePnt2 = new oc.gp_Pnt2d(tmp2.X(), tmp2.Y()); + using aSegment = new oc.GCE2d_MakeSegment(anEllipsePnt1, anEllipsePnt2); + + using anEdge1OnSurf1 = new oc.BRepBuilderAPI_MakeEdge( + new oc.Handle_Geom2d_Curve(anArc1), + new oc.Handle_Geom_Surface(aCyl1), + ); + using anEdge2OnSurf1 = new oc.BRepBuilderAPI_MakeEdge( + new oc.Handle_Geom2d_Curve(aSegment.Value()), + new oc.Handle_Geom_Surface(aCyl1), + ); + using anEdge1OnSurf2 = new oc.BRepBuilderAPI_MakeEdge( + new oc.Handle_Geom2d_Curve(anArc2), + new oc.Handle_Geom_Surface(aCyl2), + ); + using anEdge2OnSurf2 = new oc.BRepBuilderAPI_MakeEdge( + new oc.Handle_Geom2d_Curve(aSegment.Value()), + new oc.Handle_Geom_Surface(aCyl2), + ); + using threadingWire1 = new oc.BRepBuilderAPI_MakeWire( + anEdge1OnSurf1.Edge(), + anEdge2OnSurf1.Edge(), + ); + using threadingWire2 = new oc.BRepBuilderAPI_MakeWire( + anEdge1OnSurf2.Edge(), + anEdge2OnSurf2.Edge(), + ); + oc.BRepLib.BuildCurves3d(threadingWire1.Wire()); + oc.BRepLib.BuildCurves3d(threadingWire2.Wire()); + + using aTool = new oc.BRepOffsetAPI_ThruSections(true, false, 1e-6); + aTool.AddWire(threadingWire1.Wire()); + aTool.AddWire(threadingWire2.Wire()); + aTool.CheckCompatibility(false); + const myThreading = aTool.Shape(); + + // Compound assembly + final rotation + using aRes = new oc.TopoDS_Compound(); + using aBuilder = new oc.BRep_Builder(); + aBuilder.MakeCompound(aRes); + aBuilder.Add(aRes, workingBody); + aBuilder.Add(aRes, myThreading); + + using rotTrsf = new oc.gp_Trsf(); + rotTrsf.SetRotation(new oc.gp_Ax1(new oc.gp_Pnt(), new oc.gp_Dir(1, 0, 0)), -Math.PI / 2); + using rotLoc = new oc.TopLoc_Location(rotTrsf); + return aRes.Moved(rotLoc, false); +}; +``` + +Every OCCT API used above has a direct V3 binding under `oc.` with no +`_N` suffix. See the [OpenCASCADE tutorial](https://dev.opencascade.org/doc/overview/html/occt__tutorial.html) +for the step-by-step walkthrough of the underlying geometry. + +## Migration from v2 + +The v2 example used `gp_Pnt_3`, `GC_MakeArcOfCircle_4`, `BRepBuilderAPI_MakeEdge_24`, +`gp_Trsf_1`, etc. V3 drops every `_N` suffix — overload dispatch happens in +C++ via the unified RBV pipeline. Pass arguments by type and the right overload +runs automatically. + +## Render + +See [Render with three.js](../guides/render-with-three-js) for the GLB → three.js wiring. +See also [Visualize shape helper](../guides/visualize-shape-helper). diff --git a/docs-site/content/docs/package/examples/polygon-extrusion.mdx b/docs-site/content/docs/package/examples/polygon-extrusion.mdx new file mode 100644 index 00000000..65c10d25 --- /dev/null +++ b/docs-site/content/docs/package/examples/polygon-extrusion.mdx @@ -0,0 +1,49 @@ +--- +title: Polygon extrusion +description: Build a polygonal wire, face it, and extrude into a prism — three OCCT calls. +--- + +The minimum useful OCCT example: a four-point polygon extruded along Z. + +```typescript title="examples/polygon-extrusion.ts" +import type { TopoDS_Shape } from '@taucad/opencascade.js'; +import { getOc } from './ocjs-init'; + +export const buildExtrudedPolygon = async (): Promise => { + const oc = await getOc(); + + using polygon = new oc.BRepBuilderAPI_MakePolygon(); + polygon.Add(new oc.gp_Pnt(-50, -50, 0)); + polygon.Add(new oc.gp_Pnt(50, -50, 0)); + polygon.Add(new oc.gp_Pnt(50, 50, 0)); + polygon.Add(new oc.gp_Pnt(-50, 50, 0)); + polygon.Close(); + + using face = new oc.BRepBuilderAPI_MakeFace(polygon.Wire(), false); + using prismVec = new oc.gp_Vec(0, 0, 40); + using prism = new oc.BRepPrimAPI_MakePrism(face.Face(), prismVec, false, true); + return prism.Shape(); +}; +``` + +## Why this matters + +- `BRepBuilderAPI_MakePolygon` accepts an arbitrary number of points — three + for a triangle, hundreds for a complex contour. +- `Close()` adds the implicit closing edge. +- `BRepBuilderAPI_MakeFace(wire, false)` faces the wire; `false` means "this + is the only wire of the face" (set `true` if you're adding holes later). +- `BRepPrimAPI_MakePrism` extrudes along an arbitrary direction vector, not + just Z. + +Swap `gp_Vec(0, 0, 40)` for `gp_Vec(0.5, 0.5, 1)` and you get a slanted +prism. Swap the polygon for a `BRepBuilderAPI_MakeWire` with curved edges +and you get an extruded curved profile. + +## Next steps + +- Combine multiple extrusions with `BRepAlgoAPI_Fuse` for additive construction. +- Subtract holes with `BRepAlgoAPI_Cut`. +- Fillet sharp edges with `BRepFilletAPI_MakeFillet`. + +See [First shape tutorial](../getting-started/first-shape-tutorial) for the fillet pattern. diff --git a/docs-site/content/docs/package/getting-started/faq.mdx b/docs-site/content/docs/package/getting-started/faq.mdx new file mode 100644 index 00000000..e16247ef --- /dev/null +++ b/docs-site/content/docs/package/getting-started/faq.mdx @@ -0,0 +1,39 @@ +--- +title: FAQ +description: Fork status, maintenance model, and how to contribute to OpenCascade.js during the V3 / OCCT V8 release window. +--- + +## Is this a fork of OpenCascade? + +Yes — with nuance. `@taucad/opencascade.js` is a **Tau-maintained fork** of +[`donalffons/opencascade.js`](https://github.com/donalffons/opencascade.js), +which itself is a port of upstream [OpenCASCADE Technology (OCCT)](https://dev.opencascade.org/) +to WebAssembly via Emscripten. + +The fork exists to ship the **V3 / OCCT V8 release** while upstream is dormant. +The intent is to **merge back upstream** into `donalffons/opencascade.js` via a +single PR once V8 lands. During this window, issues and releases live at +[`taucad/opencascade.js`](https://github.com/taucad/opencascade.js). + +OpenCascade.js does **not** modify the OCCT C++ source beyond a small set of +patches applied at build time. The pipeline downloads a tagged OCCT commit, +compiles with Emscripten, auto-generates embind bindings from libclang, and +ships the wasm + TypeScript surface as an npm package. + +## Who maintains it? + +**`donalffons`** remains the maintainer-of-record for OpenCascade.js. +**Tau** is the interim driver during the V3 / OCCT V8 release window — shipping +docs, the GHCR Docker image, and the `@taucad/opencascade.js@beta` npm package +until the merge-back PR lands. + +## How can I contribute? + +Contributions are welcome and upstream-merge-back-aware: + +1. Open issues or PRs at [`taucad/opencascade.js`](https://github.com/taucad/opencascade.js). +2. Follow the existing code style and test conventions in the repo. +3. Prefer changes that will survive the upstream merge-back (OCJS-original + branding, suffix-free V3 API, no Tau-specific forks of core bindgen logic). + +For larger architectural questions, start a discussion before opening a PR. diff --git a/docs-site/content/docs/package/getting-started/first-shape-tutorial.mdx b/docs-site/content/docs/package/getting-started/first-shape-tutorial.mdx new file mode 100644 index 00000000..52bb8252 --- /dev/null +++ b/docs-site/content/docs/package/getting-started/first-shape-tutorial.mdx @@ -0,0 +1,88 @@ +--- +title: First Shape Tutorial +description: Build a filleted box from scratch, render it in three.js, and inspect the OCCT call sites. +--- + +This tutorial extends the npm quickstart with explanations of every OCCT type +involved — useful if you've never touched OCCT before. + +## Step 1 — Choose a primitive + +`BRepPrimAPI_MakeBox` constructs an axis-aligned box from three lengths. + +```typescript +using box = new oc.BRepPrimAPI_MakeBox(60, 40, 20); +const shape = box.Shape(); +``` + +`shape` is a `TopoDS_Shape` — the universal OCCT geometry handle. All booleans, +fillets, and exports take and return `TopoDS_Shape` instances. + +## Step 2 — Walk topology + +OCCT shapes are hierarchical: `SOLID → SHELL → FACE → WIRE → EDGE → VERTEX`. +`TopExp_Explorer` iterates entries of a given kind in declaration order. + +```typescript +using explorer = new oc.TopExp_Explorer(shape, oc.TopAbs_ShapeEnum.TopAbs_EDGE); +const edges: typeof oc.TopoDS_Edge[] = []; +while (explorer.More()) { + edges.push(oc.TopoDS.Edge(explorer.Current())); + explorer.Next(); +} +``` + +A box has 12 edges — three groups of 4 parallel edges along each axis. + +## Step 3 — Apply a fillet + +`BRepFilletAPI_MakeFillet` takes the shape and a per-edge radius. Calling +`Add(radius, edge)` once per edge marks them for filleting; `Shape()` runs the +algorithm and returns the result. + +```typescript +using fillet = new oc.BRepFilletAPI_MakeFillet(shape); +for (const edge of edges) fillet.Add(3, edge); +const filletedShape = fillet.Shape(); +``` + +## Step 4 — Tessellate and export + +Until you call `BRepMesh_IncrementalMesh`, the shape has no triangulation — +it's still analytic. The mesher caches per-shape triangulation; pass +`decreate=true` on the third argument to force regeneration when you change +tolerance. + +```typescript +using _mesh = new oc.BRepMesh_IncrementalMesh(filletedShape, 0.1, false, 0.5, false); +``` + +The two tolerances are **linear** (mm) and **angular** (radians). 0.1 mm linear +is fine for a 60 mm box; tighten it on small features. + +Export via the XCAF path documented in [Export glTF / GLB](../guides/export-gltf) +to get a GLB your three.js viewer can load. + +## Step 5 — Render + +The npm quickstart shows the full three.js wiring. The minimal version: + +```typescript +const loader = new GLTFLoader(); +loader.parse(glb.buffer, '', (gltf) => scene.add(gltf.scene)); +``` + +## What went wrong if… + +| Symptom | Likely cause | +|---|---| +| `BindingError: ptr<-1>` | You called a method on a disposed object — `using` exited scope earlier than expected | +| Black canvas, no errors | Camera is inside the shape — set `camera.position.set(100, 100, 100)` | +| Fillet `Shape()` throws | One of your edges is degenerate; check `edge.Orientation()` | +| `RWGltf_CafWriter.Perform` returns false | The XCAF doc has no shape attached — verify `ShapeTool.AddShape` succeeded | + +## Where to next + +- [Memory and disposables](../concepts/memory-and-disposables) for the OCCT memory model in depth. +- [Two-channel config model](../concepts/two-channel-config-model) for compile-time vs link-time config. +- [BRepPrimAPI](/docs/package/api/modeling-algorithms/tk-prim/b-rep-prim-api) for the primitive surface. diff --git a/docs-site/content/docs/package/getting-started/projects-using-opencascade-js.mdx b/docs-site/content/docs/package/getting-started/projects-using-opencascade-js.mdx new file mode 100644 index 00000000..6b66803f --- /dev/null +++ b/docs-site/content/docs/package/getting-started/projects-using-opencascade-js.mdx @@ -0,0 +1,22 @@ +--- +title: Projects using OpenCascade.js +description: Public projects and reference repositories built on OpenCascade.js. +--- + +OpenCascade.js powers browser-native CAD across several production apps and +reference repositories. Tau is listed as a peer entry alongside the original +gallery — not promoted to headline status. + +## Applications + +- [ArchiYou](https://archiyou.com/) — library, code-CAD design tool, community hub. +- [BitByBit](https://bitbybit.dev/) — code- and node-based CAD design tool. +- [CascadeStudio](https://github.com/zalo/CascadeStudio) — library and code-CAD design tool. +- [Polygonjs](https://polygonjs.com) — procedural design and animation tool for WebGL. +- [RepliCAD](https://replicad.xyz/) — library and code-CAD design tool. +- [Tau](https://tau.new) — AI-native CAD platform for the web. + +## Reference repositories + +- [opencascade.js-examples](https://github.com/donalffons/opencascade.js-examples) — + general examples on how to use the library. diff --git a/docs-site/content/docs/package/getting-started/quick-start-npm.mdx b/docs-site/content/docs/package/getting-started/quick-start-npm.mdx new file mode 100644 index 00000000..d3052dc6 --- /dev/null +++ b/docs-site/content/docs/package/getting-started/quick-start-npm.mdx @@ -0,0 +1,118 @@ +--- +title: Quickstart — npm +description: Install @taucad/opencascade.js, render a 60×40×20 box with a 3 mm fillet, and export GLB. +--- + +Target time: **4 minutes** from an empty directory to an orbit-controlled box +in your browser. + +## Prerequisites + +- Node 22+ and pnpm 9+ (npm and yarn also work). +- A bundler that supports wasm imports — Vite 6+, Next 15+, or Bun. + +## 1. Install + +```bash +pnpm add @taucad/opencascade.js@beta three +pnpm add -D @types/three typescript +``` + +## 2. Initialise OCCT once + +```typescript title="src/ocjs-init.ts" +import init from '@taucad/opencascade.js'; +import wasmUrl from '@taucad/opencascade.js/wasm?url'; + +let ocPromise: ReturnType | undefined; +export const getOc = () => (ocPromise ??= init({ locateFile: () => wasmUrl })); +``` + +The memoised Promise guarantees one wasm fetch and one C++ runtime init per page +load. Re-calling `getOc()` from anywhere in your app resolves immediately after +the first warm-up. + +## 3. Build a shape + +```typescript title="src/build-shape.ts" +import { getOc } from './ocjs-init'; + +export const buildFilletedBox = async () => { + const oc = await getOc(); + using box = new oc.BRepPrimAPI_MakeBox(60, 40, 20); + using fillet = new oc.BRepFilletAPI_MakeFillet(box.Shape()); + using explorer = new oc.TopExp_Explorer(box.Shape(), oc.TopAbs_ShapeEnum.TopAbs_EDGE); + while (explorer.More()) { + fillet.Add(3, oc.TopoDS.Edge(explorer.Current())); + explorer.Next(); + } + return fillet.Shape(); +}; +``` + +Every OCCT object is disposable — `using` invokes `Symbol.dispose()` at scope +exit so the C++ heap doesn't leak. + +## 4. Export to GLB + +```typescript title="src/shape-to-glb.ts" +import type { TopoDS_Shape } from '@taucad/opencascade.js'; +import { getOc } from './ocjs-init'; + +export const shapeToGlb = async (shape: TopoDS_Shape): Promise => { + const oc = await getOc(); + using docName = new oc.TCollection_ExtendedString('doc', true); + const doc = new oc.TDocStd_Document(docName); + oc.XCAFDoc_DocumentTool.ShapeTool(doc.Main()).get().AddShape(shape, false, false); + using _mesh = new oc.BRepMesh_IncrementalMesh(shape, 0.1, false, 0.5, false); + const path = `/out_${Date.now()}.glb`; + using asciiPath = new oc.TCollection_AsciiString(path); + using writer = new oc.RWGltf_CafWriter(asciiPath, true); + using metadata = new oc.TColStd_IndexedDataMapOfStringString(); + using progress = new oc.Message_ProgressRange(); + writer.Perform(doc, metadata, progress); + const raw = oc.FS.readFile(path) as Uint8Array; + oc.FS.unlink(path); + return new Uint8Array(raw); +}; +``` + +The `new Uint8Array(raw)` copy is mandatory — `FS.readFile` returns a view into +MEMFS that becomes invalid after `unlink`. + +## 5. Render in three.js + +```typescript title="src/main.ts" +import * as THREE from 'three'; +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'; +import { buildFilletedBox } from './build-shape'; +import { shapeToGlb } from './shape-to-glb'; + +const canvas = document.querySelector('#viewer')!; +const renderer = new THREE.WebGLRenderer({ canvas, antialias: true }); +const scene = new THREE.Scene(); +const camera = new THREE.PerspectiveCamera(45, 1, 0.1, 5000); +camera.position.set(100, 100, 100); +scene.add(new THREE.AmbientLight(0xffffff, 0.5)); +const dir = new THREE.DirectionalLight(0xffffff, 1); +dir.position.set(1, 1, 1); +scene.add(dir); +new OrbitControls(camera, renderer.domElement); + +const shape = await buildFilletedBox(); +const glb = await shapeToGlb(shape); +new GLTFLoader().parse(glb.buffer, '', (gltf) => scene.add(gltf.scene)); + +renderer.setAnimationLoop(() => renderer.render(scene, camera)); +``` + +Visit `localhost:5173` and you'll see a filleted gray box you can orbit. + +> **Want threading?** For batch meshing and boolean workloads, import `@taucad/opencascade.js/multi` instead of the default export. Browser deployments require COOP/COEP headers — see the [Multi-threaded build guide](../guides/multi-threading) and [Bundler & locateFile — Multi-threaded variant](../guides/bundler-locatefile#multi-threaded-variant). + +## Next steps + +- Need a different bundler? See [Bundler & locateFile](../guides/bundler-locatefile). +- Want a smaller wasm? See [Trim symbols](../guides/trim-symbols). +- Looking for STEP instead of GLB? See [Export STEP](../guides/export-step). diff --git a/docs-site/content/docs/package/getting-started/what-is-opencascade-js.mdx b/docs-site/content/docs/package/getting-started/what-is-opencascade-js.mdx new file mode 100644 index 00000000..6c56dbab --- /dev/null +++ b/docs-site/content/docs/package/getting-started/what-is-opencascade-js.mdx @@ -0,0 +1,45 @@ +--- +title: What is OpenCascade.js +description: One-page concept — what OpenCascade.js is, why it exists, and when to reach for it. +--- + +`@taucad/opencascade.js` brings the OpenCASCADE Technology kernel — a 30-year-old +production-grade BRep CAD library — into the WebAssembly runtime. Every public +OCCT symbol the package configures becomes a TypeScript class with overloaded +constructors, typed methods, and full `.d.ts` coverage. + +## Why a CAD kernel in WebAssembly + +Browser-native CAD historically meant polygon-only mesh editing. A BRep kernel +gives you: + +- **Exact geometry** — curves and surfaces are analytic, not polygonal. Booleans, + fillets, chamfers, threads all run on parametric primitives. +- **Standards-grade interchange** — read and write STEP (`AP214` / `AP242`), IGES, + STL, and GLB out of the box; no external tooling required. +- **Full feature parity with desktop CAD** — `BRepPrimAPI_*` primitives, + `BRepAlgoAPI_*` booleans, `BRepFilletAPI_*` fillets, `XCAF*` for assemblies + and materials. + +## When to use OpenCascade.js + +| Use case | Good fit | Bad fit | +|---|---|---| +| Parametric CAD app | Yes | — | +| STEP / IGES interchange | Yes | — | +| Procedural mesh generation | Yes | three.js or manifold-3d may be lighter | +| Real-time interactive booleans (>60 fps) | Maybe — measure first | Reach for manifold-3d | +| Cloud STEP-to-GLB conversion | Yes | — | + +## When NOT to use it + +- You only need polygon meshes — `three.js` + `manifold-3d` is smaller and faster. +- You need sub-megabyte wasm — full OCCT is ~38 MB; even trimmed it sits at ~12 MB + for a typical "box + boolean + export" surface. +- You need synchronous-only call sites — every `init` returns a Promise. + +## Where to next + +- [Quickstart — npm](./quick-start-npm) — render a box in 20 lines of TypeScript. +- [Trim symbols](../guides/trim-symbols) — cut the wasm from 38 MB down to what your app uses. +- [API Reference](/docs/package/api) — search every bound class and method. diff --git a/docs-site/content/docs/package/guides/bundler-locatefile.mdx b/docs-site/content/docs/package/guides/bundler-locatefile.mdx new file mode 100644 index 00000000..b878e01a --- /dev/null +++ b/docs-site/content/docs/package/guides/bundler-locatefile.mdx @@ -0,0 +1,248 @@ +--- +title: Bundler & locateFile +description: How to wire the OCCT wasm asset in Vite, Next.js, Bun, Deno, and plain Node. +--- + +`init()` accepts a `locateFile` callback that returns the URL where the runtime +should fetch the wasm binary. The right answer depends on your bundler. + +The package exposes the binary through the `@taucad/opencascade.js/wasm` +subpath export. Every snippet on this page resolves the wasm through that +specifier; resolving it any other way (deep `node_modules` paths, direct +`dist/*` imports) bypasses the package's `exports` map and breaks under +strict bundler resolution. + +## Vite 6+ + +Vite's `?url` suffix turns any asset import into a content-hashed URL string. +Use it for both dev and production: + +```typescript +import init from '@taucad/opencascade.js'; +import wasmUrl from '@taucad/opencascade.js/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); +``` + +Add `@taucad/opencascade.js` to `optimizeDeps.exclude` in `vite.config.ts` so +Vite skips its dep-optimizer for the binary module: + +```typescript title="vite.config.ts" +import { defineConfig } from 'vite'; +export default defineConfig({ + optimizeDeps: { exclude: ['@taucad/opencascade.js'] }, +}); +``` + +## Next.js 15 (App Router) + +Next's App Router lacks a first-class `?url` wasm import. The reliable pattern +is to copy the wasm into `public/` at install time via a postinstall script +that resolves the subpath: + +```javascript title="scripts/copy-wasm.mjs" +import { copyFile, mkdir } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; + +const src = fileURLToPath(import.meta.resolve('@taucad/opencascade.js/wasm')); +await mkdir('public', { recursive: true }); +await copyFile(src, 'public/opencascade_full.wasm'); +``` + +```json title="package.json" +{ + "scripts": { + "postinstall": "node scripts/copy-wasm.mjs" + } +} +``` + +Then reference the public path: + +```typescript title="lib/ocjs-init.ts" +'use client'; +import init from '@taucad/opencascade.js'; + +let ocPromise: ReturnType | undefined; +export const getOc = () => (ocPromise ??= init({ locateFile: () => '/opencascade_full.wasm' })); +``` + +Mark `@taucad/opencascade.js` as a server external package if you only call it +client-side: + +```typescript title="next.config.ts" +import type { NextConfig } from 'next'; +const config: NextConfig = { + serverExternalPackages: ['@taucad/opencascade.js'], +}; +export default config; +``` + +## Bun + +Bun resolves wasm imports natively. The `?url` pattern works identically to +Vite. No extra config required. + +## Node (ESM) + +Use `import.meta.resolve` to find the wasm sibling to the loader: + +```typescript +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import init from '@taucad/opencascade.js'; + +const WASM_DIR = dirname( + fileURLToPath(import.meta.resolve('@taucad/opencascade.js/wasm')), +); + +const oc = await init({ locateFile: (file: string) => join(WASM_DIR, file) }); +``` + +## Deno + +Deno exposes the same `import.meta.resolve` API as Node 22+. The Node snippet +above works unchanged. + +## Webpack 5 + +Webpack 5 handles wasm via `asset/resource` (preferred) or the legacy +`file-loader`. Wire `locateFile` to the emitted URL: + +```typescript title="src/ocjs-init.ts" +import init from '@taucad/opencascade.js'; +import wasmUrl from '@taucad/opencascade.js/wasm'; + +const oc = await init({ + locateFile: (file) => (file.endsWith('.wasm') ? wasmUrl : file), +}); +``` + +```javascript title="webpack.config.js" +module.exports = { + module: { + rules: [ + { + test: /\.wasm$/, + type: 'asset/resource', + }, + ], + }, + resolve: { + fallback: { + fs: false, + perf_hooks: false, + os: false, + path: false, + worker_threads: false, + crypto: false, + stream: false, + }, + }, +}; +``` + +Mark `@taucad/opencascade.js` as an external or exclude it from aggressive +bundle inlining — the 12+ MB wasm must stay a separate fetch. + +## Legacy bundlers + +Create-React-App, `react-app-rewired`, and Webpack 4 are **not supported** in +V3 docs. The upstream Docusaurus site preserved CRA recipes in git history at +[`website/docs/02-getting-started/02-configure-bundler.md`](https://github.com/taucad/opencascade.js/blob/master/website/docs/02-getting-started/02-configure-bundler.md) +(recoverable via `git show HEAD:website/docs/02-getting-started/02-configure-bundler.md` +in this repo). Use Vite, Next 15, Bun, Node, Deno, or Webpack 5 instead. + +## Common pitfalls + +- **`locateFile` is mandatory**. The single-file V3 build does not auto-discover + its wasm sibling — every consumer must provide a URL. +- **Don't bundle the wasm inline**. Bundling the 12+ MB binary as base64 explodes + your JS payload and prevents the browser's wasm streaming compiler. +- **Cache the `init` Promise**. Re-calling `init()` re-instantiates the wasm + module — always memoize behind a singleton. + +## Multi-threaded variant + +The pthread-enabled build ships under `@taucad/opencascade.js/multi` with wasm at `@taucad/opencascade.js/multi/wasm`. The `init` contract is identical — only the import path and wasm target change. + +**Browser prerequisite:** every page that loads the threaded wasm must send cross-origin isolation headers: + +```http +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +``` + +Without these headers, browsers refuse to expose `SharedArrayBuffer` and the wasm fails to instantiate. See the [multi-threaded build guide](./multi-threading) for benchmarks and when not to ship threaded. + +Run the following **once** after `await init(...)` in every recipe below — it matches the benchmark harness and is required for full speedup on mesh/boolean workloads: + +```typescript +oc.BOPAlgo_Options.SetParallelMode(true); +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); +const pool = oc.OSD_ThreadPool.DefaultPool(-1); +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); +``` + +### Vite 6+ + +```typescript +import init from '@taucad/opencascade.js/multi'; +import wasmUrl from '@taucad/opencascade.js/multi/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); + +oc.BOPAlgo_Options.SetParallelMode(true); +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); +const pool = oc.OSD_ThreadPool.DefaultPool(-1); +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); +``` + +### Next.js 15 (App Router) + +Copy the MT wasm into `public/` at install time: + +```javascript title="scripts/copy-wasm-multi.mjs" +import { copyFile, mkdir } from 'node:fs/promises'; +import { fileURLToPath } from 'node:url'; + +const src = fileURLToPath(import.meta.resolve('@taucad/opencascade.js/multi/wasm')); +await mkdir('public', { recursive: true }); +await copyFile(src, 'public/opencascade_full_multi.wasm'); +``` + +```typescript title="lib/ocjs-init-multi.ts" +'use client'; +import init from '@taucad/opencascade.js/multi'; + +let ocPromise: ReturnType | undefined; +export const getOcMulti = () => + (ocPromise ??= init({ locateFile: () => '/opencascade_full_multi.wasm' }).then((oc) => { + oc.BOPAlgo_Options.SetParallelMode(true); + oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); + const pool = oc.OSD_ThreadPool.DefaultPool(-1); + pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); + return oc; + })); +``` + +### Node (ESM) + +```typescript +import { fileURLToPath } from 'node:url'; +import { dirname, join } from 'node:path'; +import init from '@taucad/opencascade.js/multi'; + +const WASM_DIR = dirname( + fileURLToPath(import.meta.resolve('@taucad/opencascade.js/multi/wasm')), +); + +const oc = await init({ locateFile: (file: string) => join(WASM_DIR, file) }); + +oc.BOPAlgo_Options.SetParallelMode(true); +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); +const pool = oc.OSD_ThreadPool.DefaultPool(-1); +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); +``` + +Per-call overrides (`SetRunParallel(true)`, `BRepMesh_IncrementalMesh(..., isInParallel=true)`) remain available for granular opt-in. See [Multi-threaded build — Per-call activation](./multi-threading#per-call-activation--granular). diff --git a/docs-site/content/docs/package/guides/debugging-wasm-exceptions.mdx b/docs-site/content/docs/package/guides/debugging-wasm-exceptions.mdx new file mode 100644 index 00000000..f2dca989 --- /dev/null +++ b/docs-site/content/docs/package/guides/debugging-wasm-exceptions.mdx @@ -0,0 +1,75 @@ +--- +title: Debugging wasm exceptions +description: Decode WebAssembly.Exception into actionable error messages with getExceptionMessage. +--- + +When OCCT throws a `Standard_Failure` inside the wasm module, the value that +reaches your JS try/catch is a `WebAssembly.Exception` object. Printing it +with `console.error(error)` yields `[object WebAssembly.Exception]` — useless. + +`@taucad/opencascade.js@beta` exposes `getExceptionMessage(error)` to decode +the C++ failure into a string. + +## The pattern + +```typescript +import init, { getExceptionMessage } from '@taucad/opencascade.js'; + +const oc = await init({ locateFile }); + +try { + using fillet = new oc.BRepFilletAPI_MakeFillet(badShape); + fillet.Shape(); // may throw +} catch (error: unknown) { + if (error instanceof WebAssembly.Exception) { + console.error('OCCT failure:', getExceptionMessage(error)); + } else { + throw error; + } +} +``` + +`getExceptionMessage` reaches into the wasm-side `Standard_Failure::GetMessageString()` +and returns the text OCCT actually attached to the exception (e.g. +`"BRepFilletAPI_MakeFillet: Empty argument"`). + +## Why not just `error.message`? + +`WebAssembly.Exception` is a JS host object — its `message` field is empty for +C++-thrown values. The actual text lives in C++ memory, addressable only by +walking back into the wasm module. + +## Common OCCT exceptions + +| Message fragment | Likely cause | +|---|---| +| `Standard_OutOfRange` | Index past the end of an `NCollection_*` container | +| `Standard_NullObject` | Method called on a null `Handle` (forgot to check `.IsNull()`) | +| `Standard_NoSuchObject` | Map lookup returned nothing | +| `Standard_TypeMismatch` | Downcast to the wrong `TopoDS_*` subtype | +| `BRepAlgoAPI_*: ...` | Boolean failure — usually self-intersecting input | +| `BRepFilletAPI_MakeFillet: ...` | Fillet radius too large, or degenerate edge | +| `STEPControl_Writer: write.step.schema not set` | Forgot `Interface_Static.SetIVal('write.step.schema', 5)` | + +## Async-safe pattern + +If your call site awaits between the `try` and the throw, wrap the offending +synchronous block tightly: + +```typescript +const filletShape = await runOcctSync(() => { + using fillet = new oc.BRepFilletAPI_MakeFillet(shape); + for (const edge of edges) fillet.Add(3, edge); + return fillet.Shape(); +}); +``` + +Wide async try/catch boundaries swallow the `WebAssembly.Exception` type +discriminator on some engines. + +## Debug builds + +For deep debugging, build with `-g -fwasm-exceptions -O1` and load +[Chrome's wasm DWARF debugger](https://developer.chrome.com/blog/wasm-debugging-2020). +You get the original C++ frames in the call stack — invaluable when an OCCT +exception originates ten frames deep in `BOPAlgo_PaveFiller`. diff --git a/docs-site/content/docs/package/guides/export-gltf.mdx b/docs-site/content/docs/package/guides/export-gltf.mdx new file mode 100644 index 00000000..873e91e4 --- /dev/null +++ b/docs-site/content/docs/package/guides/export-gltf.mdx @@ -0,0 +1,85 @@ +--- +title: Export glTF / GLB +description: RWGltf_CafWriter pipeline with XCAF documents, materials, and assembly support. +--- + +GLB is the binary single-file flavour of glTF and the format three.js, Babylon, +Filament, and most realtime renderers consume natively. OCCT writes it via the +`RWGltf_CafWriter` against an XCAF document. + +## Minimal single-shape GLB + +```typescript +import type { TopoDS_Shape } from '@taucad/opencascade.js'; +import { getOc } from './ocjs-init'; + +export const shapeToGlb = async (shape: TopoDS_Shape): Promise => { + const oc = await getOc(); + + using docName = new oc.TCollection_ExtendedString('doc', true); + const doc = new oc.TDocStd_Document(docName); + const shapeTool = oc.XCAFDoc_DocumentTool.ShapeTool(doc.Main()).get(); + shapeTool.AddShape(shape, false, false); + + using _mesh = new oc.BRepMesh_IncrementalMesh(shape, 0.1, false, 0.5, false); + + const path = `/out_${Date.now()}.glb`; + using asciiPath = new oc.TCollection_AsciiString(path); + using writer = new oc.RWGltf_CafWriter(asciiPath, true); // true = binary GLB + using metadata = new oc.TColStd_IndexedDataMapOfStringString(); + using progress = new oc.Message_ProgressRange(); + writer.Perform(doc, metadata, progress); + + const raw = oc.FS.readFile(path) as Uint8Array; + oc.FS.unlink(path); + return new Uint8Array(raw); +}; +``` + +## Per-shape PBR material + +Attach a `XCAFDoc_VisMaterial` to a shape label and the GLB writer emits a glTF +`materials[]` entry with PBR base color, metalness, and roughness. + +```typescript +const shapeLabel = shapeTool.AddShape(shape, false, false); + +using matName = new oc.TCollection_AsciiString('Brass'); +const vmTool = oc.XCAFDoc_DocumentTool.VisMaterialTool(doc.Main()).get(); +using visMat = new oc.XCAFDoc_VisMaterial(); +using pbr = new oc.XCAFDoc_VisMaterialPBR(); +pbr.BaseColor = new oc.Quantity_ColorRGBA(0.85, 0.65, 0.13, 1); +pbr.Metallic = 0.9; +pbr.Roughness = 0.25; +visMat.SetPbrMaterial(pbr); +const matLabel = vmTool.AddMaterial(visMat, matName); +vmTool.SetShapeMaterial(shapeLabel, matLabel); +``` + +## Tessellation tolerances + +`BRepMesh_IncrementalMesh(shape, linearDeflection, isRelative, angularDeflection, inParallel)` + +| Param | Typical value | Effect | +|---|---|---| +| linearDeflection | 0.05 – 0.5 mm | Max chord–surface distance | +| isRelative | `false` | When `true`, deflection scales with bbox | +| angularDeflection | 0.5 rad | Max angle between facets along a curve | +| inParallel | `false` | Single-threaded in browser builds | + +Tighten linear deflection for small features (M3 threads need ~0.01 mm). +OCCT caches triangulation on the shape; pass `decreate=true` as the third +positional argument to force regeneration when you change tolerances. + +## Coordinate system + +GLB is **Y-up** by convention; OCCT is **Z-up**. `RWGltf_CafWriter` emits Z-up +data and lets the consumer interpret it. Most three.js workflows pre-rotate +the scene with `-Math.PI/2` around the X axis to align with glTF Y-up +expectations. + +## Validating the output + +- [glTF Viewer (Don McCurdy)](https://gltf-viewer.donmccurdy.com/) — drag-drop validation. +- [gltf-validator](https://github.com/KhronosGroup/glTF-Validator) — Node CLI for CI. +- Open in Blender — full PBR roundtrip with materials. diff --git a/docs-site/content/docs/package/guides/export-step.mdx b/docs-site/content/docs/package/guides/export-step.mdx new file mode 100644 index 00000000..8e589037 --- /dev/null +++ b/docs-site/content/docs/package/guides/export-step.mdx @@ -0,0 +1,108 @@ +--- +title: Export STEP +description: Write AP214 / AP242 STEP files via STEPControl_Writer and STEPCAFControl_Writer for assemblies. +--- + +STEP is the de-facto interchange format for parametric CAD. OCCT exposes two +writers depending on whether you need an assembly tree. + +## Single shape — STEPControl_Writer + +```typescript +import type { TopoDS_Shape } from '@taucad/opencascade.js'; +import { getOc } from './ocjs-init'; + +export const shapeToStep = async (shape: TopoDS_Shape): Promise => { + const oc = await getOc(); + using writer = new oc.STEPControl_Writer(); + using progress = new oc.Message_ProgressRange(); + oc.Interface_Static.SetIVal('write.step.schema', 5); // AP214 + + const transferStatus = writer.Transfer( + shape, + oc.STEPControl_StepModelType.STEPControl_AsIs, + true, + progress, + ); + if (transferStatus !== oc.IFSelect_ReturnStatus.IFSelect_RetDone) { + throw new Error('STEP Transfer failed'); + } + + const path = `/out_${Date.now()}.step`; + const writeStatus = writer.Write(path); + if (writeStatus !== oc.IFSelect_ReturnStatus.IFSelect_RetDone) { + throw new Error('STEP Write failed'); + } + + const raw = oc.FS.readFile(path) as Uint8Array; + oc.FS.unlink(path); + return new Uint8Array(raw); +}; +``` + +Two return-status checks are mandatory — OCCT silently produces a zero-byte +file otherwise. + +## Multi-shape assembly — STEPCAFControl_Writer + +For assemblies with named parts, per-shape colors, or PBR materials, write the +shape into an XCAF document first, then use `STEPCAFControl_Writer.Perform`. +**Never** use the empty-filename `Transfer` overload — it silently activates +multi-file mode and emits an empty STEP body. + +```typescript +import { getOc } from './ocjs-init'; + +export const assemblyToStep = async (shapes: Array<{ name: string; shape: TopoDS_Shape }>) => { + const oc = await getOc(); + using docName = new oc.TCollection_ExtendedString('doc', true); + const doc = new oc.TDocStd_Document(docName); + const shapeTool = oc.XCAFDoc_DocumentTool.ShapeTool(doc.Main()).get(); + + for (const { name, shape } of shapes) { + const label = shapeTool.AddShape(shape, false, false); + using nameStr = new oc.TCollection_ExtendedString(name, true); + oc.TDataStd_Name.Set(label, nameStr); + } + + using writer = new oc.STEPCAFControl_Writer(); + using progress = new oc.Message_ProgressRange(); + oc.Interface_Static.SetIVal('write.step.schema', 5); + + const path = `/asm_${Date.now()}.step`; + const ok = writer.Perform(doc, path, progress); + if (!ok) throw new Error('STEP assembly write failed'); + + const raw = oc.FS.readFile(path) as Uint8Array; + oc.FS.unlink(path); + return new Uint8Array(raw); +}; +``` + +## Schema selection + +| Code | Schema | Use when | +|---|---|---| +| 1 | AP203 (config control) | Legacy mech CAD; avoid for new work | +| 4 | AP214 (auto industry) | Default — broad tool support | +| 5 | AP214 (alt revision) | Recommended for new projects | +| 6 | AP242 (managed model-based) | If you need PMI / PBR materials | + +AP242 emits the same geometry as AP214 plus product manufacturing information +attached to the model. Most consumers (Fusion 360, SolidWorks, FreeCAD) +auto-detect schema and treat 5 and 6 interchangeably for pure geometry. + +## Bytes out, file in + +- **Browser**: `URL.createObjectURL(new Blob([bytes], { type: 'application/step' }))` + and trigger a download via a hidden `` tag. +- **Node**: `fs.writeFileSync('out.step', bytes)`. +- **Cloud**: pipe directly to S3 / GCS as `application/octet-stream`. + +## Common pitfalls + +- Check `IFSelect_RetDone` after **both** `Transfer` and `Write` — partial + failures are silent otherwise. +- Always `unlink` the MEMFS path after `FS.readFile` to free the wasm heap. +- Copy bytes out of MEMFS (`new Uint8Array(raw)`) — the original view becomes + detached after `unlink`. diff --git a/docs-site/content/docs/package/guides/multi-threading.mdx b/docs-site/content/docs/package/guides/multi-threading.mdx new file mode 100644 index 00000000..ad87a96a --- /dev/null +++ b/docs-site/content/docs/package/guides/multi-threading.mdx @@ -0,0 +1,210 @@ +--- +title: Multi-threaded build +description: Opt into pthread-enabled OCCT for parallel meshing and boolean workloads via @taucad/opencascade.js/multi. +--- + +The npm package ships **two** pre-built variants: + +| Import | Binary | When to use | +| --- | --- | --- | +| `@taucad/opencascade.js` (default) | `opencascade_full.wasm` | Embeddable widgets, one-op-per-click UX, no COOP/COEP | +| `@taucad/opencascade.js/multi` | `opencascade_full_multi.wasm` | Batch mesh/boolean, STEP→glTF pipelines, COOP/COEP-isolated surfaces | + +Load the threaded variant the same way as the default — import `@taucad/opencascade.js/multi` and resolve wasm through `@taucad/opencascade.js/multi/wasm`. See [Bundler & locateFile](./bundler-locatefile#multi-threaded-variant) for Vite, Next.js, and Node recipes. + +OCCT can drive multiple worker threads for mesh and boolean kernels once the pthread-enabled wasm is loaded. That requires hard browser prerequisites (`SharedArrayBuffer` + cross-origin isolation) in the browser; Node 22+ exposes `SharedArrayBuffer` without extra headers. + +## When to consider it + +| Operation | Speedup with 4 threads | Worth the COOP/COEP cost? | +|---|---:|---| +| `BRepMesh_IncrementalMesh` on large assemblies | 2.5–3.5× | Yes, for visualisation pipelines | +| `BRepAlgoAPI_*` booleans on hundreds of operands | 2–3× | Yes, for batch CAD operations | +| `STEPControl_Reader.Transfer` of large STEP files | 1.5–2× | Marginal — IO usually dominates | +| Single-shape build (box + fillet + export) | 1.0× | No | + +If your app does one boolean and one mesh per user interaction, single-threaded +is fine. If you batch hundreds of operations, threading pays off. + +See [BENCHMARKS.md](https://github.com/taucad/opencascade.js/blob/main/BENCHMARKS.md) for ST vs MT numbers on a representative workload mix. + +## Browser prerequisites + +Pthread builds use `SharedArrayBuffer`, which browsers gate behind +**cross-origin isolation**. Your server must send: + +```http +Cross-Origin-Opener-Policy: same-origin +Cross-Origin-Embedder-Policy: require-corp +``` + +…on every page that imports the threaded wasm. Without these headers, browsers +refuse to expose `SharedArrayBuffer` and the wasm fails to instantiate. + +Node 22+ exposes `SharedArrayBuffer` unconditionally — no headers needed. + +## Triggering OCCT parallelism + +OCCT respects its own `OSD_Parallel` switches once threads exist. Two +levels of activation are available — **per-call** (granular, opt-in at +each site) and **global** (sets a process-wide default). + +### Global activation — call once at startup + +The cleanest option: flip the OCCT-wide defaults once, then any subsequent +call to a parallel-aware API inherits the toggle without an extra argument. + +```typescript +// Run once after `await init({...})`. +oc.BOPAlgo_Options.SetParallelMode(true); // booleans +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); // meshing + +// Right-size the OCCT thread pool to all logical CPUs. -1 means +// "use NbLogicalProcessors". SetNbDefaultThreadsToLaunch caps the +// fan-out of any single OCCT call; default is the pool size. +const pool = oc.OSD_ThreadPool.DefaultPool(-1); +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); +``` + +After these four calls every `new BRepMesh_IncrementalMesh(shape, lin)` and +every `BRepAlgoAPI_*` automatically fans out across the pool. **No +per-call argument required.** + +Skipping the pool sizing leaves OCCT's lazy default pool smaller than the +pre-spawned worker count baked into the binary (`PTHREAD_POOL_SIZE=navigator.hardwareConcurrency`) +and caps speedup on mesh/boolean workloads. + +### Per-call activation — granular + +If you want to keep the global default off and opt in selectively: + +```typescript +using mesh = new oc.BRepMesh_IncrementalMesh( + shape, + 0.1, // linear deflection + false, // not relative + 0.5, // angular deflection + true, // inParallel — flips multi-threading on +); +``` + +```typescript +using bop = new oc.BRepAlgoAPI_BuilderAlgo(); +bop.SetRunParallel(true); +// ... AddArgument / AddTool / Build() +``` + +`SetRunParallel(false)` is the default for per-instance APIs. OCJS does +not auto-enable it unless you flip the global default above. + +### Other parallel-aware APIs + +Beyond mesh and boolean, the following APIs accept a parallel flag and +benefit when the pool is sized correctly: + +| API | Activation | +|---|---| +| `BRepExtrema_DistShapeShape` | `.SetMultiThread(true)` | +| `BRepCheck_Analyzer` | ctor `(shape, /*isParallel*/ true)` | +| `RWGltf_CafReader` | `.SetParallel(true)` (glTF **read**) | +| `RWGltf_CafWriter` | `.SetParallel(true)` (glTF **write**) | +| `BVH_Builder` | `.SetParallel(true)` | +| `BRepLib_ValidateEdge`, `BRepLib_CheckCurveOnSurface`, `GeomLib_CheckCurveOnSurface` | `.SetParallel(true)` — used transitively by `BRepCheck_Analyzer` | +| `BRepFill_AdvancedEvolved` | already parallel by default — call `SetParallelMode(false)` to disable | + +**STEP/IGES readers (`STEPControl_Reader`, `IGESControl_Reader`) and +`BRepBuilderAPI_Sewing` are sequential** in current OCCT — there is no +parallel flag to flip. + +## Costs + +- **COOP/COEP headers** lock you out of third-party iframes that don't opt in + (e.g. embedded Stripe checkout, some auth providers). Subdomain-isolate + your CAD surface if that matters. +- **Thread spawn time** adds ~50–200 ms to init, scaling with pool size. + Memoise the `init()` Promise. +- **Memory** scales with `PTHREAD_POOL_SIZE × STACK_SIZE`. With the + shipped `navigator.hardwareConcurrency` sizing, a 12-core box + reserves ~96 MB of stack on top of `INITIAL_MEMORY`. +- **Debuggability** drops — `console.log` from worker threads doesn't always + reach the main thread. + +## Performance notes + +Pthread + `-sALLOW_MEMORY_GROWTH=1` carries a documented Emscripten +performance penalty (the `-Wpthreads-mem-growth` advisory at link time): +every JS↔WASM memory boundary crossing has to re-resolve `HEAP*` views +after a potential `memory.grow`, and worker-thread access to `HEAPU8`/ +`HEAPF32` is gated on the views being up-to-date in each worker's +context. The shipped binaries already mitigate the worst of this: + +- **mimalloc** is wired into the WASM allocator so per-thread allocation + bypasses the global malloc contention point. The `mallinfo` undefined + symbol you'll see in custom-build link logs is mimalloc's debug-stats + reporter — `wasm-ld` emits a single `-Wjs-compiler` warning for it + (the link permits it via the broad `-Wl,--allow-undefined` flag in + the shipped `emccFlags`) and the symbol is dead-code-eliminated at + module load. The warning is informational; no runtime call ever + resolves to it. +- **Hoist `HEAP*` references out of hot loops** when calling OCJS from + TypeScript. The Emscripten glue re-fetches `Module.HEAPU8` etc. on every + access; pulling them into a local once per batch avoids the dispatch + penalty: + +```typescript +// Slow — re-resolves HEAPU8 every iteration. +for (let i = 0; i < n; i++) { + Module.HEAPU8[buf + i] = bytes[i]; +} + +// Fast — single resolve, then tight loop. +const heap = Module.HEAPU8; +for (let i = 0; i < n; i++) { + heap[buf + i] = bytes[i]; +} +``` + +### `toResizableBuffer()` support matrix (May 2026) + +The newer [`WebAssembly.Memory.prototype.toResizableBuffer()`](https://developer.mozilla.org/en-US/docs/WebAssembly/Reference/JavaScript_interface/Memory) +API lets a pthread-enabled binary avoid the HEAP-view re-fetch dance +entirely by returning a `SharedArrayBuffer` that automatically tracks +`memory.grow`. The shipped `@taucad/opencascade.js/multi` binary keeps +`-sGROWABLE_ARRAYBUFFERS=0` (the default) because the runtime matrix is +not yet universal: + +| Runtime | Supports `toResizableBuffer()` | +|---|---| +| Chrome 144+ / Edge 144+ | Yes | +| Firefox 145+ | Yes | +| Safari 26.2+ (desktop + iOS) | Yes | +| Node.js 22 / 24 | **No** — `TypeError: wasmMemory.toResizableBuffer is not a function` | +| Bun (all current) | **No** | +| Deno (all current) | **No** | +| Samsung Internet | **No** (as of May 2026) | + +The default `full_multi.yml` therefore keeps `-sGROWABLE_ARRAYBUFFERS=0` +so the binary stays compatible with Node-based test runners, Bun, Deno, +and the legacy mobile browser. A **browser-only opt-in** variant ships +via [`full_multi_browser.yml`](/docs/toolchain/guides/multi-threading#browser-only-mt-build) +for deployments that have audited their runtime matrix and want the +no-resize-dance fast path on the supported browsers. + +For most consumers the cost is invisible — OCCT's per-call cost on +mesh/boolean dominates the HEAP-view re-fetch by 2-3 orders of magnitude. +Reach for `full_multi_browser.yml` only when you've profiled and the +JS↔WASM boundary is on the hot path. + +## When NOT to ship threaded + +- You can't (or won't) set COOP/COEP headers — most CDNs/marketing sites can't. +- Your workload is one shape per second — Amdahl's law eats the speedup. +- Your target users include Safari ≤16 — older Safari refused + `SharedArrayBuffer` in cross-origin-isolated contexts. + +For most consumers the single-threaded default wins on simplicity. Reach for +`@taucad/opencascade.js/multi` only when you have measured the bottleneck. + +## Custom builds + +Need a smaller threaded binary (trimmed symbol list) or custom Emscripten flags? See [Toolchain — Custom multi-threaded build](/docs/toolchain/guides/multi-threading) for the YAML recipe and `PTHREAD_POOL_SIZE` rationale. diff --git a/docs-site/content/docs/package/guides/render-with-three-js.mdx b/docs-site/content/docs/package/guides/render-with-three-js.mdx new file mode 100644 index 00000000..a4a7bbc3 --- /dev/null +++ b/docs-site/content/docs/package/guides/render-with-three-js.mdx @@ -0,0 +1,72 @@ +--- +title: Render with three.js +description: OCCT shape → GLB → three.js GLTFLoader with orbit controls and lights. +--- + +`@taucad/opencascade.js` produces GLB bytes through OCCT's XCAF + `RWGltf_CafWriter` +pipeline. three.js consumes GLB via `GLTFLoader`. The whole flow is in-browser — +no server round-trip. + +## End-to-end snippet + +```typescript title="src/render.ts" +import * as THREE from 'three'; +import { GLTFLoader } from 'three/examples/jsm/loaders/GLTFLoader.js'; +import { OrbitControls } from 'three/examples/jsm/controls/OrbitControls.js'; + +export const renderGlb = (canvas: HTMLCanvasElement, glb: Uint8Array): (() => void) => { + const renderer = new THREE.WebGLRenderer({ canvas, antialias: true }); + renderer.setSize(canvas.clientWidth, canvas.clientHeight, false); + renderer.setPixelRatio(globalThis.devicePixelRatio); + + const scene = new THREE.Scene(); + scene.background = new THREE.Color(0x111111); + + const camera = new THREE.PerspectiveCamera(45, canvas.clientWidth / canvas.clientHeight, 0.1, 5000); + camera.position.set(100, 100, 100); + + scene.add(new THREE.AmbientLight(0xffffff, 0.5)); + const dir = new THREE.DirectionalLight(0xffffff, 1); + dir.position.set(1, 1, 1); + scene.add(dir); + + const controls = new OrbitControls(camera, renderer.domElement); + controls.target.set(0, 0, 0); + + new GLTFLoader().parse(glb.buffer, '', (gltf) => scene.add(gltf.scene)); + + renderer.setAnimationLoop(() => { + controls.update(); + renderer.render(scene, camera); + }); + + return () => renderer.dispose(); +}; +``` + +## Why XCAF (and not raw triangle arrays) + +OCCT can hand you raw `Poly_Triangulation` arrays per face, but the XCAF + GLB +path: + +- preserves per-face colors and PBR materials, +- writes valid glTF metadata (asset version, extensions used), +- handles multi-shape assemblies as separate primitives, +- emits indexed buffers so three.js doesn't need to dedupe vertices. + +See [Export glTF / GLB](./export-gltf) for the full pipeline including PBR materials. + +## Common rendering issues + +| Symptom | Likely cause | Fix | +|---|---|---| +| Faceted curves (no smooth shading) | Mesh deflection too coarse | Tighten `BRepMesh_IncrementalMesh` linear deflection (e.g. 0.05) | +| Black model | No lights | Add ambient + directional light; check `dir.position` is non-zero | +| Model offset from origin | Shape has a transform baked in | Verify `TopLoc_Location` or apply `shape.Moved(loc, false)` | +| GLB loads but invisible | Camera inside model | `camera.position.set(100, 100, 100)` and `controls.target.set(0, 0, 0)` | + +## Helper libraries + +For batch shape conversion (multi-shape assemblies, edges-as-fat-lines, +hover-highlight), [`replicad-threejs-helper`](https://github.com/sgenoud/replicad) +wraps the common patterns and works with `@taucad/opencascade.js@beta` directly. diff --git a/docs-site/content/docs/package/guides/visualize-shape-helper.mdx b/docs-site/content/docs/package/guides/visualize-shape-helper.mdx new file mode 100644 index 00000000..f16728bb --- /dev/null +++ b/docs-site/content/docs/package/guides/visualize-shape-helper.mdx @@ -0,0 +1,65 @@ +--- +title: Visualize shape helper +description: Reusable shape-to-GLB pipeline extracted from the per-example boilerplate. +--- + +Every example in this docs site can inline the XCAF → mesh → GLB → blob URL +pipeline. This page documents the canonical helper so you can import it once +instead of copying the boilerplate into every script. + +## `visualizeDoc` + +Build a GLB blob URL from an XCAF document that already contains tessellated shapes: + +```typescript title="lib/visualize.ts" +import type { OpenCascadeInstance } from '@taucad/opencascade.js'; + +export const visualizeDoc = async ( + oc: OpenCascadeInstance, + doc: InstanceType, +): Promise => { + using writer = new oc.RWGltf_CafWriter(new oc.TCollection_AsciiString_2('out.glb'), true); + writer.Perform(doc, new oc.TColStd_IndexedDataMapOfStringString(), new oc.Message_ProgressRange()); + + const fileName = 'out.glb'; + const buffer = oc.FS.readFile(fileName, { encoding: 'binary' }); + oc.FS.unlink(fileName); + + const blob = new Blob([buffer], { type: 'model/gltf-binary' }); + return URL.createObjectURL(blob); +}; +``` + +## `visualizeShapes` + +Convenience wrapper — accepts one or more `TopoDS_Shape` values, builds the XCAF +document, meshes, and returns a GLB blob URL: + +```typescript title="lib/visualize.ts" +import type { OpenCascadeInstance, TopoDS_Shape } from '@taucad/opencascade.js'; + +export const visualizeShapes = async ( + oc: OpenCascadeInstance, + ...shapes: TopoDS_Shape[] +): Promise => { + using doc = new oc.TDocStd_Document(new oc.TCollection_ExtendedString_1()); + const shapeTool = oc.XCAFDoc_DocumentTool.ShapeTool(doc.Main()).get(); + + for (const shape of shapes) { + using mesh = new oc.BRepMesh_IncrementalMesh(shape, 0.1, false, 0.1, false); + const newShape = shapeTool.NewShape(); + shapeTool.SetShape(newShape, shape); + } + + return visualizeDoc(oc, doc); +}; +``` + +## When to inline vs import + +- **First read**: keep the pipeline inline in tutorials so every step is visible. +- **Production code**: import from a single `lib/visualize.ts` module. +- **Multi-material assemblies**: build the XCAF document yourself (see + [Boolean logo](../examples/boolean-logo) for per-subset PBR assignment). + +See also: [Render with three.js](./render-with-three-js). diff --git a/docs-site/content/docs/package/index.mdx b/docs-site/content/docs/package/index.mdx new file mode 100644 index 00000000..d2206230 --- /dev/null +++ b/docs-site/content/docs/package/index.mdx @@ -0,0 +1,31 @@ +--- +title: Package +description: Consume @taucad/opencascade.js from npm — render, export, integrate. +--- + +Install `@taucad/opencascade.js@beta`, call `init()`, build shapes with the full OCCT surface, +export STEP or GLB, and integrate into your bundler of choice. + + + + Install the package, render a box, export STEP in 4 minutes. + + + Build a filleted box and render it in three.js end-to-end. + + + All 4,587 bound classes — searchable, fragment-stable, LLM-ingestible. + + + Fork status, maintenance model, and how to contribute. + + + +## What's in V3 + +- ESM-only single-file build — one wasm, one `init()` Promise, no CommonJS fallback. +- Suffix-free symbol generation — `gp_Pnt` (not `gp_Pnt_3`); overloads dispatched in C++. +- `using` syntax for every disposable shape — RBV containers integrate `Symbol.dispose`. +- Re-architected exception channel — catch JS errors instead of opaque `WebAssembly.Exception`. + +See `CHANGELOG.md` in the repo for the full release notes. diff --git a/docs-site/content/docs/package/meta.json b/docs-site/content/docs/package/meta.json new file mode 100644 index 00000000..c9d95cb4 --- /dev/null +++ b/docs-site/content/docs/package/meta.json @@ -0,0 +1,39 @@ +{ + "title": "Package", + "description": "Consume @taucad/opencascade.js from npm — render, export, integrate.", + "icon": "lib:npm", + "root": true, + "pages": [ + "index", + "---Getting Started---", + "getting-started/quick-start-npm", + "getting-started/what-is-opencascade-js", + "getting-started/first-shape-tutorial", + "getting-started/faq", + "getting-started/projects-using-opencascade-js", + "---Guides---", + "guides/bundler-locatefile", + "guides/multi-threading", + "guides/debugging-wasm-exceptions", + "guides/export-step", + "guides/export-gltf", + "guides/render-with-three-js", + "guides/visualize-shape-helper", + "---Examples---", + "examples/boolean-logo", + "examples/classic-bottle", + "examples/polygon-extrusion", + "---Concepts---", + "concepts/calling-occt-from-js", + "concepts/memory-and-disposables", + "concepts/handles-and-collections", + "concepts/return-shapes", + "---Reference---", + "api", + "reference/ocjs-package-api/init-function", + "reference/ocjs-package-api/module-shape", + "reference/ocjs-package-api/exception-classes", + "---Playground---", + "playground/index" + ] +} diff --git a/docs-site/content/docs/package/playground/index.mdx b/docs-site/content/docs/package/playground/index.mdx new file mode 100644 index 00000000..cae1fbe9 --- /dev/null +++ b/docs-site/content/docs/package/playground/index.mdx @@ -0,0 +1,19 @@ +--- +title: Playground +description: Live, parameterisable OCJS examples — coming once @taucad/runtime ships to npm. +--- + + + +The **Playground** replaces the legacy Docusaurus live `js ocjs` code blocks with +a Fumadocs `` component backed by [`@taucad/runtime`](https://github.com/taucad/tau). +That package is not yet published as a standalone npm release. + +Until it ships, examples remain static code blocks. Track progress in the +[OpenCascade.js repo](https://github.com/taucad/opencascade.js). + + + +When the Playground lands, every example under [Examples](../examples/boolean-logo) +will expose live previews with parameter sliders — the same UX as the original +`ocjs.org` site, but built on `@taucad/runtime` instead of a bespoke Comlink worker. diff --git a/docs-site/content/docs/package/reference/ocjs-package-api/exception-classes.mdx b/docs-site/content/docs/package/reference/ocjs-package-api/exception-classes.mdx new file mode 100644 index 00000000..157e571a --- /dev/null +++ b/docs-site/content/docs/package/reference/ocjs-package-api/exception-classes.mdx @@ -0,0 +1,59 @@ +--- +title: Exception classes +description: OCCT exception class hierarchy and the JS-side getExceptionMessage helper. +--- + +OCCT throws subclasses of `Standard_Failure`. Inside the wasm module, every +throw becomes a `WebAssembly.Exception` instance whose payload is the C++ +object. The OCJS bindings expose: + +- The exception class hierarchy via bound classes (`oc.Standard_Failure`, + `oc.Standard_OutOfRange`, etc.). +- `getExceptionMessage(error)` — a helper that decodes a `WebAssembly.Exception` + into the OCCT failure text. + +## Hierarchy + +```text +Standard_Failure +├── Standard_OutOfRange +├── Standard_NullObject +├── Standard_NoSuchObject +├── Standard_TypeMismatch +├── Standard_DomainError +├── Standard_DivideByZero +└── Standard_ProgramError + └── Standard_NotImplemented +``` + +Every subclass surfaces a `GetMessageString()` and inherits the `What()` +method returning a static identifier. + +## `getExceptionMessage(error)` + +Named export of `@taucad/opencascade.js`. Accepts a `WebAssembly.Exception` +and returns a string. + +```typescript +import init, { getExceptionMessage } from '@taucad/opencascade.js'; + +try { + riskyOcctCall(); +} catch (error: unknown) { + if (error instanceof WebAssembly.Exception) { + console.error('OCCT failure:', getExceptionMessage(error)); + return; + } + throw error; +} +``` + +## What about JS-side `Error.message`? + +`WebAssembly.Exception.message` is empty for C++-thrown values. The real +message lives in C++ memory and must be reached through the helper above. + +## Related + +- [Debugging WASM exceptions](../../guides/debugging-wasm-exceptions) — narrative + debugging guide with common failure modes and chrome wasm debugger setup. diff --git a/docs-site/content/docs/package/reference/ocjs-package-api/init-function.mdx b/docs-site/content/docs/package/reference/ocjs-package-api/init-function.mdx new file mode 100644 index 00000000..04a45943 --- /dev/null +++ b/docs-site/content/docs/package/reference/ocjs-package-api/init-function.mdx @@ -0,0 +1,61 @@ +--- +title: init() function +description: Default export of @taucad/opencascade.js — signature, options, and singleton pattern. +--- + +`init` is the default export of `@taucad/opencascade.js`. It instantiates the +WASM module and returns a Promise resolving to the bound OCCT runtime. + +```typescript +import init from '@taucad/opencascade.js'; +import wasmUrl from '@taucad/opencascade.js/wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); +``` + +The `@taucad/opencascade.js/wasm` subpath export resolves to the shipped +`opencascade_full.wasm`. The multi-threaded variant uses the same `init` +signature from `@taucad/opencascade.js/multi` with wasm at +`@taucad/opencascade.js/multi/wasm`. See [Bundler & locateFile](../../guides/bundler-locatefile) +for Vite, Next.js, Bun, Node, and Deno-specific recipes (including the MT variant). + +## Options + + + +## Memoised singleton pattern + +`init` is expensive — wasm instantiation, runtime bootstrap, and class +registration sum to ~200 ms warm / ~2 s cold. Always memoise the Promise. + +```typescript +let ocPromise: ReturnType | undefined; +export const getOc = () => (ocPromise ??= init({ locateFile: () => wasmUrl })); +``` + +Calling `getOc()` from multiple call sites returns the same Promise; only the +first call triggers init. + +## Return type + +The resolved value is the bound OCCT module — a plain object whose properties +are the bound classes and namespaces (`oc.BRepPrimAPI_MakeBox`, +`oc.TopoDS`, `oc.Interface_Static`) plus emscripten runtime +methods (`oc.FS`, `oc.HEAP8`, `oc.HEAPF32`). + +The full surface is documented under the [API Reference](/docs/package/api). + +## Multi-threaded subpath + +Import `@taucad/opencascade.js/multi` with wasm at `@taucad/opencascade.js/multi/wasm`. The `init` signature is identical; Emscripten pre-spawns pthread workers during instantiation (`PTHREAD_POOL_SIZE=navigator.hardwareConcurrency` is baked into the binary). No extra JS worker wiring is required beyond `locateFile`. + +After `await init(...)`, run this **once** before any parallel-aware OCCT call: + +```typescript +oc.BOPAlgo_Options.SetParallelMode(true); +oc.BRepMesh_IncrementalMesh.SetParallelDefault(true); +const pool = oc.OSD_ThreadPool.DefaultPool(-1); +pool.SetNbDefaultThreadsToLaunch(pool.NbThreads()); +``` + +Skipping the pool sizing leaves OCCT's lazy default pool smaller than the pre-spawned worker count and caps speedup on mesh/boolean workloads. See [Multi-threaded build](../../guides/multi-threading#global-activation--call-once-at-startup) for the full activation walkthrough and [BENCHMARKS.md](https://github.com/taucad/opencascade.js/blob/main/BENCHMARKS.md) for ST vs MT numbers. diff --git a/docs-site/content/docs/package/reference/ocjs-package-api/meta.json b/docs-site/content/docs/package/reference/ocjs-package-api/meta.json new file mode 100644 index 00000000..3666d228 --- /dev/null +++ b/docs-site/content/docs/package/reference/ocjs-package-api/meta.json @@ -0,0 +1,8 @@ +{ + "title": "OCJS package API", + "pages": [ + "init-function", + "module-shape", + "exception-classes" + ] +} diff --git a/docs-site/content/docs/package/reference/ocjs-package-api/module-shape.mdx b/docs-site/content/docs/package/reference/ocjs-package-api/module-shape.mdx new file mode 100644 index 00000000..3ab18712 --- /dev/null +++ b/docs-site/content/docs/package/reference/ocjs-package-api/module-shape.mdx @@ -0,0 +1,74 @@ +--- +title: Module shape +description: Top-level fields exposed on the resolved OCCT module — namespaces, runtime helpers, FS. +--- + +The object returned from `init()` carries every bound class plus emscripten +runtime helpers. + +## Bound classes and namespaces + +Direct properties named after OCCT classes: + +```typescript +const oc = await init({ locateFile }); +const box = new oc.BRepPrimAPI_MakeBox(10, 10, 10); +const point = new oc.gp_Pnt(0, 0, 0); +``` + +OCCT namespaces (e.g. `TopoDS`, `Interface_Static`, `XCAFDoc_DocumentTool`) +appear as static-method-only objects: + +```typescript +oc.Interface_Static.SetIVal('write.step.schema', 5); +const edge = oc.TopoDS.Edge(genericShape); +const shapeTool = oc.XCAFDoc_DocumentTool.ShapeTool(doc.Main()).get(); +``` + +## Filesystem (`oc.FS`) + +The emscripten MEMFS bridge. Used to write OCCT output (`STEP`, `GLB`, `IGES`) +to an in-memory path, then read the bytes out. + +```typescript +const path = `/out_${Date.now()}.step`; +writer.Write(path); +const bytes = oc.FS.readFile(path) as Uint8Array; +oc.FS.unlink(path); +``` + +| Method | Purpose | +|---|---| +| `FS.readFile(path)` | Returns bytes as `Uint8Array` (view into wasm memory — copy out before `unlink`) | +| `FS.writeFile(path, bytes)` | Write input file (e.g. for `STEPControl_Reader.ReadFile`) | +| `FS.unlink(path)` | Free the MEMFS path | +| `FS.mkdir(path)` | Create directory (rare — OCCT writes to `/` by default) | +| `FS.readdir(path)` | List directory contents | + +Full FS API: [emscripten FS reference](https://emscripten.org/docs/api_reference/Filesystem-API.html). + +## Heap views + +| Property | Type | +|---|---| +| `oc.HEAP8` | `Int8Array` view of wasm memory | +| `oc.HEAPU8` | `Uint8Array` | +| `oc.HEAP16`, `HEAPU16` | 16-bit views | +| `oc.HEAP32`, `HEAPU32` | 32-bit views | +| `oc.HEAPF32`, `HEAPF64` | Float views | + +Use for advanced interop (e.g. reading bytes at a `Standard_Address` pointer +returned from a low-level OCCT API). Most consumers never need these. + +## Exception helpers + +```typescript +import init, { getExceptionMessage } from '@taucad/opencascade.js'; +// see /docs/package/guides/debugging-wasm-exceptions +``` + +## Module re-init + +Calling `init()` a second time **re-instantiates** the wasm module — +expensive, and creates two parallel C++ heaps that don't share state. Always +memoise behind a singleton; see [init function](./init-function). diff --git a/docs-site/content/docs/package/reference/ocjs-package-api/types.ts b/docs-site/content/docs/package/reference/ocjs-package-api/types.ts new file mode 100644 index 00000000..077b1a92 --- /dev/null +++ b/docs-site/content/docs/package/reference/ocjs-package-api/types.ts @@ -0,0 +1,72 @@ +/** + * Options accepted by `init()` from `@taucad/opencascade.js`. + * + * Passed straight through to emscripten's `Module` factory. + */ +export type InitOpenCascadeOptions = { + /** + * Resolve the URL where the runtime will fetch a sibling asset (most + * importantly `opencascade_full.wasm`). Mandatory for the V3 single-file + * build — the runtime no longer auto-discovers its wasm sibling. + * + * The canonical pattern is to point at the `@taucad/opencascade.js/wasm` + * subpath export and return its URL verbatim. + * + * @example `() => wasmUrl // import wasmUrl from '@taucad/opencascade.js/wasm?url'` + */ + locateFile: (file: string) => string; + + /** + * Override the wasm binary bytes directly. Use this when you've fetched + * the wasm via a custom transport (e.g. an OPFS cache) and want to skip + * the runtime's own `fetch(locateFile(...))`. + * + * @default undefined + */ + wasmBinary?: ArrayBuffer | Uint8Array; + + /** + * Pre-allocated memory for the wasm instance. Most consumers leave this + * unset and let `ALLOW_MEMORY_GROWTH` size the heap on demand. + * + * @default undefined + */ + wasmMemory?: WebAssembly.Memory; + + /** + * Print stdout (e.g. `printf` from custom C++) to a sink. + * + * @default console.log + */ + print?: (text: string) => void; + + /** + * Print stderr (e.g. OCCT diagnostic messages) to a sink. + * + * @default console.error + */ + printErr?: (text: string) => void; +}; + +/** + * The resolved value of `init()`. Carries every bound OCCT class plus the + * emscripten runtime helpers (`FS`, `HEAP*`). + * + * The full bound-class surface is documented under `/docs/package/api`. + */ +export type Module = { + /** Emscripten in-memory filesystem (MEMFS) bridge. */ + readonly FS: { + readFile: (path: string) => Uint8Array; + writeFile: (path: string, bytes: Uint8Array | string) => void; + unlink: (path: string) => void; + mkdir: (path: string) => void; + readdir: (path: string) => string[]; + }; + + /** 8-bit signed view of wasm linear memory. */ + readonly HEAP8: Int8Array; + + /** 32-bit float view of wasm linear memory. */ + readonly HEAPF32: Float32Array; +}; diff --git a/docs-site/content/docs/toolchain/concepts/bindgen-pipeline.mdx b/docs-site/content/docs/toolchain/concepts/bindgen-pipeline.mdx new file mode 100644 index 00000000..32bf1bdb --- /dev/null +++ b/docs-site/content/docs/toolchain/concepts/bindgen-pipeline.mdx @@ -0,0 +1,126 @@ +--- +title: Bindgen pipeline +description: How libclang → embind → wasm-ld combine to produce the bound TypeScript surface. +--- + + + **Maintainer track.** Read this if you rebuild OCJS from source or extend it + with custom C++. If you `pnpm add opencascade.js` and call the published + wasm from JS, you can skip this page — the consumer-facing rules live in + [Calling OCCT from JS](./calling-occt-from-js) and + [Return shapes](./return-shapes). + + +The OCJS bindings generator is a Python orchestrator over libclang and +emscripten's embind. This page maps the stages and the artifacts they emit. + +## Stage diagram + + A2[libclang AST walk] + A2 --> A3[bindings.py / generateBindings.py] + A3 --> A4["build/bindings///

    /.hxx"] + A3 --> A5["build/bindings///

    /.d.ts.json"] + end + subgraph "Stage 2 — compile (em++)" + A4 --> B1[em++ -c per class] + B1 --> B2["build/bindings/.../.o (cached)"] + end + subgraph "Stage 3 — link (wasm-ld)" + B2 --> C1[wasm-ld + emcc glue] + C1 --> C2[dist/opencascade_full.wasm] + C1 --> C3[dist/opencascade_full.js] + A5 --> C4[dist/opencascade_full.d.ts] + end +`} /> + +## Stage 1 — bindgen + +`scripts/build-wasm.sh bindings` invokes the Python bindgen which: + +1. Walks every header listed in the active YAML via libclang. +2. Builds an AST per class, applies the `bindgen-filters.yaml` exclusions, and + classifies each member as constructor / static method / instance method / + property. +3. Resolves typedefs (including the OCCT `occ::handle<>` family) against a + shared cache. +4. Emits one `.hxx` per class with `EMSCRIPTEN_BINDINGS(...)` registrations and + one `.d.ts.json` shard per class describing the TypeScript shape. + +The bindgen is deterministic: same headers + same filter YAML = identical +output bytes. + +## Stage 2 — compile + +`em++` compiles each `.hxx` to a `.o`. The cache key is the `.hxx` content +hash plus the compile-time flag fingerprint. Cached `.o` files survive across +consumer builds — that's the speedup that makes a custom-trimmed build take +60 seconds instead of 30 minutes. + +## Stage 3 — link + +`emcc` links the selected `.o` files (per the consumer YAML's `bindings:` +list) against the pre-compiled OCCT library archives in `dist/libs/`. The +output: + +- `.wasm` — the wasm binary. +- `.js` — the emscripten loader glue. +- `.d.ts` — the merged TypeScript declarations (from `.d.ts.json` shards + filtered to the bound symbol set). +- `.build-manifest.json` — symbol coverage report (requested vs compiled, + wasm bytes, validation flags). + +## How custom C++ enters the pipeline + +`additionalCppCode` + `additionalCppFiles` get concatenated into one TU which +flows through a smaller variant of stages 1+2 — bindgen discovers Handle/NCollection +references, em++ compiles, the result links into the final wasm alongside the +auto-generated bindings. + +`additionalBindCode` skips bindgen entirely — it's a literal `.cpp` snippet +that gets compiled with `` already included. + +## When the pipeline fails + +| Symptom | Stage | Fix | +|---|---|---| +| `libclang: cannot find ` | 1 | OCCT headers not mounted into the Docker image | +| `undefined symbol: _ZN10TopoDS_...` | 3 | Remove a `bindings:` entry whose `.o` no longer exists, or the class transitively needs another class you trimmed | +| `BindingError: invalid type` at runtime | 3 | Duplicate `EMSCRIPTEN_BINDINGS()` group across `additionalBindCode` and a generated `.hxx` | +| Codegen emits `any` for a known type | 1 | The link step always prints a triage summary to stderr when this happens. The build still proceeds by default; set `OCJS_STRICT_TYPES=1` in CI to fail the build instead of shipping a poisoned `.d.ts`. File an issue with the printed triage summary. | +| Codegen emits `unknown` / surfaces an unbound reference | 1 | Same gate as above. Warning printed by default; `OCJS_STRICT_TYPES=1` escalates to a hard failure for CI consumers. | + +## What the pipeline produces — JS-side contract + +The artifacts above are an implementation detail. The contract those artifacts +expose to JS consumers — overload-dispatched calls, in-place class outputs, +`returnValue` envelopes, Handle elision — lives in two consumer-facing +concept pages: + +- [Calling OCCT from JS](./calling-occt-from-js) — overload dispatch, enums, + defaults, and the `TopoDS` downcast bridge. +- [Return shapes](./return-shapes) — class outputs, envelopes, `returnValue`, + and Handle elision. + +## Docker stage mapping + +The pipeline stages map directly to the published Docker stages described in +[Docker image](../reference/docker-image#image-stages): + +| Pipeline stage | Docker stage | Published tag | +| ---------------------- | ------------------------- | -------------------- | +| 1 — discover | `bindgen-base` | `:bindgen-base` | +| 2 — emit (TUs + .d.ts) | `bindgen-base` | `:bindgen-base` | +| 3 — compile + link | `compiled-{threading}` + `final-{threading}` | `:single-threaded`, `:multi-threaded` | + +`:bindgen-base` is both a build stage and a published image — it carries the +patched OCCT tree, the PCH, and the `.d.ts.json` index but not the +pre-compiled `.o` files. Custom-bindings consumers pull `:bindgen-base`, +re-run `generate` against their own YAML, and compile from there. + +## Related + +- [Extend with C++](../guides/extend-with-cpp) — how to inject custom C++ into the pipeline. +- [Trim symbols](../guides/trim-symbols) — controlling which classes survive into stage 3. +- [YAML schema](../reference/yaml-schema) — every YAML key the pipeline consumes. diff --git a/docs-site/content/docs/toolchain/concepts/two-channel-config-model.mdx b/docs-site/content/docs/toolchain/concepts/two-channel-config-model.mdx new file mode 100644 index 00000000..42282b5f --- /dev/null +++ b/docs-site/content/docs/toolchain/concepts/two-channel-config-model.mdx @@ -0,0 +1,107 @@ +--- +title: Two-channel config model +description: Compile-time OCJS_* env vars vs link-time emccFlags — what each channel controls and when to reach for it. +--- + + + **Maintainer track.** Skip this page if you consume the published npm + package — every shipped build already pins the right channel-1 flags. The + channels matter when you rebuild OCJS from source. + + +OpenCascade.js exposes two configuration channels with different lifecycles and +different scope. Treat them as orthogonal — confusion between the two is the +most common cause of build errors. + +## Channel 1 — compile-time `OCJS_*` env vars + +Set at the **bindgen + C++ compile** stage. Bake into every `.o` file the +final wasm is linked from. + +| Variable | Effect | +|---|---| +| `OCJS_EXCEPTIONS=1` | Compile with `-fwasm-exceptions` everywhere | +| `OCJS_SIMD=1` | Compile with `-msimd128` | +| `OCJS_RELAXED_SIMD=1` | Additionally emit `-mrelaxed-simd` (Chrome/Firefox only) | +| `OCJS_BIGINT=1` | Compile with `-sWASM_BIGINT` | +| `OCJS_EVAL_CTORS_LEVEL=2` | `-sEVAL_CTORS=2` | +| `OCJS_STRICT_TYPES=1` | Escalate missing-typedef warning to a build failure (default `0`: warn-only — the triage summary is always printed to stderr) | + +[^lto]: `OCJS_LTO` exists but is intentionally off in every shipped preset. + The workspace benchmarks showed LTO increasing the wasm size for OCJS's + object distribution, so it stays disabled. Flip it on locally only if + you're benchmarking a specific bindings trim. + +These flags pin into a **build-flags manifest** alongside each cached `.o`. +Mixing builds with mismatched flags fails-loud at link time — never silent +ABI breakage. + +## Channel 2 — link-time `emccFlags` + +Set per-consumer-build in your YAML. Apply only to the final `emcc` link step. + +```yaml +mainBuild: + emccFlags: + - -O3 + - -sMODULARIZE=1 + - -sEXPORT_ES6=1 + - -sALLOW_MEMORY_GROWTH=1 +``` + +These flags control loader shape (ESM vs CommonJS), memory limits, and +environment detection. They cannot retroactively change the exception model +or SIMD configuration the `.o` files were compiled with. + +## Why the split? + +The bindgen produces ~4,400 `.o` files in the maintainer Docker pipeline. Caching +them across consumer builds turns a 30-minute full build into a 60-second link. +The cache key must be deterministic — that's what the compile-time channel +fingerprint guards. + +If consumers could change compile-time flags via YAML, the cache invariant +would break: a downstream `-fexceptions` request would silently rebuild every +class, defeating the cache. Splitting the channels makes the contract +explicit. + +## When you actually need to change channel 1 + +Almost never as a consumer. The published build is the named +`single-threaded` preset from `build-configs/configurations.json`, which pins: + +- `OCJS_EXCEPTIONS=1` + `OCJS_EH_MODE=wasm` (native wasm exceptions) +- `OCJS_SIMD=1` (baseline SIMD, Safari-compatible) +- `OCJS_BIGINT=1` (no i64 legalisation) +- `OCJS_EVAL_CTORS=true` + `OCJS_EVAL_CTORS_LEVEL=2` +- `OCJS_CLOSURE=true` + `OCJS_CONVERGE=true` +- `THREADING=single-threaded` + +Presets are addressed by name, not by raw env vars — see +[Named compile-time configurations](../reference/configurations) for the full +list (`single-threaded`, `single-threaded-smallest`, `multi-threaded`, +`debug`). + +The combinations not yet pre-built are exotic — `OCJS_RELAXED_SIMD=1` for +Chrome-only deploys, custom allocator pairings, non-default WASM-opt budgets. +To get one, fork the Docker image build pipeline and rebuild from source. + +## Diagnostic checklist + +If a build acts strangely: + +1. Confirm channel-1 fingerprint is what you expect. The full flag set is + recorded in the in-repo build manifest (regenerated by every `bindings` + stage): + ```bash + cat build/build-flags.json + ``` + For the **published** tarball, the consumer-facing equivalent is + `dist/opencascade_full.provenance.json`, which captures the active preset, + compile flags, and commit SHA the wasm was built from. +2. Confirm channel-2 flags in the YAML actually made it into the wasm: + ```bash + strings dist/my-build.wasm | grep -E 'STACK_SIZE|MAXIMUM_MEMORY' + ``` +3. Recompare against a known-good cached build — drift here points at + channel-1 cache poisoning (rebuild the deps layer). diff --git a/docs-site/content/docs/toolchain/getting-started/quick-start-docker.mdx b/docs-site/content/docs/toolchain/getting-started/quick-start-docker.mdx new file mode 100644 index 00000000..be882002 --- /dev/null +++ b/docs-site/content/docs/toolchain/getting-started/quick-start-docker.mdx @@ -0,0 +1,162 @@ +--- +title: Quickstart — Docker +description: Pull the prebuilt GHCR image, link a custom YAML, and build a trimmed OCCT wasm in under 5 minutes. +--- + +For when you need a custom-trimmed `opencascade.wasm` without setting up emsdk, +libclang, and Python locally. + +## 1. Pull the image + + + +```bash +docker pull ghcr.io/taucad/opencascade.js:single-threaded +``` + +The `:single-threaded` tag carries pre-compiled OCCT static libraries so your +build only pays for the link step. For threaded builds (requires COOP/COEP on +consumer pages), pull `:multi-threaded` instead. For custom-bindings work +that needs the pre-PCH/generate state but not the pre-compiled libraries, see +`:bindgen-base` in [Reference → Docker image](../reference/docker-image). + +### Supported platforms + +Release tags (`:single-threaded`, `:multi-threaded`, `:bindgen-base`, +versioned variants) ship as **multi-architecture manifest lists** — +`linux/amd64` and `linux/arm64` — so Apple Silicon and ARM Linux hosts pull +the native arch automatically. No `--platform` flag required. + +Branch tags (`:branch-`, `:multi-threaded-branch-`, +`:bindgen-base-branch-`) are **`linux/amd64` only** by design — branch +publishes need to be fast for reviewers, and the per-arch image build cost +is the dominant factor. ARM hosts pulling a branch tag will run under +Rosetta / QEMU. Use a release tag whenever native performance matters. + +## 2. Write a build YAML + +Create `mybuild.yml` next to your project — list the OCCT symbols you actually +use. See [Trim symbols](../guides/trim-symbols) for a worked example and +[YAML schema](../reference/yaml-schema) for the full schema. + +```yaml title="mybuild.yml" +mainBuild: + name: my-occt + bindings: + - symbol: package + glob: 'gp' + - symbol: package + glob: 'BRepPrim*' + - symbol: package + glob: 'BRepAlgoAPI' + - symbol: package + glob: 'BRepBuilderAPI' + - symbol: package + glob: 'BRepFilletAPI' + - symbol: package + glob: 'TopoDS' + - symbol: package + glob: 'TopExp' + - symbol: package + glob: 'STEPControl' + - symbol: package + glob: 'RWGltf*' + emccFlags: + - -O3 + - -fwasm-exceptions + - -sMODULARIZE=1 + - -sEXPORT_ES6=1 + - -sEXPORT_NAME=initOpenCascade +``` + +## 3. Run the image + +```bash +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js:single-threaded \ + link mybuild.yml +``` + +`link` is the end-to-end command. Inside the container Nx's `dependsOn` +graph walks every upstream step (apply-patches → pch → generate → +compile-bindings → compile-sources → link) with cache reuse, so a fresh +container performs a full build and cached re-runs replay only the link +step. + +Output lands next to `mybuild.yml`: + +- `my-occt.wasm` — the trimmed wasm binary +- `my-occt.js` — the emscripten loader +- `my-occt.d.ts` — generated TypeScript declarations +- `my-occt.build-manifest.json` — symbol coverage and size report + +## 4. Wire the build output + +```typescript +import init from './my-occt.js'; +import wasmUrl from './my-occt.wasm?url'; + +const oc = await init({ locateFile: () => wasmUrl }); +``` + +## 5. Pin by manifest-list digest in production + +Tags can be re-pointed; digests cannot. Resolve the manifest-list digest +once and pin it in CI so every reproducer of your build pulls the exact +same multi-arch image set: + +```bash +docker buildx imagetools inspect ghcr.io/taucad/opencascade.js:single-threaded \ + --format '{{json .Manifest.Digest}}' +# → "sha256:abc123…" + +# Pin in CI / docker-compose / Dockerfile: +ghcr.io/taucad/opencascade.js@sha256:abc123… +``` + +The manifest-list digest covers both `linux/amd64` and `linux/arm64` +sub-images — pulling by digest from any arch resolves to the same +deterministic build. + +See [Reproducible CI](../guides/reproducible-ci) for the full workflow. + +## 6. Verify the supply-chain signature (optional) + +Every published image is signed with [cosign](https://github.com/sigstore/cosign) +via OIDC keyless signing — no rotating private keys, signatures published to +the Sigstore Rekor transparency log. To verify before pulling: + +```bash +cosign verify ghcr.io/taucad/opencascade.js:single-threaded \ + --certificate-identity-regexp 'https://github.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com +``` + +A successful verification confirms the image was built by the +`taucad/opencascade.js` GitHub Actions workflow and has not been tampered +with since publication. + +## Where the time goes + +Typical wall-clock for a 22-50 symbol trim on the GitHub Actions `ubuntu-latest` +runner (the e2e gate budget; M1 Pro local times are 30-50% faster): + +| Step | Warm cache | Cold cache | +| -------------------------------------- | -----------: | -----------: | +| Image pull (compressed ~1.3 GB) | 0 s | 30-60 s | +| `generate` against your YAML | 5-15 s | 5-15 s | +| `compile-bindings` (cached `.o` files) | 0 s | 1-3 min | +| `compile-sources` (cached OCCT `.a`) | 0 s | 5-10 min | +| Link against precompiled OCCT objects | 30-90 s | 30-90 s | +| **Total** | **~1-2 min** | **~3-5 min** | + +The CI e2e gate budgets a hard 5-minute warm-link ceiling and tags get +published only if both `:single-threaded` and `:multi-threaded` clear that +budget on both architectures. Cold-cache runs (first pull on a new machine) +add the image pull time; subsequent runs on the same machine reuse the +pulled image and Nx cache. + +Full surface builds (no symbol filter, i.e. `build-configs/full.yml`) take +25-40 minutes — they're for the maintainer pipeline, not consumer machines. diff --git a/docs-site/content/docs/toolchain/guides/custom-emcc-flags.mdx b/docs-site/content/docs/toolchain/guides/custom-emcc-flags.mdx new file mode 100644 index 00000000..b5537ec3 --- /dev/null +++ b/docs-site/content/docs/toolchain/guides/custom-emcc-flags.mdx @@ -0,0 +1,73 @@ +--- +title: Custom emcc flags +description: Link-time emscripten flags — SIMD, exceptions, BigInt, EVAL_CTORS, optimisation level, environment. +--- + +Once your YAML symbol list is right, the second knob is `emccFlags`. Use it to +tune optimisation level, exception model, SIMD, and target environments. + +## Recommended baseline + +```yaml +mainBuild: + emccFlags: + - -O3 + - -fwasm-exceptions # native wasm exceptions; faster than JS exceptions + - -msimd128 # baseline SIMD (Safari + everyone else) + - -sWASM_BIGINT # i64 stays as BigInt, no legalisation glue + - -sEVAL_CTORS=2 # static-init evaluation at build time + - -sMODULARIZE=1 # init() returns Promise + - -sEXPORT_ES6=1 # ESM output + - -sENVIRONMENT=web,worker,node + - -sALLOW_MEMORY_GROWTH=1 + - -sMAXIMUM_MEMORY=4GB # wasm32 ceiling +``` + +## Flag-by-flag rationale + +| Flag | Why | +|---|---| +| `-O3` | Full LLVM optimisation. `-Os` is ~5% smaller, ~10% slower at runtime. `-O0` for debugging only. | +| `-fwasm-exceptions` | Uses Wasm `try_table`. ~5–10% smaller and faster than `-fexceptions` (JS-based) when supported (every modern engine). | +| `-msimd128` | Baseline SIMD. ~15% perf win on mesh and boolean kernels. Safari-compatible. | +| `-mrelaxed-simd` | Chrome/Firefox-only additional SIMD ops. Adds another ~5% perf but breaks Safari — only ship if you can fall back. | +| `-sWASM_BIGINT` | Removes the i64↔i32-pair shim. Saves ~30 KB JS glue. | +| `-sEVAL_CTORS=2` | Runs static initialisers at build time. Smaller payload + faster startup. | +| `-sMODULARIZE=1 -sEXPORT_ES6=1` | Required for `import init from '...'`. | +| `-sENVIRONMENT=web,worker,node` | Strips dead env detection. Without this the runtime probes for `process`/`window`/`importScripts`. | +| `-sALLOW_MEMORY_GROWTH=1` | Required for any non-trivial geometry — initial 16 MB heap is not enough. | +| `-sMAXIMUM_MEMORY=4GB` | wasm32 hard ceiling (2³² bytes). | + +## Trade-offs + +### Wasm exceptions vs JS exceptions + +`-fwasm-exceptions` requires that **all** `.o` files AND the linker use the flag +consistently. Mixed builds produce `__cpp_exception` as an unresolved import at +link time. The default OCJS build sets `OCJS_EXCEPTIONS=1` everywhere; only +override if you have a very narrow constraint (e.g. a wasm engine without +`try_table` support). + +### SIMD: baseline vs relaxed + +Browsers diverged. Baseline `-msimd128` is universal. Relaxed-SIMD +(`-mrelaxed-simd`) is Chrome + Firefox at the time of writing — Safari (as of +26.x) refuses to parse the relaxed opcodes and the wasm module fails to +instantiate. Ship relaxed-SIMD only if you maintain a fallback baseline build. + +### EVAL_CTORS levels + +| Level | Behaviour | +|---|---| +| 0 | Off — every static init runs at startup | +| 1 | Eval ctors with safe side effects | +| 2 | Recommended — full ctor evaluation, requires `-O2`+ | + +`EVAL_CTORS=2` is the OCJS shipped default and the right answer almost always. + +## What you can NOT change at link time + +The wasm bitwidth (`wasm32` vs `wasm64`), the C++ stdlib version, the OCCT +commit pin, and the libclang version are all baked in during the bindgen +pipeline that produces the published Docker image. Customise via a fork of the +Docker image if you need any of those. diff --git a/docs-site/content/docs/toolchain/guides/derive-cpp-class-in-js.mdx b/docs-site/content/docs/toolchain/guides/derive-cpp-class-in-js.mdx new file mode 100644 index 00000000..4fbef73d --- /dev/null +++ b/docs-site/content/docs/toolchain/guides/derive-cpp-class-in-js.mdx @@ -0,0 +1,125 @@ +--- +title: Derive a C++ class in JavaScript +description: Override Message_ProgressIndicator virtual methods from JavaScript via allow_subclass and EMSCRIPTEN_WRAPPER. +--- + +OpenCascade reports progress and supports user-initiated cancellation through +`Message_ProgressIndicator`. Because OCCT requires a **derived class** with +overridden virtual methods, using progress callbacks in OpenCascade.js requires +a **custom WASM build** that exposes `allow_subclass<>` bindings. + +This guide consolidates the legacy three-page `progress-indicators-user-break` +series into a single V3 tutorial. + +## Overview + +1. Add a C++ bridge struct and `EMSCRIPTEN_WRAPPER` in your custom build YAML. +2. Register `allow_subclass<>` in `additionalBindCode`. +3. Derive the class in JavaScript with `.extend()` and pass `Start()` into + long-running algorithms like `BRepAlgoAPI_Fuse`. + +Three methods matter: + +| Method | Required | Purpose | +| ------------ | -------- | ---------------------------------------------------- | +| `Show` | Yes | Called on every progress update (pure virtual in OCCT) | +| `UserBreak` | Optional | Return `true` to cancel the current operation | +| `Reset` | Optional | Called when a new long-running process starts | + +## Step 1 — Custom build bindings + +Create `wrappers/progress-indicator-js.cpp`: + +```cpp title="wrappers/progress-indicator-js.cpp" +#include +#include +#include + +using namespace emscripten; + +struct Message_ProgressIndicator_JS : public Message_ProgressIndicator { + using Message_ProgressIndicator::Show; + using Message_ProgressIndicator::UserBreak; + using Message_ProgressIndicator::Reset; +}; + +struct Message_ProgressIndicator_JSWrapper : public wrapper { + EMSCRIPTEN_WRAPPER(Message_ProgressIndicator_JSWrapper); + void Show(const Message_ProgressScope& theScope, const Standard_Boolean isForce) { + val valTheScope = val::object(); + valTheScope.set("current", &theScope); + return call("Show", valTheScope, isForce); + } + Standard_Boolean UserBreak() { return call("UserBreak"); } + void Reset() { return call("Reset"); } +}; +``` + +Add to your build YAML: + +```yaml title="build-configs/with-progress-callback.yml" +additionalCppFiles: + - wrappers/progress-indicator-js.cpp +mainBuild: + bindings: + - symbol: Message_ProgressIndicator + - symbol: Message_ProgressScope + - symbol: Message_ProgressRange + - symbol: BRepAlgoAPI_Fuse + - symbol: BRepPrimAPI_MakeBox + - symbol: gp_Pnt + additionalBindCode: | + EMSCRIPTEN_BINDINGS(progress_indicator_js) { + class_>( + "Message_ProgressIndicator_JS") + .function("Show", &Message_ProgressIndicator_JS::Show, pure_virtual()) + .function("UserBreak", optional_override([](Message_ProgressIndicator_JS& self) { + return self.Message_ProgressIndicator_JS::UserBreak(); + })) + .function("Reset", optional_override([](Message_ProgressIndicator_JS& self) { + return self.Message_ProgressIndicator_JS::Reset(); + })) + .allow_subclass("Message_ProgressIndicator_JSWrapper"); + } +``` + +Build with the [Toolchain quickstart](../getting-started/quick-start-docker). + +## Step 2 — Derive in JavaScript + +```typescript title="examples/progress-indicator.ts" +import { getOc } from './ocjs-init'; + +let shouldCancel = false; + +export const runFuseWithProgress = async (): Promise => { + const oc = await getOc(); + + const MyProgress = oc.Message_ProgressIndicator_JS.extend('Message_ProgressIndicator_JS', { + Show(_scope, _isForce) { + console.log('progress', this.GetPosition()); + }, + UserBreak() { + return shouldCancel; + }, + }); + + using p = new MyProgress(); + using box1 = new oc.BRepPrimAPI_MakeBox(new oc.gp_Pnt(0, 0, 0), 2, 1, 1); + using box2 = new oc.BRepPrimAPI_MakeBox(new oc.gp_Pnt(1, 0, 0), 2, 1, 1); + using fuse = new oc.BRepAlgoAPI_Fuse(box1.Shape(), box2.Shape(), p.Start()); + fuse.Build(new oc.Message_ProgressRange()); +}; +``` + +V3 uses suffix-free `Start()` — the v2 `_1` / `_2` overload suffixes no longer +exist. Overload dispatch happens in C++ via the unified RBV pipeline. + +## Step 3 — Cancellation + +Set `shouldCancel = true` from a UI button or timeout. The next `UserBreak()` +call returns `true` and OCCT aborts the in-flight operation. + +See also: [Extend with C++](./extend-with-cpp) for the general custom-build +mechanics, and [Debugging WASM exceptions](../../package/guides/debugging-wasm-exceptions) +if the derived class throws across the wasm boundary. diff --git a/docs-site/content/docs/toolchain/guides/extend-with-cpp.mdx b/docs-site/content/docs/toolchain/guides/extend-with-cpp.mdx new file mode 100644 index 00000000..5709f112 --- /dev/null +++ b/docs-site/content/docs/toolchain/guides/extend-with-cpp.mdx @@ -0,0 +1,146 @@ +--- +title: Extend with C++ +description: Decision tree across additionalCppCode, additionalCppFiles, and additionalBindCode mechanisms. +--- + +OCCT exposes hundreds of free functions, POD structs, and helper utilities the +bindgen does not (and cannot) reach automatically. When you need one of them — +or want an ergonomic wrapper around an OCCT API — the YAML config gives you +three mechanisms: + +1. **`additionalCppCode`** — inline C++ embedded directly in the YAML scalar. +2. **`additionalCppFiles`** — one or more `.cpp` files concatenated onto `additionalCppCode`. +3. **`mainBuild.additionalBindCode`** — per-build raw `EMSCRIPTEN_BINDINGS(...)` registrations. + +## Decision tree + +```text +Are you adding new C++ implementation code (wrapper class, free function, POD)? +├── YES → Will the impl grow beyond ~100 lines or want syntax highlighting? +│ ├── YES → additionalCppFiles +│ └── NO → additionalCppCode (inline) +└── NO → You are only adding raw embind registrations on existing symbols + → mainBuild.additionalBindCode +``` + +The three compose. A typical custom binding ships a `.cpp` file +(`additionalCppFiles`) plus an `EMSCRIPTEN_BINDINGS(...)` block +(`additionalBindCode`) that registers what the `.cpp` defined. + +## Mechanism 1 — `additionalCppCode` (inline) + +For short snippets that belong with the YAML for context — handle typedefs, a +single free function, a small POD. + +```yaml +additionalCppCode: | + #include + Standard_Real addReals(Standard_Real a, Standard_Real b) { return a + b; } + +mainBuild: + name: my_build + additionalBindCode: | + EMSCRIPTEN_BINDINGS(my_build_extras) { + emscripten::function("addReals", &addReals); + } +``` + +Now `oc.addReals(1.5, 2.25)` returns `3.75`. + +## Mechanism 2 — `additionalCppFiles` (multi-file) + +When the wrapper grows past ~100 lines or you want real `.cpp` files for editor +support and review, move it to `additionalCppFiles`. The files are concatenated +onto `additionalCppCode` (in that order) into one translation unit before custom-binding +generation runs. + +```yaml +additionalCppFiles: + - wrappers/fair-curve.cpp + +mainBuild: + additionalBindCode: | + EMSCRIPTEN_BINDINGS(my_build_faircurve) { + emscripten::function("computeFairCurve", &computeFairCurve); + } +``` + +Paths in `additionalCppFiles` are resolved relative to the YAML file's +directory. A missing file fails-loud at validate time. + +## Mechanism 3 — `additionalBindCode` (raw embind) + +Use this when bindgen cannot emit the registration you need. Common cases: + +- Binding a free function (bindgen registers classes, not free functions). +- Defining a `value_object` POD authored in `additionalCppCode` / `additionalCppFiles`. +- Registering an `emscripten::vector` / `emscripten::map` an NCollection + auto-discovery pass does not cover. + +```yaml +additionalCppCode: | + struct PointXY { double X; double Y; }; + +mainBuild: + additionalBindCode: | + EMSCRIPTEN_BINDINGS(my_build_pointxy) { + emscripten::value_object("PointXY") + .field("X", &PointXY::X) + .field("Y", &PointXY::Y); + } +``` + +Every `EMSCRIPTEN_BINDINGS()` group **must use a unique name** across the +block and any auto-generated binding TUs — embind enforces uniqueness at module +load time. + +## Worked example — wrapper class with constructor + methods + +```cpp title="wrappers/shape-cast.cpp" +#include +#include +#include +#include + +class ShapeCast { +public: + static TopoDS_Edge toEdge(const TopoDS_Shape& s) { return TopoDS::Edge(s); } + static TopoDS_Face toFace(const TopoDS_Shape& s) { return TopoDS::Face(s); } +}; +``` + +```yaml title="build-configs/my-config.yml" +additionalCppFiles: + - wrappers/shape-cast.cpp + +mainBuild: + bindings: + - symbol: TopoDS_Shape + - symbol: TopoDS_Edge + - symbol: TopoDS_Face + additionalBindCode: | + EMSCRIPTEN_BINDINGS(my_build_shape_cast) { + emscripten::class_("ShapeCast") + .class_function("toEdge", &ShapeCast::toEdge) + .class_function("toFace", &ShapeCast::toFace); + } +``` + +JS: + +```typescript +const edge = oc.ShapeCast.toEdge(genericShape); +``` + +## Pitfalls + +- **Duplicate `EMSCRIPTEN_BINDINGS` group names** crash the module at load time. +- **Forgetting to bind the underlying OCCT class** in `bindings:` causes the + wrapper to compile but the runtime cast to throw. +- **Using `Handle` without the typedef** works in C++ but produces no useful + JS shape. Add `typedef opencascade::handle Handle_T;`. + +## Related + +- [YAML schema](../reference/yaml-schema) — schema for every YAML key. +- [Emscripten embind reference](https://emscripten.org/docs/porting/connecting_cpp_and_javascript/embind.html). diff --git a/docs-site/content/docs/toolchain/guides/multi-threading.mdx b/docs-site/content/docs/toolchain/guides/multi-threading.mdx new file mode 100644 index 00000000..685115c1 --- /dev/null +++ b/docs-site/content/docs/toolchain/guides/multi-threading.mdx @@ -0,0 +1,128 @@ +--- +title: Custom multi-threaded build +description: Build a pthread-enabled OCJS WASM with a trimmed symbol list or custom Emscripten flags. +--- + +The npm package already ships a pre-built multi-threaded variant at `@taucad/opencascade.js/multi` — see [Package — Multi-threaded build](/docs/package/guides/multi-threading) for the import recipe, COOP/COEP headers, and OCCT activation calls. Rebuild from source only when you need: + +- A trimmed symbol list (the shipped MT binary builds from `build-configs/full_multi.yml` with the same ~4,400 symbols as the ST binary). +- Custom `emccFlags` (alternative `STACK_SIZE`, `INITIAL_MEMORY`, capped `PTHREAD_POOL_SIZE`). +- A relaxed-SIMD sibling for non-Safari deployments (see the callout below). + +## Build YAML + +```yaml title="build-configs/threaded.yml" +mainBuild: + name: occt_threaded + bindings: + # ... your symbol list ... + emccFlags: + - -O3 + - -fwasm-exceptions + - -msimd128 + - -pthread + - -sUSE_PTHREADS=1 + # Pre-spawn one worker per logical CPU on the host. The expression is + # evaluated by the generated JS glue at module-instantiation time, so a + # single binary adapts to whatever hardware loads it. + - -sPTHREAD_POOL_SIZE=navigator.hardwareConcurrency + - -sSHARED_MEMORY=1 + - -sMODULARIZE=1 + - -sEXPORT_ES6=1 + - -sENVIRONMENT=web,worker,node + - -sALLOW_MEMORY_GROWTH=1 + - -sMAXIMUM_MEMORY=4GB +``` + +Build with: + +```bash +./build-wasm.sh --config multi-threaded full build-configs/threaded.yml +``` + +`PTHREAD_POOL_SIZE=navigator.hardwareConcurrency` evaluates per-host: an M2 +Pro browser gets 12 workers, a mobile device gets 4–6, a Node server gets +whatever `os.cpus().length` reports. Each worker costs `STACK_SIZE` (default +8 MB) at module init, so a 12-core box reserves ~96 MB of stack on top of +`INITIAL_MEMORY`. If you need a hard cap, wrap the expression: +`Math.min(navigator.hardwareConcurrency, 16)`. + +> ### Why not a small fixed pool size? +> +> A round-number pool like `-sPTHREAD_POOL_SIZE=4` is tempting but +> silently caps your speedup. On a 12-core machine OCCT's +> `OSD_ThreadPool` requests 11 workers (`NbLogicalProcessors-1`); with a +> pool of 4 the parallel sections degrade to 4-way fan-out and the +> headline speedup stalls around 1.3×. Sizing the pool to +> `navigator.hardwareConcurrency` recovers the full 2.0–2.5× on +> mesh-dominated workloads, and shrinks gracefully on lower-core devices +> without a separate build. + +> ### Relaxed-SIMD — advanced, non-default +> +> Do **not** add `-mrelaxed-simd` to the binary you ship to +> browsers. Safari / WebKit (all versions as of May 2026) crash the JIT +> when a relaxed-SIMD opcode actually executes — validation passes but +> execution does not. If you want the 5–15 % uplift on Chromium / +> Firefox / Node, build a sibling `occt_threaded_rsimd.wasm` with +> `-mrelaxed-simd` and `wasm-opt --enable-relaxed-simd`, then UA-sniff in +> your loader to serve the plain binary to WebKit and the relaxed +> binary to everyone else. + +> ### `EVAL_CTORS=2` is dropped under threading +> +> `full.yml` enables `-sEVAL_CTORS=2` for the single-threaded build, but +> `full_multi.yml` drops it — constructor evaluation order is +> non-deterministic under pthread workers. The trade-off is a slightly +> larger binary in exchange for race-free startup. +> +> **Companion observation:** the `wasm-opt` post-link pass reports only +> ~0.1% size reduction on MT builds vs the 4-7% it achieves on ST. That +> is **not** a regression — `wasm-opt` would normally fold static +> ctor calls during the same pass `EVAL_CTORS=2` enables; with that +> flag dropped, the constructors stay live and wasm-opt has less to +> eliminate. No action required. + +## Browser-only MT build + +If you can guarantee your consumers run a recent browser (Chrome / Edge ≥ 144, Firefox ≥ 145, Safari ≥ 26.2 — May 2026 baseline) and you do **not** need to load the binary under Node.js, Bun, or Deno, you can opt into the `multi-threaded-browser` preset for a measurable runtime win on memory-growth-heavy workloads. + +The preset layers `-sGROWABLE_ARRAYBUFFERS=1` and `-sENVIRONMENT=web,worker` on top of the standard `multi-threaded` flag set. Internally Emscripten emits JS glue that wraps the pthread `SharedArrayBuffer` in a [resizable `ArrayBuffer` view](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/SharedArrayBuffer/grow) via `WebAssembly.Memory.prototype.toResizableBuffer()`. With that view in place, consumers can hoist `HEAP*` references out of hot loops — they no longer go stale after a memory-growth event, so the `-Wpthreads-mem-growth` link-time advisory disappears entirely and per-call HEAP re-fetches drop out of the inner loop. + +Build with: + +```bash +./build-wasm.sh --config multi-threaded-browser full build-configs/full_multi_browser.yml +``` + +The shipped recipe lives at [`build-configs/full_multi_browser.yml`](https://github.com/taucad/opencascade.js/blob/main/build-configs/full_multi_browser.yml); diff it against [`full_multi.yml`](https://github.com/taucad/opencascade.js/blob/main/build-configs/full_multi.yml) to see the exact two-flag delta. + +> ### Runtime support matrix — `toResizableBuffer()` (May 2026) +> +> **Supported** — ship `full_multi_browser` artefacts to: +> +> - Chrome / Edge ≥ 144 +> - Firefox ≥ 145 +> - Safari ≥ 26.2 (desktop + iOS) +> +> **NOT supported** — fall back to plain `full_multi` for: +> +> - Node.js (all current LTS) — throws `TypeError: wasmMemory.toResizableBuffer is not a function` on module init. +> - Bun and Deno (all current versions). +> - Samsung Internet and other Chromium derivatives that lag mainline. +> +> Because Node.js is the dominant test-harness runtime, the **default** +> shipped multi-threaded build keeps `-sGROWABLE_ARRAYBUFFERS=0` so it +> stays loadable under `vitest`, `jest`, and other Node-based test runners. +> Opt into the browser variant only for production payloads you serve +> directly to browser clients. + +## After building + +Wire the resulting `.js` / `.wasm` triple into your bundler the same way as the shipped variant — see [Package — Multi-threaded build](/docs/package/guides/multi-threading) for activation calls, parallel-aware OCCT APIs, and benchmarks. + +## Related + +- [Configurations reference](../reference/configurations) — `multi-threaded` preset and how to author a custom one. +- [Custom emcc flags](./custom-emcc-flags) — link-time `emccFlags` rationale. +- [Trim symbols](./trim-symbols) — shrink the symbol set before building. diff --git a/docs-site/content/docs/toolchain/guides/reproducible-ci.mdx b/docs-site/content/docs/toolchain/guides/reproducible-ci.mdx new file mode 100644 index 00000000..ba9c530a --- /dev/null +++ b/docs-site/content/docs/toolchain/guides/reproducible-ci.mdx @@ -0,0 +1,141 @@ +--- +title: Reproducible CI +description: Pin GHCR images by digest, capture provenance and SBOM, lock downstream consumer pins. +--- + +A reproducible OCJS build means: same inputs, same wasm bytes, every time. +Three controls close the loop. + +## 1. Pin the image by manifest-list digest + +`:single-threaded`, `:multi-threaded`, and `:bindgen-base` are moving tags +that roll forward with every release. CI should pin by digest so a new +publish doesn't silently change your wasm output. Pinning the manifest-list +digest (not the per-arch image digest) covers both `linux/amd64` and +`linux/arm64` sub-images in a single deterministic pin. + +```bash +# Resolve the manifest-list digest once +docker buildx imagetools inspect ghcr.io/taucad/opencascade.js:single-threaded \ + --format '{{json .Manifest.Digest}}' +# → "sha256:abc123…" + +# Use the digest in CI (resolves to the matching native arch transparently) +docker pull ghcr.io/taucad/opencascade.js@sha256:abc123... +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js@sha256:abc123... \ + link mybuild.yml +``` + +## 2. Verify the cosign signature + +Every published image is signed via cosign keyless signing (OIDC) of the +manifest-list digest — one signature verifies regardless of which arch +the consumer pulls. + +```bash +cosign verify ghcr.io/taucad/opencascade.js@sha256:abc123... \ + --certificate-identity-regexp 'https://github.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com +``` + +A successful verification confirms the image was built by the +`taucad/opencascade.js` GitHub Actions `docker.yml` workflow and has not +been tampered with since publication. CI failing this step on a sudden +mismatch is a smoking gun that something tampered with the supply chain. + +## 2b. Verify SLSA provenance attestation + +In addition to the cosign signature, the image ships a SLSA provenance +attestation: + +```bash +cosign verify-attestation \ + --type slsaprovenance \ + --certificate-identity-regexp 'https://github\.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com \ + ghcr.io/taucad/opencascade.js@sha256:abc123... +``` + +The attestation records the source commit, the runner, and the workflow +that produced the image. + +## 3. Extract SBOM + +```bash +docker buildx imagetools inspect \ + --format '{{ json .SBOM }}' \ + ghcr.io/taucad/opencascade.js@sha256:abc123... +``` + +The SBOM lists every apt package and pinned commit (OCCT, freetype, rapidjson) +embedded in the image. Diff it against the prior digest's SBOM in CI to flag +unexpected dep bumps. + +## 4. Lock downstream consumers + +In your `package.json`, pin the npm tarball alongside the docker digest: + +```json +{ + "dependencies": { + "@taucad/opencascade.js": "3.0.0-beta.5" + }, + "pnpm": { + "supportedArchitectures": { + "os": ["linux", "darwin"], + "cpu": ["x64", "arm64"] + } + } +} +``` + +Commit `pnpm-lock.yaml`. The lockfile records the integrity hash of the +published tarball; if it ever changes, `pnpm install --frozen-lockfile` fails +in CI. + +## End-to-end CI snippet + +```yaml title=".github/workflows/wasm-build.yml" +jobs: + build-wasm: + runs-on: ubuntu-24.04 + steps: + - uses: actions/checkout@v4 + + - name: Verify cosign signature + run: | + DIGEST=$(cat .ocjs-digest) + cosign verify "ghcr.io/taucad/opencascade.js@${DIGEST}" \ + --certificate-identity-regexp 'https://github.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com + + - name: Verify image provenance + run: | + DIGEST=$(cat .ocjs-digest) + cosign verify-attestation --type slsaprovenance \ + --certificate-identity-regexp 'https://github\.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com \ + "ghcr.io/taucad/opencascade.js@${DIGEST}" + + - name: Build wasm + run: | + DIGEST=$(cat .ocjs-digest) + docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + "ghcr.io/taucad/opencascade.js@${DIGEST}" \ + link build-configs/my-config.yml + + - name: Assert wasm hash + run: | + EXPECTED=$(cat .wasm-hash) + ACTUAL=$(sha256sum my-config.wasm | cut -d' ' -f1) + [ "$EXPECTED" = "$ACTUAL" ] || { echo "wasm hash drift"; exit 1; } +``` + +The trailing `assert wasm hash` step is the safety net. If `EXPECTED` and +`ACTUAL` ever diverge, something in the published image changed — either +intentionally (bump your `.wasm-hash`) or by accident (investigate). diff --git a/docs-site/content/docs/toolchain/guides/trim-symbols.mdx b/docs-site/content/docs/toolchain/guides/trim-symbols.mdx new file mode 100644 index 00000000..d57671f2 --- /dev/null +++ b/docs-site/content/docs/toolchain/guides/trim-symbols.mdx @@ -0,0 +1,220 @@ +--- +title: Trim symbols +description: Drive the published Docker image to cut full.yml down to a consumer-sized symbol set — workflow, budget, and worked example. +--- + +`opencascade_full.wasm` binds ~4,400 OCCT classes and weighs roughly 27 MB. +Most consumers need a fraction of that surface — a STEP round-tripper might +touch ~120 classes, a glTF mesher even fewer. Trimming the YAML symbol list +shrinks the wasm payload and reduces startup time. + +This guide drives the entire workflow through the published Docker image so +you do not need `emsdk`, `libclang`, or Python installed locally. The image +ships with `emsdk`, `libclang`, Python, the precompiled OCCT object cache, +and the reference `full.yml` already in place. + +## Prerequisites + +- Docker (or any OCI runtime — Colima, Rancher Desktop, OrbStack all work). +- A working directory under your home folder (`/Users/...` on macOS, + `C:\Users\...` on Windows). Other top-level folders like `/tmp` and + `/opt` are not shared into the Docker VM by default and will silently + drop build outputs. +- Familiarity with the YAML schema. See [YAML schema](../reference/yaml-schema) + for the full reference. + +If you have not used the image before, run the +[Quickstart — Docker](../getting-started/quick-start-docker) once to verify +your setup before trimming. + +## Size budget + +Each bound class contributes roughly 15–25 KB to the linked wasm. A +reasonable target by use case: + +| Use case | Symbols | Approximate wasm size | +| ---------------------------------------------- | ------------------: | --------------------: | +| Single-format viewer (read STEP → mesh) | 80–150 | 2–4 MB | +| Round-trip pipeline (STEP/IGES edit + write) | 200–400 | 5–10 MB | +| Full code-CAD tool (booleans + fillets + sweep) | 600–1,200 | 12–20 MB | +| Reference / kitchen sink | 4,400 (`full.yml`) | ~27 MB | + +Numbers are after `-O3 -msimd128 -sWASM_BIGINT -sEVAL_CTORS=2`. + +## Steps + +### 1. Extract the reference `full.yml` + +The image ships the reference `full.yml` at +`/opencascade.js/build-configs/full.yml`. Pull it out with an entrypoint +override so you can use it as your starting point: + +```bash +docker run --rm --entrypoint cat \ + ghcr.io/taucad/opencascade.js:single-threaded \ + /opencascade.js/build-configs/full.yml \ + > my-config.yml +``` + +If you already know exactly which classes you need you can also hand-write +`my-config.yml` from scratch — see the worked example below. + +### 2. Delete the classes you don't need + +Open `my-config.yml` and remove any `bindings` entry you don't call from +JavaScript. There is no transitive closure to compute — Handle typedefs +and `NCollection_*` members for the surviving classes are auto-discovered +at codegen time, so you only list classes you instantiate or pass +references to. + +### 3. Validate + +```bash +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js:single-threaded \ + validate /src/my-config.yml +``` + +`validate` parses the YAML against the schema and fails non-zero on any +malformed entry, unknown key, or duplicated symbol. It does not run the +C++ pipeline, so it returns in under a second. + +### 4. Link + +```bash +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js:single-threaded \ + link my-config.yml +``` + +`link` reuses the precompiled `.o` files baked into the image for every +still-bound class, so a trim that strips half of `full.yml` typically +completes in 60–180 seconds. + +Output lands next to `my-config.yml` (per `OCJS_OUTPUT_DIR=/src` default): + +- `.wasm` — the trimmed wasm binary +- `.js` — the emscripten loader +- `.d.ts` — generated TypeScript declarations +- `.build-manifest.json` — symbol coverage and size report + +If you removed a class another bound class transitively needs, the link +step fails with `undefined symbol`. Add it back and re-run. + +### 5. Iterate with a persistent cache + +Repeated trims benefit from caching the Nx graph between runs. Create a +named volume once, then mount it on every subsequent invocation: + +```bash +docker volume create ocjs-nx-cache + +docker run --rm \ + -v ocjs-nx-cache:/opencascade.js/.nx \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js:single-threaded \ + link my-config.yml +``` + +Cache hits drop subsequent link times to ~10–30 seconds when only the +YAML changed and the touched classes were already compiled. + +## Worked example: STEP round-tripper + +```yaml title="my-config.yml" +mainBuild: + name: step_roundtrip + bindings: + - symbol: Standard_Failure + - symbol: Message_ProgressRange + - symbol: TCollection_AsciiString + - symbol: TCollection_ExtendedString + - symbol: TopoDS + - symbol: TopoDS_Shape + - symbol: TopoDS_Compound + - symbol: TopoDS_Solid + - symbol: TopoDS_Shell + - symbol: TopoDS_Face + - symbol: TopoDS_Wire + - symbol: TopoDS_Edge + - symbol: TopoDS_Vertex + - symbol: TopExp + - symbol: TopExp_Explorer + - symbol: gp_Pnt + - symbol: gp_Dir + - symbol: gp_Vec + - symbol: gp_Ax2 + - symbol: STEPControl_Reader + - symbol: STEPControl_Writer + - symbol: STEPControl_StepModelType + - symbol: IFSelect_ReturnStatus + - symbol: Interface_Static + emccFlags: + - -O3 + - -msimd128 + - -sWASM_BIGINT + - -sEVAL_CTORS=2 + - -sMODULARIZE=1 + - -sEXPORT_ES6=1 + - -sENVIRONMENT=web,worker,node + - -sALLOW_MEMORY_GROWTH=1 +``` + +Link it with the step-4 invocation above. On a warm cache, expect a +1.5–3 MB binary in `./output/step_roundtrip.wasm`. + +## Variations + +### Pin the image by digest + +The `:single-threaded` tag is mutable — a new release rolls forward at any +time. For reproducible CI, replace the tag with an immutable manifest-list +digest: + +```bash +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js@sha256: \ + link my-config.yml +``` + +See [Reproducible CI](./reproducible-ci) for the full pinning recipe. + +### Drop into the image for interactive exploration + +To browse `build-configs/*.yml` presets, the OCCT source tree, or the +toolchain layout, override the entrypoint: + +```bash +docker run --rm -it \ + -v "$(pwd):/src" \ + --entrypoint bash \ + ghcr.io/taucad/opencascade.js:single-threaded +``` + +The image's working directory is `/opencascade.js/`. `build-configs/`, +`deps/OCCT/`, and the precompiled object cache under `dist/libs/` all +live there. + +### When trimming feeds back into your design + +A trimmed binary makes your application's OCCT dependency graph explicit. +Adding a class to recover from a link error is a signal: either the class +is genuinely part of your call graph, or your code reaches into an OCCT +subsystem it doesn't need. The second case is worth investigating. + +## Related + +- [Quickstart — Docker](../getting-started/quick-start-docker) — end-to-end first build. +- [Docker image](../reference/docker-image) — tags, mounts, OCI labels, provenance. +- [YAML schema](../reference/yaml-schema) — every YAML key and its semantics. +- [Custom emcc flags](./custom-emcc-flags) — tuning link-time flags. +- [Reproducible CI](./reproducible-ci) — pinning by digest for repeatable builds. +- [Bindgen pipeline](../concepts/bindgen-pipeline) — why the trim works without + computing a transitive closure. diff --git a/docs-site/content/docs/toolchain/index.mdx b/docs-site/content/docs/toolchain/index.mdx new file mode 100644 index 00000000..afeb51a1 --- /dev/null +++ b/docs-site/content/docs/toolchain/index.mdx @@ -0,0 +1,28 @@ +--- +title: Toolchain +description: Build a custom WASM via Docker — trim symbols, extend with C++, ship reproducible CI. +--- + +Pull the multi-arch GHCR image, link a custom YAML, trim symbols to the surface you need, extend +with your own C++ via `additionalCppCode`, and ship reproducible CI builds with provenance and SBOM. + + + + Pull a GHCR image, link a custom YAML, build a trimmed wasm in 2 minutes. + + + Reduce wasm size by binding only the OCCT classes your app uses. + + + Add custom C++ via additionalCppCode, additionalCppFiles, and additionalBindCode. + + + Reference for the custom build YAML schema. + + + +## Two channels of configuration + +Compile-time `OCJS_*` environment variables and link-time `emccFlags` in your build YAML control +different aspects of the output. See [Two-channel config model](/docs/toolchain/concepts/two-channel-config-model) +for the full picture. diff --git a/docs-site/content/docs/toolchain/meta.json b/docs-site/content/docs/toolchain/meta.json new file mode 100644 index 00000000..c831608b --- /dev/null +++ b/docs-site/content/docs/toolchain/meta.json @@ -0,0 +1,27 @@ +{ + "title": "Toolchain", + "description": "Build a custom WASM via Docker — trim symbols, extend with C++, ship reproducible CI.", + "icon": "lib:webassembly", + "root": true, + "pages": [ + "index", + "---Getting Started---", + "getting-started/quick-start-docker", + "---Guides---", + "guides/custom-emcc-flags", + "guides/extend-with-cpp", + "guides/trim-symbols", + "guides/multi-threading", + "guides/derive-cpp-class-in-js", + "guides/reproducible-ci", + "---Concepts---", + "concepts/bindgen-pipeline", + "concepts/two-channel-config-model", + "---Reference---", + "reference/yaml-schema", + "reference/configurations", + "reference/docker-image", + "reference/env-vars", + "reference/cli-build-wasm" + ] +} diff --git a/docs-site/content/docs/toolchain/reference/cli-build-wasm.mdx b/docs-site/content/docs/toolchain/reference/cli-build-wasm.mdx new file mode 100644 index 00000000..d4ca4437 --- /dev/null +++ b/docs-site/content/docs/toolchain/reference/cli-build-wasm.mdx @@ -0,0 +1,102 @@ +--- +title: build-wasm.sh CLI +description: Every subcommand of build-wasm.sh — validate, bindings, link, pch, clean, plus exit codes and tips. +--- + +`build-wasm.sh` is the orchestration entry point for the OCJS build pipeline. +Each subcommand maps to a stage of the bindgen → compile → link sequence. + +## Synopsis + +```bash +./build-wasm.sh [options] [] +``` + +## Subcommands + +### `validate` + +```bash +./build-wasm.sh validate build-configs/my-config.yml +``` + +Parses the YAML against `src/customBuildSchema.py` and fails non-zero on any +malformed entry, unknown key, duplicated symbol, or missing +`additionalCppFiles` path. Does **not** run the C++ pipeline. + +### `bindings` + +```bash +./build-wasm.sh bindings +``` + +Runs the libclang-driven bindgen against the OCCT headers, emitting one +`.hxx` per class under `build/bindings////` plus +sidecar `.d.ts.json` shards. + +Cache: re-uses prior output when header contents and bindgen-filter +fingerprint match. Force regeneration with `--force`. + +### `pch` + +```bash +./build-wasm.sh pch +``` + +Builds the precompiled header used by every bindings TU. Always passes +`-Xclang -fno-pch-timestamp` so Nx/Docker cache restores don't invalidate the +PCH on disk-mtime drift. + +### `link` + +```bash +./build-wasm.sh link build-configs/my-config.yml +``` + +Compiles every `.hxx` referenced by the YAML's `bindings:` list (cached `.o` +files reused), links them against the precompiled OCCT objects under +`dist/libs/`, and emits the final wasm + JS + `.d.ts` + manifest sibling to +the YAML. + +### `clean` + +```bash +./build-wasm.sh clean # rm build/, cache/, dist/ +./build-wasm.sh clean --cache # rm cache/ only +./build-wasm.sh clean --dist # rm dist/ only +``` + +## Exit codes + +| Code | Meaning | +|---|---| +| 0 | Success | +| 1 | YAML validation failure | +| 2 | bindgen failure (libclang error) | +| 3 | Compile failure | +| 4 | Link failure (undefined symbol or unresolved reference) | +| 5 | Missing input file | +| 64 | Invalid usage (unknown subcommand or flag) | + +## Common flags + +| Flag | Effect | +|---|---| +| `--config ` | Override `OCJS_CONFIG` for this run — selects a named preset from `build-configs/configurations.json`. | +| `--force` | Bypass cache; rebuild from scratch | +| `--verbose` | Equivalent to `OCJS_VERBOSE=1` | +| `--jobs N` | Set `OCJS_PARALLEL_JOBS=N` | + +## Typical CI invocation + +```bash +./build-wasm.sh validate build-configs/my-config.yml +./build-wasm.sh link --jobs 8 build-configs/my-config.yml +sha256sum dist/my-config.wasm +``` + +## Related + +- [Bindgen pipeline](../concepts/bindgen-pipeline) — stage diagram and artifact layout. +- [Environment variables](./env-vars) — env var catalogue. +- [YAML schema](./yaml-schema) — the YAML the CLI consumes. diff --git a/docs-site/content/docs/toolchain/reference/configurations.mdx b/docs-site/content/docs/toolchain/reference/configurations.mdx new file mode 100644 index 00000000..4e393d0c --- /dev/null +++ b/docs-site/content/docs/toolchain/reference/configurations.mdx @@ -0,0 +1,81 @@ +--- +title: Named compile-time configurations +description: build-configs/configurations.json — every preset, the flags it sets, and when to pick it. +--- + +Compile-time presets live in [`build-configs/configurations.json`](https://github.com/taucad/opencascade.js/blob/main/build-configs/configurations.json). Each entry is a flat map of `OCJS_*` environment-variable names to values; the build CLI loads the entry and exports each key before driving `emcc` and `wasm-opt`. + +All shipped presets ship with the same _feature_ set — native WASM exceptions (`OCJS_EXCEPTIONS=1`, `OCJS_EH_MODE=wasm`), `EVAL_CTORS=2`, and the Closure Compiler on. They differ on optimisation level, threading mode, and the wasm-opt budget. + +## Shipped presets + +| Preset | Use case | Differentiating flags | +| -------------------------- | ----------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------ | +| `single-threaded` | Default `@taucad/opencascade.js` build (`opencascade_full.*`). Browser default. | `OCJS_OPT=-O3`, `OCJS_WASM_OPT_LEVEL=-O4`, `THREADING=single-threaded` | +| `single-threaded-smallest` | Size-tuned variant — smaller binary at a ~5–10% runtime cost. | `OCJS_OPT=-Os`, `OCJS_WASM_OPT_LEVEL=-O3`, `THREADING=single-threaded` | +| `multi-threaded` | Published `@taucad/opencascade.js/multi` build. SAB/COOP+COEP-isolated deployments. | `OCJS_OPT=-O3`, `OCJS_WASM_OPT_LEVEL=-O4`, `THREADING=multi-threaded` | +| `debug` | Fastest build for local iteration. Not for production — no SIMD, no converge, no BigInt. | `OCJS_OPT=-O0`, `OCJS_WASM_OPT_LEVEL=-O0`, `OCJS_SIMD=0`, `OCJS_CONVERGE=false` | + +For the full `OCJS_*` matrix that each preset sets — including the flags they share — see [BUILD_SYSTEM.md](https://github.com/taucad/opencascade.js/blob/main/BUILD_SYSTEM.md#configurationsjson). + +## Selecting a preset + +`build-wasm.sh` reads the `OCJS_CONFIG` env var or the `--config ` CLI flag (the CLI flag wins if both are set). When neither is set, the script falls back to `single-threaded`: + +```bash +OCJS_CONFIG=debug ./build-wasm.sh link build-configs/my-config.yml +``` + +Or via the CLI flag: + +```bash +./build-wasm.sh --config debug link build-configs/my-config.yml +``` + +## Adding a custom preset + +Append a new entry to `build-configs/configurations.json`. The shape is a flat `OCJS_*` env-var map — same keys the shipped presets use: + +```json +{ + "single-threaded-no-simd": { + "OCJS_OPT": "-Os", + "OCJS_LTO": "0", + "OCJS_EXCEPTIONS": "1", + "OCJS_EH_MODE": "wasm", + "OCJS_SIMD": "0", + "THREADING": "single-threaded", + "OCJS_DEFINES": "OCCT_NO_DUMP", + "OCJS_UNDEFINES": "OCC_CONVERT_SIGNALS", + "OCJS_WASM_OPT_LEVEL": "-O3", + "OCJS_CLOSURE": "true", + "OCJS_EVAL_CTORS": "true", + "OCJS_EVAL_CTORS_LEVEL": "2", + "OCJS_CONVERGE": "true", + "OCJS_BIGINT": "1", + "OCJS_MALLOC": "mimalloc", + "BINARYEN_EXTRA_PASSES": "" + } +} +``` + +Custom presets share the same compile-`.o` cache as shipped ones — the cache is keyed by the compile-flag fingerprint, not by the preset name. Two presets with identical compile-time flags share cache entries automatically. + +## Cache invalidation + +Changing any compile flag invalidates the cached `.o` files that depended on it. The build manifest records the active fingerprint: + +```bash +cat build/build-flags.json +``` + +The published npm tarball ships `dist/opencascade_full.provenance.json` and +`dist/opencascade_full_multi.provenance.json` — same preset / flag information +for each variant, with the commit SHA the wasm was built from. CI scripts should +diff these files across builds to detect surprise cache turnover. + +## Related + +- [Two-channel config model](../concepts/two-channel-config-model) — why compile-time and link-time config are separate channels. +- [Custom emcc flags](../guides/custom-emcc-flags) — link-time `emccFlags` rationale. +- [Environment variables](./env-vars) — every `OCJS_*` env var. diff --git a/docs-site/content/docs/toolchain/reference/docker-image.mdx b/docs-site/content/docs/toolchain/reference/docker-image.mdx new file mode 100644 index 00000000..1bcdbaa3 --- /dev/null +++ b/docs-site/content/docs/toolchain/reference/docker-image.mdx @@ -0,0 +1,154 @@ +--- +title: Docker image +description: GHCR image tags, multi-arch matrix, OCI labels, cosign signatures, provenance, and SBOM. +--- + +The maintainer-distributed Docker image lets consumers run custom-trimmed +wasm builds without setting up emsdk, libclang, and Python locally. + +## Pulling + + + +```bash +docker pull ghcr.io/taucad/opencascade.js:single-threaded +``` + +## Tags + +| Tag | Points to | +| ---------------------------------------------------------------- | ------------------------------------------------------------------------------------ | +| `:single-threaded` | Latest release, single-threaded warm cache (default for browser CAD UIs) | +| `:multi-threaded` | Latest release, multi-threaded warm cache (requires COOP/COEP on consumer pages) | +| `:bindgen-base` | Latest release, post-PCH/generate but pre-compile (custom-bindings starting point) | +| `:{{version}}-single-threaded`
    `:{{version}}-multi-threaded` | Pinned release (e.g. `:3.0.0-single-threaded`); manifest list of `linux/amd64+arm64` | +| `:{{version}}-bindgen-base` | Pinned release, bindgen-base | +| `:branch-` / `:branch--` | Branch tip, single-threaded, **`linux/amd64`-only**, 7-day GHCR retention | +| `:multi-threaded-branch-` / `…-` | Branch tip, multi-threaded, amd64-only, 7-day retention | +| `:bindgen-base-branch-` / `…-` | Branch tip, bindgen-base, amd64-only, 7-day retention | +| `@sha256:` | Immutable pin — use in CI | + +**Pin by digest in production.** The bare-name tags (`:single-threaded`, +`:multi-threaded`, `:bindgen-base`) are mutable and roll forward with every +release. See [Reproducible CI](../guides/reproducible-ci) for the pinning +workflow. + +The legacy `:beta`, `:rolling`, and `:latest` tags are **not published** by +this fork. Use a version-pinned tag (e.g. `:3.0.0-single-threaded`) or the +manifest-list digest for explicit version control. + +## Entrypoint + +```bash +docker run --rm \ + -v "$(pwd):/src" \ + -u "$(id -u):$(id -g)" \ + ghcr.io/taucad/opencascade.js:single-threaded \ + link mybuild.yml +``` + +The entrypoint dispatches subcommands through `npx nx run ocjs:` so +runs benefit from Nx's content-addressed cache: + +| Subcommand | What it does | +| ----------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| `link ` | End-to-end build. Nx walks `apply-patches → pch → generate → compile-bindings → compile-sources → link` with cache reuse — fresh container = full build, cached re-run = link only. | +| `compile-bindings`, `compile-sources`, `pch`, … | Run an individual Nx target | +| `validate ` | Validate YAML without building | +| `nx ` | Pass-through to `npx nx` (escape hatch) | + +Outputs land in `/src` next to your YAML (`OCJS_OUTPUT_DIR=/src` default). + +### Override the entrypoint + +```bash +docker run --rm -it -v "$(pwd):/src" --entrypoint bash \ + ghcr.io/taucad/opencascade.js:single-threaded +``` + +…drops you into a shell with `emsdk`, libclang, and Python on the PATH. + +## Multi-arch matrix + +| Tag family | Manifest list | Built on | +| ------------ | ----------------------------- | ----------------------------------------------------------------------------------- | +| Release tags | `linux/amd64` + `linux/arm64` | `ubuntu-latest` (amd64) + `ubuntu-24.04-arm` (arm64), GitHub Actions native runners | +| Branch tags | `linux/amd64` only | `ubuntu-latest`, GitHub Actions | + +Releases ship full manifest lists so Apple Silicon and ARM Linux hosts pull +the native arch transparently. Branch tags are amd64-only by design (R12 in +the [production-readiness blueprint](https://github.com/taucad/opencascade.js/blob/main/docs/research/ocjs-docker-production-readiness-blueprint.md)) +— ARM hosts will run under Rosetta / QEMU for branch tags. + +## OCI labels + +Inspect via `docker inspect ghcr.io/taucad/opencascade.js:single-threaded`: + +| Label | Purpose | +| -------------------------------------- | --------------------------------------------------------- | +| `org.opencontainers.image.title` | Stage-specific title (single-threaded, multi-threaded, …) | +| `org.opencontainers.image.description` | Threading model and consumer prerequisites | +| `org.opencontainers.image.source` | https://github.com/taucad/opencascade.js | +| `org.opencontainers.image.url` | Same as source | +| `org.opencontainers.image.revision` | Git commit the image was built from | +| `org.opencontainers.image.version` | Semver tag | +| `org.opencontainers.image.licenses` | LGPL-2.1-only | +| `org.opencontainers.image.vendor` | taucad | + +## Cosign signatures + +Every published image is signed with [cosign](https://github.com/sigstore/cosign) +via OIDC keyless signing — no rotating private keys, signatures published to +the Sigstore Rekor transparency log. Release tags carry **one signature on +the manifest-list digest** that verifies regardless of which arch the +consumer pulls; branch tags carry **per-arch image-digest signatures**. + +```bash +cosign verify ghcr.io/taucad/opencascade.js:single-threaded \ + --certificate-identity-regexp 'https://github.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com +``` + +A successful verification confirms the image was built by the +`taucad/opencascade.js` GitHub Actions `docker.yml` workflow and has not +been tampered with since publication. + +## Provenance + +```bash +cosign verify-attestation \ + --type slsaprovenance \ + --certificate-identity-regexp 'https://github\.com/taucad/opencascade\.js/\.github/workflows/docker\.yml@.*' \ + --certificate-oidc-issuer https://token.actions.githubusercontent.com \ + ghcr.io/taucad/opencascade.js:single-threaded +``` + +The attestation records the source commit, the workflow, and the runner +that produced the image. + +## SBOM + +```bash +docker buildx imagetools inspect \ + --format '{{ json .SBOM }}' \ + ghcr.io/taucad/opencascade.js:single-threaded +``` + +Diff the SBOM across image digests in CI to flag unexpected dep bumps. + +## Image stages + +The [Dockerfile](https://github.com/taucad/opencascade.js/blob/main/Dockerfile) +is multi-stage with five logical stages, three of which are published: + +| Stage | Published as | Contents | +| -------------------------- | ------------------ | ------------------------------------------------------------------------------- | +| `deps-base` | _(not published)_ | emsdk + apt + Node 24 + uv + Python + OCCT/rapidjson/freetype + LLVM 17 headers | +| `bindgen-base` | `:bindgen-base` | deps + npm ci + patches + PCH + `.d.ts.json` index | +| `compiled-single-threaded` | _(not published)_ | bindgen + compiled `.o` files + OCCT `.a` (single-threaded) | +| `compiled-multi-threaded` | _(not published)_ | bindgen + compiled `.o` files + OCCT `.a` (multi-threaded) | +| `final-single` | `:single-threaded` | compiled-single + OCI labels + entrypoint | +| `final-multi` | `:multi-threaded` | compiled-multi + OCI labels + entrypoint | + +Each stage is independently rebuildable via `docker buildx build --target `. See [Bindgen pipeline](../concepts/bindgen-pipeline) for how the +stages compose with the build pipeline. diff --git a/docs-site/content/docs/toolchain/reference/env-vars.mdx b/docs-site/content/docs/toolchain/reference/env-vars.mdx new file mode 100644 index 00000000..111b27d1 --- /dev/null +++ b/docs-site/content/docs/toolchain/reference/env-vars.mdx @@ -0,0 +1,63 @@ +--- +title: Environment variables +description: Every OCJS_* env var the build system honours — exceptions, SIMD, BigInt, EVAL_CTORS, LTO, strict types. +--- + +The build system reads these env vars before compile and link. Set them on the +command line, in CI, or in `build-configs/configurations.json`. + +## Compile-time flags + +| Variable | Default | Effect | +|---|---|---| +| `OCJS_EXCEPTIONS` | `1` | Compile every TU with `-fwasm-exceptions`. Mixed builds fail at link. | +| `OCJS_SIMD` | `1` | Compile every TU with `-msimd128` (baseline SIMD). | +| `OCJS_RELAXED_SIMD` | `0` | Additionally emit `-mrelaxed-simd`. Chrome/Firefox-only — breaks Safari. | +| `OCJS_BIGINT` | `1` | Compile with `-sWASM_BIGINT`. Saves ~30 KB JS glue. | +| `OCJS_EVAL_CTORS_LEVEL` | `2` | `-sEVAL_CTORS=N`. Levels: 0 off, 1 safe-side-effect, 2 full. | +| `OCJS_LTO` | `0` | Enable LLVM LTO. Smaller binary, ~3× slower build. | +| `OCJS_STRICT_TYPES` | `0` (warn-only) | When the link-time `.d.ts` post-processor rewrites method signatures to `unknown` (or codegen collects unbound-reference diagnostics), the build always prints a triage summary to stderr. Set `=1` to escalate that condition to a build failure. | + +## Build orchestration + +| Variable | Default | Effect | +|---|---|---| +| `OCJS_CONFIG` | `single-threaded` | Named preset from `configurations.json`. Alternative to the `--config ` CLI flag — both end up at the same place. | +| `OCJS_PARALLEL_JOBS` | CPU count | Max parallel compile jobs. | +| `OCJS_CACHE_DIR` | `./cache` | Where to store cached `.o` files and bindgen output. | +| `OCJS_BUILD_DIR` | `./build` | Intermediate build outputs. | +| `OCJS_DIST_DIR` | `./dist` | Final wasm + JS + .d.ts artifacts. | + +## Docker-specific + +| Variable | Default | Effect | +|---|---|---| +| `OCJS_DEPS_VERSION` | from `DEPS.json` | Override the dep pinning (OCCT, freetype, rapidjson). | +| `OCJS_EMSDK_DIR` | `/deps/emsdk` | Location of the emscripten SDK inside the image. | +| `OCJS_PYTHON` | `python3` | Python interpreter for the bindgen. | +| `OCJS_OUTPUT_DIR` | `/src` (in container) / `./dist` (host) | Where the link step writes the final `.wasm`, `.js`, `.d.ts`, and `.build-manifest.json`. In-container default is `/src` so the canonical single-mount Quickstart (`docker run -v "$(pwd):/src" …`) writes outputs next to the YAML automatically. Override to a separate path if you need outputs outside the bind-mount. | + +## Diagnostics + +| Variable | Default | Effect | +|---|---|---| +| `OCJS_VERBOSE` | `0` | Print every compile / link command. | +| `OCJS_DUMP_CACHE_KEYS` | `0` | Print the cache-key contents on miss (debug spurious cache invalidation). | + +## Worked example + +```bash +# Custom-trimmed Os build for an embedded edge runtime. +# OCJS_STRICT_TYPES=1 escalates the missing-typedef warning to a build +# failure -- recommended in CI; omit it for local builds (warn-only is +# the default). +OCJS_CONFIG=single-threaded-smallest \ +OCJS_STRICT_TYPES=1 \ +OCJS_PARALLEL_JOBS=8 \ +./build-wasm.sh link build-configs/edge-runtime.yml +``` + +## Related + +- [Named compile-time configurations](./configurations) — named preset list. +- [Two-channel config model](../concepts/two-channel-config-model) — compile-time vs link-time channels. diff --git a/docs-site/content/docs/toolchain/reference/yaml-schema.mdx b/docs-site/content/docs/toolchain/reference/yaml-schema.mdx new file mode 100644 index 00000000..fade57a4 --- /dev/null +++ b/docs-site/content/docs/toolchain/reference/yaml-schema.mdx @@ -0,0 +1,157 @@ +--- +title: YAML schema +description: Every key the build YAML accepts — mainBuild, extraBuilds, additionalCppCode, additionalCppFiles, additionalBindCode. +--- + +The build YAML controls which OCCT classes get bound, which C++ wrapper code +is injected, and which emscripten linker flags drive the final wasm. + +## Top-level shape + +```yaml +mainBuild: + name: + bindings: + - symbol: + emccFlags: + - + additionalBindCode: | + EMSCRIPTEN_BINDINGS(custom) { ... } + +extraBuilds: + - name: + bindings: [...] + emccFlags: [...] + additionalBindCode: | + ... + +additionalCppCode: | + typedef opencascade::handle Handle_Geom_Curve; + class MyWrapper { ... }; + +additionalCppFiles: + - path/to/extra.cpp + +generateTypescriptDefinitions: true +``` + +The canonical Cerberus definition lives in `src/customBuildSchema.py`. + +## `mainBuild` + +The primary wasm artifact produced by the YAML. + +### `mainBuild.name` + +Output filename without extension. `name: my-occt` produces `my-occt.wasm`, +`my-occt.js`, `my-occt.d.ts`, and `my-occt.build-manifest.json`. + +### `mainBuild.bindings` + +Allowlist of OCCT classes to expose to JS via embind. Only classes listed +here (and their transitive base classes) are accessible at runtime. + +```yaml +bindings: + - symbol: BRepPrimAPI_MakeBox + - symbol: TopoDS_Shape + - symbol: gp_Pnt +``` + +The symbol name must match exactly the C++ class name in the generated +binding `.cpp` files under `build/bindings/`. Base classes are auto-included +if missing from the list. + +### `mainBuild.emccFlags` + +Emscripten linker flags. See [Custom emcc flags](../guides/custom-emcc-flags) +for the recommended baseline and per-flag rationale. + +### `mainBuild.additionalBindCode` + +Per-build raw `EMSCRIPTEN_BINDINGS(...)` registrations compiled with +`` already included. See [Extend with C++](../guides/extend-with-cpp). + +## Symbol resolution classes + +Every YAML-requested symbol becomes a linked binding through exactly one of four mechanisms. The post-link `build-manifest.json` (schema `build-manifest-v2`) buckets each requested symbol into one of these categories under `symbols`: + +1. **Direct compilation.** `bindings: - symbol: gp_Pnt` causes the generator to emit `build/bindings/gp_Pnt.cpp`, which `compileBindings.py` compiles into `build/compiled-bindings/gp_Pnt.cpp.o`. Detected by `ocjs_bindgen.link.manifest_registry.collect_compiled_symbols`. Reported as `satisfied_by_compiled` (count surfaces as `symbols.compiled`). +2. **NCollection typedef alias.** `bindings: - symbol: TColgp_Array1OfPnt` resolves via the canonical mangled spelling `NCollection_Array1_gp_Pnt`; the linker substitutes the typedef at link time. Mapping lives in `build/ncollection-manifest.json`. Detected by `manifest_registry.load_ncollection_alias_index`. Reported under `symbols.alias_resolved` as `{alias, canonical}` entries. +3. **Embind builtin.** OCJS's `BUILTIN_ADDITIONAL_BIND_CODE` block (`OCJS`, `TopoDS`, `TColStd_IndexedDataMapOfStringString`) registers Embind class wrappers with no `.cpp.o` of their own. Detected by `manifest_registry.builtin_binding_symbols` reading `build/additional-bind-symbols.json`. +4. **Consumer `additionalBindCode`.** YAML's own `mainBuild.additionalBindCode` block undergoes the same Embind pathway. The link stage compiles `BUILTIN_ADDITIONAL_BIND_CODE + consumer additionalBindCode` into ONE translation unit so the AST producer emits a single `additional-bind-symbols.json` manifest covering both sources. Reported under `symbols.builtin` (no separate bucket). + +Anything that survives all four lookups lands in `symbols.missing` and triggers `validation_passed=false`. The link step also raises immediately via `yaml_build.verifyBindings` (no env-var gate) so a YAML asking for a symbol the toolchain cannot provide fails the link, not just the post-link audit. + +Auto-discovered NCollection canonicals (entries the YAML never named directly, but that became reachable from the YAML's scope) are tracked separately in `.provenance.json::nCollectionManifest.{linked, total, dropped}` (schema `wasm-build-provenance-v1.1`). They never appear in `symbols.requested` because they're produced by the discovery pass, not requested by the operator. + +## Producer-side manifest contract + +Every mechanism above has exactly one **producer** — a pipeline stage with the semantic knowledge to compute it — that writes a JSON manifest in `build/` or the dist sidecar. Every downstream **consumer** (link-time `verifyBindings`, post-link `validate-build.py`, `generate-docs.mjs`, `docker-e2e-validate.sh`) reads the manifest through the corresponding `manifest_registry` loader. No consumer re-parses C++, runs regex against source, or re-derives set-difference math. + +| Manifest | Producer | Consumer loader | +| ------------------------------------------------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------- | +| `build/ncollection-manifest.json` | `ocjs_bindgen.discover` | `manifest_registry.load_ncollection_alias_index` | +| `build/additional-bind-symbols.json` | `runBuild::getAdditionalBindCodeO()` (libclang AST via `ocjs_bindgen.ast.parse_additional_bind_code` + `ocjs_bindgen.ast.walker.extract_class_registrations`) | `manifest_registry.builtin_binding_symbols` | +| `build/compiled-bindings/*.cpp.o` | `compileBindings.py` | `manifest_registry.collect_compiled_symbols` | +| `build/compiled-bindings/binding-report.json` | `compileBindings.py` | `validate-build.py::validate_binding_report` | +| `.provenance.json::nCollectionManifest` | `yaml_build.main` via `provenance.add_linking(ncollection_linked=, ncollection_total=, ncollection_dropped=)` | `generate-docs.mjs`, `scripts/docker-e2e-validate.sh` | +| `build/any-type-report.json` | `generate.py` | `validate-build.py::merge_any_reasons` | + +When a manifest is missing, consumers fail loudly with a pointer at `pnpm nx run ocjs:build`. Stale artifacts are stale by definition; rendering them with degraded math produces docs whose numbers contradict the build that produced them. + +## `extraBuilds` + +Same schema as `mainBuild`. Each entry produces a sibling wasm artifact. +Useful for shipping multiple variants (e.g. baseline + relaxed-SIMD) from one +YAML pass. + +## `additionalCppCode` + +Inline C++ injected into a generated `.cpp` file compiled with the same flags +as the bindings TU. Common uses: + +1. Handle typedefs (`typedef opencascade::handle Handle_T;`). +2. Free-function helpers reachable from `additionalBindCode`. +3. Small `value_object` POD definitions. + +## `additionalCppFiles` + +List of `.cpp` files concatenated onto `additionalCppCode` before custom-binding +generation runs. + +```yaml +additionalCppCode: | + typedef opencascade::handle Handle_Geom_BSplineSurface; + +additionalCppFiles: + - wrappers/fair-curve.cpp + - wrappers/shape-cast.cpp +``` + +- Paths resolve relative to the YAML file's directory; absolute paths also accepted. +- File contents are appended in declaration order. +- `additionalCppCode` wins on conflict because it precedes file contents in the TU. +- A missing file fails-loud at validate time. + +## `generateTypescriptDefinitions` + +Default `true`. Set to `false` to skip `.d.ts` generation (rare — useful only +for ultra-fast iteration builds). + +## Validation + +```bash +./build-wasm.sh validate build-configs/my-config.yml +``` + +`validate` checks the YAML against the schema and exits non-zero on any +malformed entry, unknown key, duplicated symbol, or missing +`additionalCppFiles` path. It does not run the C++ pipeline — pair it with +`./build-wasm.sh link` to actually produce the wasm. + +## Related + +- [Trim symbols](../guides/trim-symbols) — end-to-end workflow. +- [Extend with C++](../guides/extend-with-cpp) — when to reach for which mechanism. +- [Custom emcc flags](../guides/custom-emcc-flags) — flag-by-flag rationale. diff --git a/docs-site/data/ApplicationFramework__TKCAF__AppStd.json b/docs-site/data/ApplicationFramework__TKCAF__AppStd.json new file mode 100644 index 00000000..868241e1 --- /dev/null +++ b/docs-site/data/ApplicationFramework__TKCAF__AppStd.json @@ -0,0 +1 @@ +{"schema":2,"shard":"ApplicationFramework__TKCAF__AppStd","generatedAt":"2026-05-30T11:04:48.218Z","classes":[{"name":"AppStd_Application","kind":"class","summary":"Legacy class defining resources name for standard OCAF documents.","extends":["TDocStd_Application"],"ancestors":["TDocStd_Application","CDF_Application","CDM_Application","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"AppStd_Application","comment":""}],"staticMethods":[{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ResourcesName","signature":"(): string","parameters":[],"returnType":"string","comment":"returns the file name which contains application resources"},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"properties":[]}]} \ No newline at end of file diff --git a/docs-site/data/ApplicationFramework__TKCAF__TDataXtd.json b/docs-site/data/ApplicationFramework__TKCAF__TDataXtd.json new file mode 100644 index 00000000..352519bf --- /dev/null +++ b/docs-site/data/ApplicationFramework__TKCAF__TDataXtd.json @@ -0,0 +1 @@ +{"schema":2,"shard":"ApplicationFramework__TKCAF__TDataXtd","generatedAt":"2026-05-30T11:04:48.218Z","classes":[{"name":"TDataXtd","kind":"class","summary":"This package defines extension of standard attributes for modelling (mainly for work with geometry).","extends":[],"ancestors":[],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd","comment":""}],"staticMethods":[{"name":"IDList","signature":"(anIDList: NCollection_List_Standard_GUID): void","parameters":[{"name":"anIDList","type":"NCollection_List_Standard_GUID","optional":false,"rest":false}],"returnType":"void","comment":"Appends to the list of the attributes IDs of this package. CAUTION: is NOT cleared before use.\n**Print of TDataExt enumeration**\n@param anIDList Mutated in place; read the updated value from this argument after the call."}],"instanceMethods":[],"properties":[]},{"name":"TDataXtd_Axis","kind":"class","summary":"The basis to define an axis attribute.\nWarning: Use {@link TDataXtd_Geometry | `TDataXtd_Geometry`} attribute to retrieve the {@link gp_Lin | `gp_Lin`} of the Axis attribute","extends":["TDataStd_GenericEmpty"],"ancestors":["TDataStd_GenericEmpty","TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Axis","comment":""}],"staticMethods":[{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"**class methods**\nReturns the GUID for an axis."},{"name":"Set","signature":"(label: TDF_Label): TDataXtd_Axis","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Axis","comment":"Finds or creates an axis attribute defined by the label. In the case of a creation of an axis, a compatible named shape should already be associated with label. Exceptions Standard_NullObject if no compatible named shape is associated with the label."},{"name":"Set","signature":"(label: TDF_Label, L: gp_Lin): TDataXtd_Axis","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false},{"name":"L","type":"gp_Lin","optional":false,"rest":false}],"returnType":"TDataXtd_Axis","comment":"Find, or create, an Axis attribute and set.\nas generated in the associated NamedShape.\n**Axis methods**"},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":""}],"properties":[]},{"name":"TDataXtd_Constraint","kind":"class","summary":"The groundwork to define constraint attributes. The constraint attribute contains the following sorts of data:\n- Type whether the constraint attribute is a geometric constraint or a dimension\n- Value the real number value of a numeric constraint such as an angle or a radius\n- Geometries to identify the geometries underlying the topological attributes which define the constraint (up to 4)\n- Plane for 2D constraints.","extends":["TDF_Attribute"],"ancestors":["TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Constraint","comment":""}],"staticMethods":[{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the GUID for constraints."},{"name":"Set","signature":"(label: TDF_Label): TDataXtd_Constraint","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Constraint","comment":"Finds or creates the 2D constraint attribute defined by the planar topological attribute plane and the label label.\n**Constraint methods**"},{"name":"CollectChildConstraints","signature":"(aLabel: TDF_Label, TheList: NCollection_List_TDF_Label): void","parameters":[{"name":"aLabel","type":"TDF_Label","optional":false,"rest":false},{"name":"TheList","type":"NCollection_List_TDF_Label","optional":false,"rest":false}],"returnType":"void","comment":"collects constraints on Childs for label \n@param TheList Mutated in place; read the updated value from this argument after the call."},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"Set","signature":"(type_: TDataXtd_ConstraintEnum, G1: TNaming_NamedShape): void","parameters":[{"name":"type_","type":"TDataXtd_ConstraintEnum","optional":false,"rest":false},{"name":"G1","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the constraint attribute defined by the topological attribute G1 and the constraint type type."},{"name":"Set","signature":"(type_: TDataXtd_ConstraintEnum, G1: TNaming_NamedShape, G2: TNaming_NamedShape): void","parameters":[{"name":"type_","type":"TDataXtd_ConstraintEnum","optional":false,"rest":false},{"name":"G1","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G2","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the constraint attribute defined by the topological attributes G1 and G2, and by the constraint type type."},{"name":"Set","signature":"(type_: TDataXtd_ConstraintEnum, G1: TNaming_NamedShape, G2: TNaming_NamedShape, G3: TNaming_NamedShape): void","parameters":[{"name":"type_","type":"TDataXtd_ConstraintEnum","optional":false,"rest":false},{"name":"G1","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G2","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G3","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the constraint attribute defined by the topological attributes G1, G2 and G3, and by the constraint type type."},{"name":"Set","signature":"(type_: TDataXtd_ConstraintEnum, G1: TNaming_NamedShape, G2: TNaming_NamedShape, G3: TNaming_NamedShape, G4: TNaming_NamedShape): void","parameters":[{"name":"type_","type":"TDataXtd_ConstraintEnum","optional":false,"rest":false},{"name":"G1","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G2","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G3","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G4","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the constraint attribute defined by the topological attributes G1, G2, G3 and G4, and by the constraint type type.\n**methods to read constraint fields**"},{"name":"Verified","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":"Returns true if this constraint attribute is valid. By default, true is returned. When the value of a dimension is changed or when a geometry is moved, false is returned until the solver sets it back to true."},{"name":"Verified","signature":"(status: boolean): void","parameters":[{"name":"status","type":"boolean","optional":false,"rest":false}],"returnType":"void","comment":"Returns true if this constraint attribute defined by status is valid. By default, true is returned. When the value of a dimension is changed or when a geometry is moved, false is returned until the solver sets it back to true. If status is false, Verified is set to false."},{"name":"GetType","signature":"(): TDataXtd_ConstraintEnum","parameters":[],"returnType":"TDataXtd_ConstraintEnum","comment":"Returns the type of constraint. This will be an element of the `TDataXtd_ConstraintEnum` enumeration."},{"name":"IsPlanar","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":"Returns true if this constraint attribute is two-dimensional."},{"name":"GetPlane","signature":"(): TNaming_NamedShape","parameters":[],"returnType":"TNaming_NamedShape","comment":"Returns the topological attribute of the plane used for planar - i.e., 2D - constraints. This plane is attached to another label. If the constraint is not planar, in other words, 3D, this function will return a null handle."},{"name":"IsDimension","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":"Returns true if this constraint attribute is a dimension, and therefore has a value."},{"name":"GetValue","signature":"(): TDataStd_Real","parameters":[],"returnType":"TDataStd_Real","comment":"Returns the value of a dimension. This value is a reference to a {@link TDataStd_Real | `TDataStd_Real`} attribute. If the attribute is not a dimension, this value will be 0. Use IsDimension to test this condition."},{"name":"NbGeometries","signature":"(): number","parameters":[],"returnType":"number","comment":"Returns the number of geometry attributes in this constraint attribute. This number will be between 1 and 4."},{"name":"GetGeometry","signature":"(Index: number): TNaming_NamedShape","parameters":[{"name":"Index","type":"number","optional":false,"rest":false}],"returnType":"TNaming_NamedShape","comment":"Returns the integer index Index used to access the array of the constraint or stored geometries of a dimension Index has a value between 1 and 4.\n**methods to write constraint fields (use builder)**"},{"name":"ClearGeometries","signature":"(): void","parameters":[],"returnType":"void","comment":"Removes the geometries involved in the constraint or dimension from the array of topological attributes where they are stored."},{"name":"SetType","signature":"(CTR: TDataXtd_ConstraintEnum): void","parameters":[{"name":"CTR","type":"TDataXtd_ConstraintEnum","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the type of constraint CTR."},{"name":"SetPlane","signature":"(plane: TNaming_NamedShape): void","parameters":[{"name":"plane","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the plane of the 2D constraint attribute, defined by the planar topological attribute plane."},{"name":"SetValue","signature":"(V: TDataStd_Real): void","parameters":[{"name":"V","type":"TDataStd_Real","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the real number value V of the dimension constraint attribute."},{"name":"SetGeometry","signature":"(Index: number, G: TNaming_NamedShape): void","parameters":[{"name":"Index","type":"number","optional":false,"rest":false},{"name":"G","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":"Finds or creates the underlying geometry of the constraint defined by the topological attribute G and the integer index Index."},{"name":"Inverted","signature":"(status: boolean): void","parameters":[{"name":"status","type":"boolean","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Inverted","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"Reversed","signature":"(status: boolean): void","parameters":[{"name":"status","type":"boolean","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Reversed","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"Restore","signature":"(anAttribute: TDF_Attribute): void","parameters":[{"name":"anAttribute","type":"TDF_Attribute","optional":false,"rest":false}],"returnType":"void","comment":"Restores the backuped contents from into this one. It is used when aborting a transaction."},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":"Returns an new empty attribute from the good end type. It is used by the copy algorithm."},{"name":"Paste","signature":"(intoAttribute: TDF_Attribute, aRelocationTable: TDF_RelocationTable): void","parameters":[{"name":"intoAttribute","type":"TDF_Attribute","optional":false,"rest":false},{"name":"aRelocationTable","type":"TDF_RelocationTable","optional":false,"rest":false}],"returnType":"void","comment":"This method is different from the \"Copy\" one, because it is used when copying an attribute from a source structure into a target structure. This method may paste the contents of into .\nThe given pasted attribute can be full or empty of its contents. But don't make a NEW! Just set the contents!\nIt is possible to use to get/set the relocation value of a source attribute."},{"name":"References","signature":"(aDataSet: TDF_DataSet): void","parameters":[{"name":"aDataSet","type":"TDF_DataSet","optional":false,"rest":false}],"returnType":"void","comment":"Adds the first level referenced attributes and labels to .\nFor this, use the AddLabel or AddAttribute of DataSet.\nIf there is none, do not implement the method."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"properties":[]},{"name":"TDataXtd_ConstraintEnum","kind":"enum","summary":"","extends":[],"constructors":[],"staticMethods":[],"instanceMethods":[],"properties":[{"name":"TDataXtd_RADIUS","type":"'TDataXtd_RADIUS'","readonly":true,"comment":""},{"name":"TDataXtd_DIAMETER","type":"'TDataXtd_DIAMETER'","readonly":true,"comment":""},{"name":"TDataXtd_MINOR_RADIUS","type":"'TDataXtd_MINOR_RADIUS'","readonly":true,"comment":""},{"name":"TDataXtd_MAJOR_RADIUS","type":"'TDataXtd_MAJOR_RADIUS'","readonly":true,"comment":""},{"name":"TDataXtd_TANGENT","type":"'TDataXtd_TANGENT'","readonly":true,"comment":""},{"name":"TDataXtd_PARALLEL","type":"'TDataXtd_PARALLEL'","readonly":true,"comment":""},{"name":"TDataXtd_PERPENDICULAR","type":"'TDataXtd_PERPENDICULAR'","readonly":true,"comment":""},{"name":"TDataXtd_CONCENTRIC","type":"'TDataXtd_CONCENTRIC'","readonly":true,"comment":""},{"name":"TDataXtd_COINCIDENT","type":"'TDataXtd_COINCIDENT'","readonly":true,"comment":""},{"name":"TDataXtd_DISTANCE","type":"'TDataXtd_DISTANCE'","readonly":true,"comment":""},{"name":"TDataXtd_ANGLE","type":"'TDataXtd_ANGLE'","readonly":true,"comment":""},{"name":"TDataXtd_EQUAL_RADIUS","type":"'TDataXtd_EQUAL_RADIUS'","readonly":true,"comment":""},{"name":"TDataXtd_SYMMETRY","type":"'TDataXtd_SYMMETRY'","readonly":true,"comment":""},{"name":"TDataXtd_MIDPOINT","type":"'TDataXtd_MIDPOINT'","readonly":true,"comment":""},{"name":"TDataXtd_EQUAL_DISTANCE","type":"'TDataXtd_EQUAL_DISTANCE'","readonly":true,"comment":""},{"name":"TDataXtd_FIX","type":"'TDataXtd_FIX'","readonly":true,"comment":""},{"name":"TDataXtd_RIGID","type":"'TDataXtd_RIGID'","readonly":true,"comment":""},{"name":"TDataXtd_FROM","type":"'TDataXtd_FROM'","readonly":true,"comment":""},{"name":"TDataXtd_AXIS","type":"'TDataXtd_AXIS'","readonly":true,"comment":""},{"name":"TDataXtd_MATE","type":"'TDataXtd_MATE'","readonly":true,"comment":""},{"name":"TDataXtd_ALIGN_FACES","type":"'TDataXtd_ALIGN_FACES'","readonly":true,"comment":""},{"name":"TDataXtd_ALIGN_AXES","type":"'TDataXtd_ALIGN_AXES'","readonly":true,"comment":""},{"name":"TDataXtd_AXES_ANGLE","type":"'TDataXtd_AXES_ANGLE'","readonly":true,"comment":""},{"name":"TDataXtd_FACES_ANGLE","type":"'TDataXtd_FACES_ANGLE'","readonly":true,"comment":""},{"name":"TDataXtd_ROUND","type":"'TDataXtd_ROUND'","readonly":true,"comment":""},{"name":"TDataXtd_OFFSET","type":"'TDataXtd_OFFSET'","readonly":true,"comment":""}]},{"name":"TDataXtd_Geometry","kind":"class","summary":"This class is used to model construction geometry. The specific geometric construction of the attribute is defined by an element of the enumeration `TDataXtd_GeometryEnum`. This attribute may also be used to qualify underlying geometry of the associated NamedShape. for Constructuion element by example.","extends":["TDF_Attribute"],"ancestors":["TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Geometry","comment":"This and the next methods are used to retrieve underlying geometry of the NamedShape, even if no Geometry Attribute is associated. if not found or not compliant geometry return False."}],"staticMethods":[{"name":"Set","signature":"(label: TDF_Label): TDataXtd_Geometry","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Geometry","comment":"**API class methods**\nFinds, or creates, a Geometry attribute defined by the label label. The default type of geometry is the value ANY_GEOM of the enumeration `TDataXtd_GeometryEnum`. To specify another value of this enumeration, use the function SetType."},{"name":"Type","signature":"(L: TDF_Label): TDataXtd_GeometryEnum","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_GeometryEnum","comment":"Returns the label L used to define the type of geometric construction for the geometry attribute."},{"name":"Type","signature":"(S: TNaming_NamedShape): TDataXtd_GeometryEnum","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"TDataXtd_GeometryEnum","comment":"Returns the topological attribute S used to define the type of geometric construction for the geometry attribute."},{"name":"Point","signature":"(L: TDF_Label, G: gp_Pnt): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Pnt","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the point attribute defined by the label L and the point G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Point","signature":"(S: TNaming_NamedShape, G: gp_Pnt): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Pnt","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the point attribute defined by the topological attribute S and the point G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Axis","signature":"(L: TDF_Label, G: gp_Ax1): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Ax1","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the axis attribute defined by the label L and the axis G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Axis","signature":"(S: TNaming_NamedShape, G: gp_Ax1): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Ax1","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the axis attribute defined by the topological attribute S and the axis G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Line","signature":"(L: TDF_Label, G: gp_Lin): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Lin","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the line attribute defined by the label L and the line G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Line","signature":"(S: TNaming_NamedShape, G: gp_Lin): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Lin","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the line attribute defined by the topological attribute S and the line G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Circle","signature":"(L: TDF_Label, G: gp_Circ): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Circ","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the circle attribute defined by the label L and the circle G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Circle","signature":"(S: TNaming_NamedShape, G: gp_Circ): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Circ","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the circle attribute defined by the topological attribute S and the circle G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Ellipse","signature":"(L: TDF_Label, G: gp_Elips): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Elips","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the ellipse attribute defined by the label L and the ellipse G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Ellipse","signature":"(S: TNaming_NamedShape, G: gp_Elips): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Elips","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the ellipse attribute defined by the topological attribute S and the ellipse G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Plane","signature":"(L: TDF_Label, G: gp_Pln): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Pln","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the plane attribute defined by the label L and the plane G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Plane","signature":"(S: TNaming_NamedShape, G: gp_Pln): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Pln","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the plane attribute defined by the topological attribute S and the plane G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Cylinder","signature":"(L: TDF_Label, G: gp_Cylinder): boolean","parameters":[{"name":"L","type":"TDF_Label","optional":false,"rest":false},{"name":"G","type":"gp_Cylinder","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the cylinder attribute defined by the label L and the cylinder G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"Cylinder","signature":"(S: TNaming_NamedShape, G: gp_Cylinder): boolean","parameters":[{"name":"S","type":"TNaming_NamedShape","optional":false,"rest":false},{"name":"G","type":"gp_Cylinder","optional":false,"rest":false}],"returnType":"boolean","comment":"Returns the cylinder attribute defined by the topological attribute S and the cylinder G.\n@param G Mutated in place; read the updated value from this argument after the call."},{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the GUID for geometry attributes."},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"SetType","signature":"(T: TDataXtd_GeometryEnum): void","parameters":[{"name":"T","type":"TDataXtd_GeometryEnum","optional":false,"rest":false}],"returnType":"void","comment":"Returns the type of geometric construction T of this attribute. T will be a value of the enumeration `TDataXtd_GeometryEnum`."},{"name":"GetType","signature":"(): TDataXtd_GeometryEnum","parameters":[],"returnType":"TDataXtd_GeometryEnum","comment":"Returns the type of geometric construction."},{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"Restore","signature":"(anAttribute: TDF_Attribute): void","parameters":[{"name":"anAttribute","type":"TDF_Attribute","optional":false,"rest":false}],"returnType":"void","comment":"Restores the backuped contents from into this one. It is used when aborting a transaction."},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":"Returns an new empty attribute from the good end type. It is used by the copy algorithm."},{"name":"Paste","signature":"(intoAttribute: TDF_Attribute, aRelocationTable: TDF_RelocationTable): void","parameters":[{"name":"intoAttribute","type":"TDF_Attribute","optional":false,"rest":false},{"name":"aRelocationTable","type":"TDF_RelocationTable","optional":false,"rest":false}],"returnType":"void","comment":"This method is different from the \"Copy\" one, because it is used when copying an attribute from a source structure into a target structure. This method may paste the contents of into .\nThe given pasted attribute can be full or empty of its contents. But don't make a NEW! Just set the contents!\nIt is possible to use to get/set the relocation value of a source attribute."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"properties":[]},{"name":"TDataXtd_GeometryEnum","kind":"enum","summary":"","extends":[],"constructors":[],"staticMethods":[],"instanceMethods":[],"properties":[{"name":"TDataXtd_ANY_GEOM","type":"'TDataXtd_ANY_GEOM'","readonly":true,"comment":""},{"name":"TDataXtd_POINT","type":"'TDataXtd_POINT'","readonly":true,"comment":""},{"name":"TDataXtd_LINE","type":"'TDataXtd_LINE'","readonly":true,"comment":""},{"name":"TDataXtd_CIRCLE","type":"'TDataXtd_CIRCLE'","readonly":true,"comment":""},{"name":"TDataXtd_ELLIPSE","type":"'TDataXtd_ELLIPSE'","readonly":true,"comment":""},{"name":"TDataXtd_SPLINE","type":"'TDataXtd_SPLINE'","readonly":true,"comment":""},{"name":"TDataXtd_PLANE","type":"'TDataXtd_PLANE'","readonly":true,"comment":""},{"name":"TDataXtd_CYLINDER","type":"'TDataXtd_CYLINDER'","readonly":true,"comment":""}]},{"name":"TDataXtd_Pattern","kind":"class","summary":"a general pattern model","extends":["TDF_Attribute"],"ancestors":["TDF_Attribute","Standard_Transient"],"constructors":[],"staticMethods":[{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":""},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"PatternID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"NbTrsfs","signature":"(): number","parameters":[],"returnType":"number","comment":"Give the number of transformation."},{"name":"ComputeTrsfs","signature":"(Trsfs: NCollection_Array1_gp_Trsf): void","parameters":[{"name":"Trsfs","type":"NCollection_Array1_gp_Trsf","optional":false,"rest":false}],"returnType":"void","comment":"Give the transformations.\n@param Trsfs Mutated in place; read the updated value from this argument after the call."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"properties":[]},{"name":"TDataXtd_PatternStd","kind":"class","summary":"to create a PatternStd (LinearPattern, CircularPattern, RectangularPattern, RadialCircularPattern, MirrorPattern)","extends":["TDataXtd_Pattern"],"ancestors":["TDataXtd_Pattern","TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_PatternStd","comment":""}],"staticMethods":[{"name":"GetPatternID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":""},{"name":"Set","signature":"(label: TDF_Label): TDataXtd_PatternStd","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_PatternStd","comment":"Find, or create, a PatternStd attribute."},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"Signature","signature":"(signature: number): void","parameters":[{"name":"signature","type":"number","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Signature","signature":"(): number","parameters":[],"returnType":"number","comment":""},{"name":"Axis1","signature":"(Axis1: TNaming_NamedShape): void","parameters":[{"name":"Axis1","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Axis1","signature":"(): TNaming_NamedShape","parameters":[],"returnType":"TNaming_NamedShape","comment":""},{"name":"Axis2","signature":"(Axis2: TNaming_NamedShape): void","parameters":[{"name":"Axis2","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Axis2","signature":"(): TNaming_NamedShape","parameters":[],"returnType":"TNaming_NamedShape","comment":""},{"name":"Axis1Reversed","signature":"(Axis1Reversed: boolean): void","parameters":[{"name":"Axis1Reversed","type":"boolean","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Axis1Reversed","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"Axis2Reversed","signature":"(Axis2Reversed: boolean): void","parameters":[{"name":"Axis2Reversed","type":"boolean","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Axis2Reversed","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"Value1","signature":"(value: TDataStd_Real): void","parameters":[{"name":"value","type":"TDataStd_Real","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Value1","signature":"(): TDataStd_Real","parameters":[],"returnType":"TDataStd_Real","comment":""},{"name":"Value2","signature":"(value: TDataStd_Real): void","parameters":[{"name":"value","type":"TDataStd_Real","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Value2","signature":"(): TDataStd_Real","parameters":[],"returnType":"TDataStd_Real","comment":""},{"name":"NbInstances1","signature":"(NbInstances1: TDataStd_Integer): void","parameters":[{"name":"NbInstances1","type":"TDataStd_Integer","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"NbInstances1","signature":"(): TDataStd_Integer","parameters":[],"returnType":"TDataStd_Integer","comment":""},{"name":"NbInstances2","signature":"(NbInstances2: TDataStd_Integer): void","parameters":[{"name":"NbInstances2","type":"TDataStd_Integer","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"NbInstances2","signature":"(): TDataStd_Integer","parameters":[],"returnType":"TDataStd_Integer","comment":""},{"name":"Mirror","signature":"(plane: TNaming_NamedShape): void","parameters":[{"name":"plane","type":"TNaming_NamedShape","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"Mirror","signature":"(): TNaming_NamedShape","parameters":[],"returnType":"TNaming_NamedShape","comment":""},{"name":"NbTrsfs","signature":"(): number","parameters":[],"returnType":"number","comment":"Give the number of transformation."},{"name":"ComputeTrsfs","signature":"(Trsfs: NCollection_Array1_gp_Trsf): void","parameters":[{"name":"Trsfs","type":"NCollection_Array1_gp_Trsf","optional":false,"rest":false}],"returnType":"void","comment":"Give the transformations.\n@param Trsfs Mutated in place; read the updated value from this argument after the call."},{"name":"PatternID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"Restore","signature":"(anAttribute: TDF_Attribute): void","parameters":[{"name":"anAttribute","type":"TDF_Attribute","optional":false,"rest":false}],"returnType":"void","comment":"Restores the backuped contents from into this one. It is used when aborting a transaction."},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":"Returns an new empty attribute from the good end type. It is used by the copy algorithm."},{"name":"Paste","signature":"(intoAttribute: TDF_Attribute, aRelocationTable: TDF_RelocationTable): void","parameters":[{"name":"intoAttribute","type":"TDF_Attribute","optional":false,"rest":false},{"name":"aRelocationTable","type":"TDF_RelocationTable","optional":false,"rest":false}],"returnType":"void","comment":"This method is different from the \"Copy\" one, because it is used when copying an attribute from a source structure into a target structure. This method may paste the contents of into .\nThe given pasted attribute can be full or empty of its contents. But don't make a NEW! Just set the contents!\nIt is possible to use to get/set the relocation value of a source attribute."},{"name":"References","signature":"(aDataSet: TDF_DataSet): void","parameters":[{"name":"aDataSet","type":"TDF_DataSet","optional":false,"rest":false}],"returnType":"void","comment":"Adds the first level referenced attributes and labels to .\nFor this, use the AddLabel or AddAttribute of DataSet.\nIf there is none, do not implement the method."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"properties":[]},{"name":"TDataXtd_Placement","kind":"class","summary":"","extends":["TDataStd_GenericEmpty"],"ancestors":["TDataStd_GenericEmpty","TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Placement","comment":""}],"staticMethods":[{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"**class methods**"},{"name":"Set","signature":"(label: TDF_Label): TDataXtd_Placement","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Placement","comment":"Find, or create, a Placement attribute. Placement attribute is returned.\n**Placement methods**"},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":""}],"properties":[]},{"name":"TDataXtd_Plane","kind":"class","summary":"The basis to define a plane attribute. Warning: Use {@link TDataXtd_Geometry | `TDataXtd_Geometry`} attribute to retrieve the {@link gp_Pln | `gp_Pln`} of the Plane attribute.","extends":["TDataStd_GenericEmpty"],"ancestors":["TDataStd_GenericEmpty","TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Plane","comment":""}],"staticMethods":[{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"**class methods**\nReturns the GUID for plane attributes."},{"name":"Set","signature":"(label: TDF_Label): TDataXtd_Plane","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Plane","comment":"Finds or creates the plane attribute defined by the label label. Warning If you are creating the attribute with this syntax, a planar face should already be associated with label."},{"name":"Set","signature":"(label: TDF_Label, P: gp_Pln): TDataXtd_Plane","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false},{"name":"P","type":"gp_Pln","optional":false,"rest":false}],"returnType":"TDataXtd_Plane","comment":"Finds, or creates, a Plane attribute and sets.\nas generated the associated NamedShape.\n**Plane methods**"},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":""}],"properties":[]},{"name":"TDataXtd_Point","kind":"class","summary":"The basis to define a point attribute. The topological attribute must contain a vertex. You use this class to create reference points in a design.\nWarning: Use {@link TDataXtd_Geometry | `TDataXtd_Geometry`} attribute to retrieve the {@link gp_Pnt | `gp_Pnt`} of the Point attribute","extends":["TDataStd_GenericEmpty"],"ancestors":["TDataStd_GenericEmpty","TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Point","comment":""}],"staticMethods":[{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"**class methods**\nReturns the GUID for point attributes."},{"name":"Set","signature":"(label: TDF_Label): TDataXtd_Point","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Point","comment":"Sets the label Label as a point attribute. If no object is found, a point attribute is created."},{"name":"Set","signature":"(label: TDF_Label, P: gp_Pnt): TDataXtd_Point","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false},{"name":"P","type":"gp_Pnt","optional":false,"rest":false}],"returnType":"TDataXtd_Point","comment":"Sets the label Label as a point attribute containing the point P. If no object is found, a point attribute is created.\n**Point methods**"},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":""}],"properties":[]},{"name":"TDataXtd_Position","kind":"class","summary":"Position of a Label.","extends":["TDF_Attribute"],"ancestors":["TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Position","comment":""}],"staticMethods":[{"name":"Set","signature":"(aLabel: TDF_Label, aPos: gp_Pnt): void","parameters":[{"name":"aLabel","type":"TDF_Label","optional":false,"rest":false},{"name":"aPos","type":"gp_Pnt","optional":false,"rest":false}],"returnType":"void","comment":"Create if not found the {@link TDataXtd_Position | `TDataXtd_Position`} attribute set its position to ."},{"name":"Set","signature":"(aLabel: TDF_Label): TDataXtd_Position","parameters":[{"name":"aLabel","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Position","comment":"Find an existing, or create an empty, Position. the Position attribute is returned."},{"name":"Get","signature":"(aLabel: TDF_Label, aPos: gp_Pnt): boolean","parameters":[{"name":"aLabel","type":"TDF_Label","optional":false,"rest":false},{"name":"aPos","type":"gp_Pnt","optional":false,"rest":false}],"returnType":"boolean","comment":"Search label.\n@param aPos Mutated in place; read the updated value from this argument after the call."},{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":"Returns the ID of the attribute."},{"name":"Restore","signature":"(anAttribute: TDF_Attribute): void","parameters":[{"name":"anAttribute","type":"TDF_Attribute","optional":false,"rest":false}],"returnType":"void","comment":"Restores the contents from into this one. It is used when aborting a transaction."},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":"Returns an new empty attribute from the good end type. It is used by the copy algorithm."},{"name":"Paste","signature":"(intoAttribute: TDF_Attribute, aRelocationTable: TDF_RelocationTable): void","parameters":[{"name":"intoAttribute","type":"TDF_Attribute","optional":false,"rest":false},{"name":"aRelocationTable","type":"TDF_RelocationTable","optional":false,"rest":false}],"returnType":"void","comment":"This method is different from the \"Copy\" one, because it is used when copying an attribute from a source structure into a target structure. This method pastes the current attribute to the label corresponding to the insertor. The pasted attribute may be a brand new one or a new version of the previous one."},{"name":"GetPosition","signature":"(): gp_Pnt","parameters":[],"returnType":"gp_Pnt","comment":""},{"name":"SetPosition","signature":"(aPos: gp_Pnt): void","parameters":[{"name":"aPos","type":"gp_Pnt","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""}],"properties":[]},{"name":"TDataXtd_Presentation","kind":"class","summary":"Attribute containing parameters of presentation of the shape, e.g. the shape attached to the same label and displayed using TPrsStd tools (see `TPrsStd_AISPresentation`).","extends":["TDF_Attribute"],"ancestors":["TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Presentation","comment":""}],"staticMethods":[{"name":"Set","signature":"(theLabel: TDF_Label, theDriverId: Standard_GUID): TDataXtd_Presentation","parameters":[{"name":"theLabel","type":"TDF_Label","optional":false,"rest":false},{"name":"theDriverId","type":"Standard_GUID","optional":false,"rest":false}],"returnType":"TDataXtd_Presentation","comment":""},{"name":"Unset","signature":"(theLabel: TDF_Label): void","parameters":[{"name":"theLabel","type":"TDF_Label","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"GetID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":""},{"name":"get_type_name","signature":"(): string","parameters":[],"returnType":"string","comment":""},{"name":"get_type_descriptor","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""},{"name":"getColorNameFromOldEnum","signature":"(theOld: number): Quantity_NameOfColor","parameters":[{"name":"theOld","type":"number","optional":false,"rest":false}],"returnType":"Quantity_NameOfColor","comment":""},{"name":"getOldColorNameFromNewEnum","signature":"(theNew: Quantity_NameOfColor): number","parameters":[{"name":"theNew","type":"Quantity_NameOfColor","optional":false,"rest":false}],"returnType":"number","comment":""}],"instanceMethods":[{"name":"ID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":""},{"name":"Restore","signature":"(anAttribute: TDF_Attribute): void","parameters":[{"name":"anAttribute","type":"TDF_Attribute","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"NewEmpty","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":""},{"name":"Paste","signature":"(intoAttribute: TDF_Attribute, aRelocationTable: TDF_RelocationTable): void","parameters":[{"name":"intoAttribute","type":"TDF_Attribute","optional":false,"rest":false},{"name":"aRelocationTable","type":"TDF_RelocationTable","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"BackupCopy","signature":"(): TDF_Attribute","parameters":[],"returnType":"TDF_Attribute","comment":""},{"name":"DynamicType","signature":"(): Standard_Type","parameters":[],"returnType":"Standard_Type","comment":""},{"name":"GetDriverGUID","signature":"(): Standard_GUID","parameters":[],"returnType":"Standard_GUID","comment":""},{"name":"SetDriverGUID","signature":"(theGUID: Standard_GUID): void","parameters":[{"name":"theGUID","type":"Standard_GUID","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"IsDisplayed","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"HasOwnMaterial","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"HasOwnTransparency","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"HasOwnColor","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"HasOwnWidth","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"HasOwnMode","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"HasOwnSelectionMode","signature":"(): boolean","parameters":[],"returnType":"boolean","comment":""},{"name":"SetDisplayed","signature":"(theIsDisplayed: boolean): void","parameters":[{"name":"theIsDisplayed","type":"boolean","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"SetMaterialIndex","signature":"(theMaterialIndex: number): void","parameters":[{"name":"theMaterialIndex","type":"number","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"SetTransparency","signature":"(theValue: number): void","parameters":[{"name":"theValue","type":"number","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"SetColor","signature":"(theColor: Quantity_NameOfColor): void","parameters":[{"name":"theColor","type":"Quantity_NameOfColor","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"SetWidth","signature":"(theWidth: number): void","parameters":[{"name":"theWidth","type":"number","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"SetMode","signature":"(theMode: number): void","parameters":[{"name":"theMode","type":"number","optional":false,"rest":false}],"returnType":"void","comment":""},{"name":"GetNbSelectionModes","signature":"(): number","parameters":[],"returnType":"number","comment":""},{"name":"SetSelectionMode","signature":"(theSelectionMode: number, theTransaction?: boolean): void","parameters":[{"name":"theSelectionMode","type":"number","optional":false,"rest":false},{"name":"theTransaction","type":"boolean","optional":true,"rest":false}],"returnType":"void","comment":""},{"name":"AddSelectionMode","signature":"(theSelectionMode: number, theTransaction?: boolean): void","parameters":[{"name":"theSelectionMode","type":"number","optional":false,"rest":false},{"name":"theTransaction","type":"boolean","optional":true,"rest":false}],"returnType":"void","comment":""},{"name":"MaterialIndex","signature":"(): number","parameters":[],"returnType":"number","comment":""},{"name":"Transparency","signature":"(): number","parameters":[],"returnType":"number","comment":""},{"name":"Color","signature":"(): Quantity_NameOfColor","parameters":[],"returnType":"Quantity_NameOfColor","comment":""},{"name":"Width","signature":"(): number","parameters":[],"returnType":"number","comment":""},{"name":"Mode","signature":"(): number","parameters":[],"returnType":"number","comment":""},{"name":"SelectionMode","signature":"(index?: number): number","parameters":[{"name":"index","type":"number","optional":true,"rest":false}],"returnType":"number","comment":""},{"name":"UnsetMaterial","signature":"(): void","parameters":[],"returnType":"void","comment":""},{"name":"UnsetTransparency","signature":"(): void","parameters":[],"returnType":"void","comment":""},{"name":"UnsetColor","signature":"(): void","parameters":[],"returnType":"void","comment":""},{"name":"UnsetWidth","signature":"(): void","parameters":[],"returnType":"void","comment":""},{"name":"UnsetMode","signature":"(): void","parameters":[],"returnType":"void","comment":""},{"name":"UnsetSelectionMode","signature":"(): void","parameters":[],"returnType":"void","comment":""}],"properties":[]},{"name":"TDataXtd_Shape","kind":"class","summary":"A Shape is associated in the framework with : a NamedShape attribute.","extends":["TDataStd_GenericEmpty"],"ancestors":["TDataStd_GenericEmpty","TDF_Attribute","Standard_Transient"],"constructors":[{"name":"constructor","signature":"()","parameters":[],"returnType":"TDataXtd_Shape","comment":""}],"staticMethods":[{"name":"Find","signature":"(current: TDF_Label): { returnValue: boolean; S: TDataXtd_Shape; [Symbol.dispose](): void }","parameters":[{"name":"current","type":"TDF_Label","optional":false,"rest":false}],"returnType":"{ returnValue: boolean; S: TDataXtd_Shape; [Symbol.dispose](): void }","comment":"**class methods**\ntry to retrieve a Shape attribute at label or in fathers label of . Returns True if found and set .\n@returns A result object with fields:\n- `returnValue`: the C++ return value\n- `S`: owned by the returned envelope.\nDispose the returned envelope to release owned Handle fields."},{"name":"New","signature":"(label: TDF_Label): TDataXtd_Shape","parameters":[{"name":"label","type":"TDF_Label","optional":false,"rest":false}],"returnType":"TDataXtd_Shape","comment":"Find, or create, a Shape attribute. the Shape attribute is returned. Raises if