diff --git a/.github/ci-cd-scripts/playwright-electron.sh b/.github/ci-cd-scripts/playwright-electron.sh index e3c62b693..862d78906 100755 --- a/.github/ci-cd-scripts/playwright-electron.sh +++ b/.github/ci-cd-scripts/playwright-electron.sh @@ -7,11 +7,11 @@ if [[ ! -f "test-results/.last-run.json" ]]; then # If no last run artifact, than run Playwright normally echo "run playwright normally" if [[ "$3" == *ubuntu* ]]; then - xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:playwright:electron -- --shard=$1/$2 || true + xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:e2e:desktop -- --shard=$1/$2 || true elif [[ "$3" == *windows* ]]; then - npm run test:playwright:electron -- --grep=@windows --shard=$1/$2 || true + npm run test:e2e:desktop -- --grep=@windows --shard=$1/$2 || true elif [[ "$3" == *macos* ]]; then - npm run test:playwright:electron -- --grep=@macos --shard=$1/$2 || true + npm run test:e2e:desktop -- --grep=@macos --shard=$1/$2 || true else echo "Do not run Playwright. Unable to detect os runtime." exit 1 @@ -31,11 +31,11 @@ while [[ $retry -le $max_retries ]]; do echo "retried=true" >>$GITHUB_OUTPUT echo "run playwright with last failed tests and retry $retry" if [[ "$3" == *ubuntu* ]]; then - xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:playwright:electron -- --last-failed || true + xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- npm run test:e2e:desktop -- --last-failed || true elif [[ "$3" == *windows* ]]; then - npm run test:playwright:electron -- --grep=@windows --last-failed || true + npm run test:e2e:desktop -- --grep=@windows --last-failed || true elif [[ "$3" == *macos* ]]; then - npm run test:playwright:electron -- --grep=@macos --last-failed || true + npm run test:e2e:desktop -- --grep=@macos --last-failed || true else echo "Do not run playwright. Unable to detect os runtime." exit 1 diff --git a/.github/dependabot.yml b/.github/dependabot.yml index 999650853..d6507eef1 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -15,23 +15,33 @@ updates: groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -43,283 +53,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-python-bindings - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-to-core - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-language-server-release - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-wasm-lib - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-derive-docs - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-bumper - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: cargo - directory: /rust/kcl-language-server - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -331,31 +94,159 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-language-server + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-wasm-lib + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-bumper + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -367,31 +258,200 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-to-core + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-derive-docs + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-python-bindings + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: cargo + directory: /rust/kcl-language-server-release + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -403,31 +463,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -439,31 +504,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -475,103 +545,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: npm - directory: /rust/kcl-language-server - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz - groups: - security: - applies-to: security-updates - update-types: - - minor - - patch - security-major: - applies-to: security-updates - update-types: - - major - patch: - applies-to: version-updates - update-types: - - patch - major: - applies-to: version-updates - update-types: - - major - minor: - applies-to: version-updates - update-types: - - minor - - patch -- package-ecosystem: npm - directory: /packages/codemirror-lang-kcl - schedule: - interval: weekly - day: monday - time: '03:00' - timezone: America/Los_Angeles - open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -583,31 +586,118 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: npm + directory: /rust/kcl-language-server + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch +- package-ecosystem: npm + directory: /packages/codemirror-lang-kcl + schedule: + interval: weekly + day: monday + time: '03:00' + timezone: America/Los_Angeles + open-pull-requests-limit: 5 + groups: + security: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - minor + - patch + security-major: + applies-to: security-updates + exclude-patterns: + - kittycad* + update-types: + - major + patch: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - patch + major: + applies-to: version-updates + exclude-patterns: + - kittycad* + update-types: + - major + minor: + applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -619,31 +709,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -655,31 +750,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch @@ -691,31 +791,36 @@ updates: time: '03:00' timezone: America/Los_Angeles open-pull-requests-limit: 5 - reviewers: - - adamchalmers - - franknoirot - - irev-dev - - jessfraz groups: security: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - minor - patch security-major: applies-to: security-updates + exclude-patterns: + - kittycad* update-types: - major patch: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - patch major: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - major minor: applies-to: version-updates + exclude-patterns: + - kittycad* update-types: - minor - patch diff --git a/.github/workflows/e2e-tests.yml b/.github/workflows/e2e-tests.yml index 4b14b79a7..4948e6f22 100644 --- a/.github/workflows/e2e-tests.yml +++ b/.github/workflows/e2e-tests.yml @@ -20,9 +20,11 @@ permissions: jobs: prepare-wasm: + # separate job on Ubuntu to build or fetch the wasm blob once on the fastest runner runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64 steps: + - uses: actions/checkout@v4 - id: filter @@ -103,9 +105,10 @@ jobs: needs: [prepare-wasm] runs-on: runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64 - name: playwright:snapshots:ubuntu + name: e2e:snapshots steps: + - uses: actions/create-github-app-token@v1 id: app-token with: @@ -135,7 +138,7 @@ jobs: - name: Install dependencies run: npm install - - name: Cache browsers + - name: Download browser cache uses: actions/cache@v4 with: path: | @@ -145,7 +148,7 @@ jobs: - name: Install browsers run: npm run playwright install --with-deps - - name: Test snapshots + - name: npm run test:snapshots uses: nick-fields/retry@v3.0.2 with: shell: bash @@ -214,8 +217,12 @@ jobs: strategy: fail-fast: false matrix: - os: [ubuntu-latest, windows-latest, macos-latest] + include: + - os: "runs-on=${{ github.run_id }}/family=i7ie.2xlarge/image=ubuntu22-full-x64" + - os: namespace-profile-macos-8-cores + - os: windows-latest-8-cores runs-on: ${{ matrix.os }} + name: e2e:web (${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}) env: OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} @@ -250,7 +257,7 @@ jobs: - name: Install dependencies run: npm install - - name: Cache browsers + - name: Download browser cache uses: actions/cache@v4 with: path: | @@ -267,7 +274,7 @@ jobs: GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }} OS_NAME: ${{ env.OS_NAME }} - - name: Test web + - name: npm run test:e2e:web uses: nick-fields/retry@v3.0.2 with: shell: bash @@ -336,7 +343,7 @@ jobs: shardIndex: 2 shardTotal: 2 runs-on: ${{ matrix.os }} - name: playwright:electron:${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} (shard ${{ matrix.shardIndex }}) + name: e2e:desktop (${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }}, shard ${{ matrix.shardIndex }}) env: OS_NAME: ${{ contains(matrix.os, 'ubuntu') && 'ubuntu' || (contains(matrix.os, 'windows') && 'windows' || 'macos') }} @@ -346,7 +353,7 @@ jobs: - uses: actions/download-artifact@v4 name: prepared-wasm - - name: Copy prepared wasm + - name: Copy prepared Wasm run: | ls -R prepared-wasm cp prepared-wasm/kcl_wasm_lib_bg.wasm public @@ -362,7 +369,7 @@ jobs: id: deps-install run: npm install - - name: Cache browsers + - name: Download browser cache uses: actions/cache@v4 with: path: | @@ -372,9 +379,6 @@ jobs: - name: Install browsers run: npm run playwright install --with-deps - - name: Build web - run: npm run tronb:vite:dev - - name: Start Vector if: ${{ !contains(matrix.os, 'windows') }} run: .github/ci-cd-scripts/start-vector-${{ env.OS_NAME }}.sh @@ -382,6 +386,9 @@ jobs: GH_ACTIONS_AXIOM_TOKEN: ${{ secrets.GH_ACTIONS_AXIOM_TOKEN }} OS_NAME: ${{ env.OS_NAME }} + - name: Build app + run: npm run tronb:vite:dev + - uses: actions/download-artifact@v4 if: ${{ !cancelled() && (success() || failure()) }} continue-on-error: true @@ -389,7 +396,7 @@ jobs: name: test-results-${{ env.OS_NAME }}-${{ matrix.shardIndex }}-${{ github.sha }} path: test-results/ - - name: Run playwright/electron flow (with retries) + - name: npm run test:e2e:desktop id: retry if: ${{ !cancelled() && steps.deps-install.outcome == 'success' }} uses: nick-fields/retry@v3.0.2 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index db9187a6e..4006dd479 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -213,14 +213,21 @@ npm run test:snapshots ``` You may use `-- --update-snapshots` as needed. -#### Electron flow tests (Chromium on Ubuntu, macOS, Windows) +#### Desktop tests (Electron on all platforms) ``` npm run playwright -- install chromium -npm run test:playwright:electron:local +npm run test:e2e:desktop:local ``` + You may use `-- -g "my test"` to match specific test titles, or `-- path/to/file.spec.ts` for a test file. +#### Web tests (Google Chrome on all platforms) + +``` +npm run test:e2e:web +``` + #### Debugger However, if you want a debugger I recommend using VSCode and the `playwright` extension, as the above command is a cruder debugger that steps into every function call which is annoying. diff --git a/Makefile b/Makefile index 64057f262..adacc8fe8 100644 --- a/Makefile +++ b/Makefile @@ -129,9 +129,9 @@ endif .PHONY: test-e2e-desktop test-e2e-desktop: install build ## Run the desktop e2e tests ifdef E2E_GREP - npm run test:playwright:electron -- --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES) + npm run test:e2e:desktop -- --grep="$(E2E_GREP)" --max-failures=$(E2E_FAILURES) else - npm run test:playwright:electron -- --workers='100%' + npm run test:e2e:desktop -- --workers='100%' endif ############################################################################### diff --git a/docs/kcl-std/assert.md b/docs/kcl-std/assert.md deleted file mode 100644 index 7066b38fc..000000000 --- a/docs/kcl-std/assert.md +++ /dev/null @@ -1,64 +0,0 @@ ---- -title: "assert" -subtitle: "Function in std" -excerpt: "Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met." -layout: manual ---- - -Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met. - -```kcl -assert( - @actual: number, - isGreaterThan?: number, - isLessThan?: number, - isGreaterThanOrEqual?: number, - isLessThanOrEqual?: number, - isEqualTo?: number, - tolerance?: number, - error?: string, -): () -``` - - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `actual` | [`number`](/docs/kcl-std/types/std-types-number) | Value to check. It will be compared with one of the comparison arguments. | Yes | -| `isGreaterThan` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than this. | No | -| `isLessThan` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than this. | No | -| `isGreaterThanOrEqual` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than or equal to this. | No | -| `isLessThanOrEqual` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | -| `isEqualTo` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | -| `tolerance` | [`number`](/docs/kcl-std/types/std-types-number) | If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places. | No | -| `error` | [`string`](/docs/kcl-std/types/std-types-string) | If the value was false, the program will terminate with this error message | No | - -### Returns - -`()` - - -### Examples - -```kcl -n = 10 -assert(n, isEqualTo = 10) -assert( - n, - isGreaterThanOrEqual = 0, - isLessThan = 100, - error = "number should be between 0 and 100", -) -assert( - 1.0000000000012, - isEqualTo = 1, - tolerance = 0.0001, - error = "number should be almost exactly 1", -) -``` - -![Rendered example of assert 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl-std/assertIs.md b/docs/kcl-std/assertIs.md deleted file mode 100644 index 6dd5f61a9..000000000 --- a/docs/kcl-std/assertIs.md +++ /dev/null @@ -1,40 +0,0 @@ ---- -title: "assertIs" -subtitle: "Function in std" -excerpt: "Asserts that a value is the boolean value true." -layout: manual ---- - -Asserts that a value is the boolean value true. - -```kcl -assertIs( - @actual: bool, - error?: string, -): () -``` - - - -### Arguments - -| Name | Type | Description | Required | -|----------|------|-------------|----------| -| `actual` | [`bool`](/docs/kcl-std/types/std-types-bool) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails. | Yes | -| `error` | [`string`](/docs/kcl-std/types/std-types-string) | If the value was false, the program will terminate with this error message | No | - -### Returns - -`()` - - -### Examples - -```kcl -kclIsFun = true -assertIs(kclIsFun) -``` - -![Rendered example of assertIs 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABMiklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwKn4gueWQqZ4gAAAABJRU5ErkJggg==) - - diff --git a/docs/kcl-std/functions/std-appearance-hexString.md b/docs/kcl-std/functions/std-appearance-hexString.md index b41fec7f4..f5b714a4a 100644 --- a/docs/kcl-std/functions/std-appearance-hexString.md +++ b/docs/kcl-std/functions/std-appearance-hexString.md @@ -1,24 +1,23 @@ --- title: "appearance::hexString" subtitle: "Function in std::appearance" -excerpt: "" +excerpt: "Build a color from its red, green and blue components. These must be between 0 and 255." layout: manual --- - +Build a color from its red, green and blue components. These must be between 0 and 255. ```kcl appearance::hexString(@rgb: [number(_); 3]): string ``` -Build a color from its red, green and blue components. -These must be between 0 and 255. + ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `rgb` | [`[number(_); 3]`](/docs/kcl-std/types/std-types-number) | | Yes | +| `rgb` | [`[number(_); 3]`](/docs/kcl-std/types/std-types-number) | The red, blue and green components of the color. Must be between 0 and 255. | Yes | ### Returns diff --git a/docs/kcl-std/functions/std-array-reduce.md b/docs/kcl-std/functions/std-array-reduce.md index d16443b51..cf2ff6dc5 100644 --- a/docs/kcl-std/functions/std-array-reduce.md +++ b/docs/kcl-std/functions/std-array-reduce.md @@ -1,11 +1,11 @@ --- title: "reduce" subtitle: "Function in std::array" -excerpt: "" +excerpt: "Take a starting value. Then, for each element of an array, calculate the next value, using the previous value and the element." layout: manual --- - +Take a starting value. Then, for each element of an array, calculate the next value, using the previous value and the element. ```kcl reduce( @@ -15,8 +15,7 @@ reduce( ): any ``` -Take a starting value. Then, for each element of an array, calculate the next value, -using the previous value and the element. + ### Arguments @@ -28,7 +27,7 @@ using the previous value and the element. ### Returns -[`any`](/docs/kcl-std/types/std-types-any) +[`any`](/docs/kcl-std/types/std-types-any) - The [`any`](/docs/kcl-std/types/std-types-any) type is the type of all possible values in KCL. I.e., if a function accepts an argument with type [`any`](/docs/kcl-std/types/std-types-any), then it can accept any value. ### Examples diff --git a/docs/kcl-std/functions/std-assert.md b/docs/kcl-std/functions/std-assert.md new file mode 100644 index 000000000..5d85ce97b --- /dev/null +++ b/docs/kcl-std/functions/std-assert.md @@ -0,0 +1,49 @@ +--- +title: "assert" +subtitle: "Function in std" +excerpt: "Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met." +layout: manual +--- + +Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met. + +```kcl +assert( + @actual: number, + isGreaterThan?: number, + isLessThan?: number, + isGreaterThanOrEqual?: number, + isLessThanOrEqual?: number, + isEqualTo?: number, + tolerance?: number, + error?: string, +) +``` + + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `actual` | [`number`](/docs/kcl-std/types/std-types-number) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails.. | Yes | +| `isGreaterThan` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than this. | No | +| `isLessThan` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than this. | No | +| `isGreaterThanOrEqual` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is greater than or equal to this. | No | +| `isLessThanOrEqual` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | +| `isEqualTo` | [`number`](/docs/kcl-std/types/std-types-number) | Comparison argument. If given, checks the `actual` value is less than or equal to this. | No | +| `tolerance` | [`number`](/docs/kcl-std/types/std-types-number) | If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places. | No | +| `error` | [`string`](/docs/kcl-std/types/std-types-string) | If the value was false, the program will terminate with this error message | No | + + +### Examples + +```kcl +n = 10 +assert(n, isEqualTo = 10) +assert(n, isGreaterThanOrEqual = 0, isLessThan = 100, error = "number should be between 0 and 100") +assert(1.0000000000012, isEqualTo = 1, tolerance = 0.0001, error = "number should be almost exactly 1") +``` + + + diff --git a/docs/kcl-std/functions/std-assertIs.md b/docs/kcl-std/functions/std-assertIs.md new file mode 100644 index 000000000..5025da798 --- /dev/null +++ b/docs/kcl-std/functions/std-assertIs.md @@ -0,0 +1,35 @@ +--- +title: "assertIs" +subtitle: "Function in std" +excerpt: "Asserts that a value is the boolean value true." +layout: manual +--- + +Asserts that a value is the boolean value true. + +```kcl +assertIs( + @actual: bool, + error?: string, +) +``` + + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `actual` | [`bool`](/docs/kcl-std/types/std-types-bool) | Value to check. If this is the boolean value true, assert passes. Otherwise it fails.. | Yes | +| `error` | [`string`](/docs/kcl-std/types/std-types-string) | If the value was false, the program will terminate with this error message | No | + + +### Examples + +```kcl +kclIsFun = true +assertIs(kclIsFun) +``` + + + diff --git a/docs/kcl-std/functions/std-math-polar.md b/docs/kcl-std/functions/std-math-polar.md index 6fe41824f..8bb44dab5 100644 --- a/docs/kcl-std/functions/std-math-polar.md +++ b/docs/kcl-std/functions/std-math-polar.md @@ -1,11 +1,11 @@ --- title: "polar" subtitle: "Function in std::math" -excerpt: "" +excerpt: "Convert polar/sphere (azimuth, elevation, distance) coordinates to cartesian (x/y/z grid) coordinates." layout: manual --- - +Convert polar/sphere (azimuth, elevation, distance) coordinates to cartesian (x/y/z grid) coordinates. ```kcl polar( @@ -14,8 +14,7 @@ polar( ): Point2d ``` -Convert polar/sphere (azimuth, elevation, distance) coordinates to -cartesian (x/y/z grid) coordinates. + ### Arguments diff --git a/docs/kcl-std/functions/std-math-rem.md b/docs/kcl-std/functions/std-math-rem.md index 6b84c1ccc..b93d1d2b4 100644 --- a/docs/kcl-std/functions/std-math-rem.md +++ b/docs/kcl-std/functions/std-math-rem.md @@ -1,11 +1,11 @@ --- title: "rem" subtitle: "Function in std::math" -excerpt: "" +excerpt: "Compute the remainder after dividing `num` by `div`. If `num` is negative, the result will be too." layout: manual --- - +Compute the remainder after dividing `num` by `div`. If `num` is negative, the result will be too. ```kcl rem( @@ -14,8 +14,7 @@ rem( ): number ``` -Compute the remainder after dividing `num` by `div`. -If `num` is negative, the result will be too. + ### Arguments diff --git a/docs/kcl-std/angledLine.md b/docs/kcl-std/functions/std-sketch-angledLine.md similarity index 98% rename from docs/kcl-std/angledLine.md rename to docs/kcl-std/functions/std-sketch-angledLine.md index c667aa39d..30573f8dc 100644 --- a/docs/kcl-std/angledLine.md +++ b/docs/kcl-std/functions/std-sketch-angledLine.md @@ -10,13 +10,13 @@ Draw a line segment relative to the current origin using the polar measure of so ```kcl angledLine( @sketch: Sketch, - angle: number, - length?: number, - lengthX?: number, - lengthY?: number, - endAbsoluteX?: number, - endAbsoluteY?: number, - tag?: TagDeclarator, + angle: number(Angle), + length?: number(Length), + lengthX?: number(Length), + lengthY?: number(Length), + endAbsoluteX?: number(Length), + endAbsoluteY?: number(Length), + tag?: tag, ): Sketch ``` @@ -27,13 +27,13 @@ angledLine( | Name | Type | Description | Required | |----------|------|-------------|----------| | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | -| `angle` | [`number`](/docs/kcl-std/types/std-types-number) | Which angle should the line be drawn at? | Yes | -| `length` | [`number`](/docs/kcl-std/types/std-types-number) | Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `lengthX` | [`number`](/docs/kcl-std/types/std-types-number) | Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `lengthY` | [`number`](/docs/kcl-std/types/std-types-number) | Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `endAbsoluteX` | [`number`](/docs/kcl-std/types/std-types-number) | Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| `endAbsoluteY` | [`number`](/docs/kcl-std/types/std-types-number) | Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `angle` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | Which angle should the line be drawn at? | Yes | +| `length` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `lengthX` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `lengthY` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `endAbsoluteX` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| `endAbsoluteY` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns @@ -46,7 +46,10 @@ angledLine( exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> yLine(endAbsolute = 15) - |> angledLine(angle = 30, length = 15) + |> angledLine( + angle = 30, + length = 15, + ) |> line(end = [8, -10]) |> yLine(endAbsolute = 0) |> close() diff --git a/docs/kcl-std/angledLineThatIntersects.md b/docs/kcl-std/functions/std-sketch-angledLineThatIntersects.md similarity index 98% rename from docs/kcl-std/angledLineThatIntersects.md rename to docs/kcl-std/functions/std-sketch-angledLineThatIntersects.md index da07deddf..93a7d9f33 100644 --- a/docs/kcl-std/angledLineThatIntersects.md +++ b/docs/kcl-std/functions/std-sketch-angledLineThatIntersects.md @@ -10,10 +10,10 @@ Draw an angled line from the current origin, constructing a line segment such th ```kcl angledLineThatIntersects( @sketch: Sketch, - angle: number, - intersectTag: TagIdentifier, - offset?: number, - tag?: TagDeclarator, + angle: number(Angle), + intersectTag: tag, + offset?: number(Length), + tag?: tag, ): Sketch ``` @@ -24,10 +24,10 @@ angledLineThatIntersects( | Name | Type | Description | Required | |----------|------|-------------|----------| | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | -| `angle` | [`number`](/docs/kcl-std/types/std-types-number) | Which angle should the line be drawn at? | Yes | -| `intersectTag` | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The tag of the line to intersect with | Yes | -| `offset` | [`number`](/docs/kcl-std/types/std-types-number) | The offset from the intersecting line. Defaults to 0. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `angle` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | Which angle should the line be drawn at? | Yes | +| `intersectTag` | [`tag`](/docs/kcl-std/types/std-types-tag) | The tag of the line to intersect with. | Yes | +| `offset` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The offset from the intersecting line. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns @@ -42,7 +42,11 @@ exampleSketch = startSketchOn(XZ) |> line(endAbsolute = [5, 10]) |> line(endAbsolute = [-10, 10], tag = $lineToIntersect) |> line(endAbsolute = [0, 20]) - |> angledLineThatIntersects(angle = 80, intersectTag = lineToIntersect, offset = 10) + |> angledLineThatIntersects( + angle = 80, + intersectTag = lineToIntersect, + offset = 10, + ) |> close() example = extrude(exampleSketch, length = 10) diff --git a/docs/kcl-std/arc.md b/docs/kcl-std/functions/std-sketch-arc.md similarity index 99% rename from docs/kcl-std/arc.md rename to docs/kcl-std/functions/std-sketch-arc.md index 5d18f28fe..f1d4b176b 100644 --- a/docs/kcl-std/arc.md +++ b/docs/kcl-std/functions/std-sketch-arc.md @@ -10,30 +10,37 @@ Draw a curved line segment along an imaginary circle. ```kcl arc( @sketch: Sketch, - angleStart?: number, - angleEnd?: number, - radius?: number, + angleStart?: number(Angle), + angleEnd?: number(Angle), + radius?: number(Length), + diameter?: number(Length), interiorAbsolute?: Point2d, endAbsolute?: Point2d, - tag?: TagDeclarator, + tag?: tag, ): Sketch ``` -The arc is constructed such that the current position of the sketch is placed along an imaginary circle of the specified radius, at angleStart degrees. The resulting arc is the segment of the imaginary circle from that origin point to angleEnd, radius away from the center of the imaginary circle. +The arc is constructed such that the current position of the sketch is +placed along an imaginary circle of the specified radius, at angleStart +degrees. The resulting arc is the segment of the imaginary circle from +that origin point to angleEnd, radius away from the center of the imaginary +circle. -Unless this makes a lot of sense and feels like what you're looking for to construct your shape, you're likely looking for tangentialArc. +Unless this makes a lot of sense and feels like what you're looking +for to construct your shape, you're likely looking for tangentialArc. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | -| `angleStart` | [`number`](/docs/kcl-std/types/std-types-number) | Where along the circle should this arc start? | No | -| `angleEnd` | [`number`](/docs/kcl-std/types/std-types-number) | Where along the circle should this arc end? | No | -| `radius` | [`number`](/docs/kcl-std/types/std-types-number) | How large should the circle be? | No | -| `interiorAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd` | No | -| `endAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd` | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `angleStart` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | Where along the circle should this arc start? | No | +| `angleEnd` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | Where along the circle should this arc end? | No | +| `radius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | How large should the circle be? Incompatible with `diameter`. | No | +| `diameter` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | How large should the circle be? Incompatible with `radius`. | No | +| `interiorAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd`. | No | +| `endAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd`. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this arc. | No | ### Returns @@ -46,7 +53,11 @@ Unless this makes a lot of sense and feels like what you're looking for to const exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [10, 0]) - |> arc(angleStart = 0, angleEnd = 280, radius = 16) + |> arc( + angleStart = 0, + angleEnd = 280, + radius = 16 + ) |> close() example = extrude(exampleSketch, length = 10) ``` @@ -56,7 +67,10 @@ example = extrude(exampleSketch, length = 10) ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) - |> arc(endAbsolute = [10, 0], interiorAbsolute = [5, 5]) + |> arc( + endAbsolute = [10,0], + interiorAbsolute = [5,5] + ) |> close() example = extrude(exampleSketch, length = 10) ``` diff --git a/docs/kcl-std/functions/std-sketch-bezierCurve.md b/docs/kcl-std/functions/std-sketch-bezierCurve.md new file mode 100644 index 000000000..1707143ec --- /dev/null +++ b/docs/kcl-std/functions/std-sketch-bezierCurve.md @@ -0,0 +1,74 @@ +--- +title: "bezierCurve" +subtitle: "Function in std::sketch" +excerpt: "Draw a smooth, continuous, curved line segment from the current origin to the desired (x, y), using a number of control points to shape the curve's shape." +layout: manual +--- + +Draw a smooth, continuous, curved line segment from the current origin to the desired (x, y), using a number of control points to shape the curve's shape. + +```kcl +bezierCurve( + @sketch: Sketch, + control1?: Point2d, + control2?: Point2d, + end?: Point2d, + control1Absolute?: Point2d, + control2Absolute?: Point2d, + endAbsolute?: Point2d, + tag?: tag, +): Sketch +``` + + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `control1` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | First control point for the cubic. | No | +| `control2` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Second control point for the cubic. | No | +| `end` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | How far away (along the X and Y axes) should this line go? | No | +| `control1Absolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | First control point for the cubic. Absolute point. | No | +| `control2Absolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Second control point for the cubic. Absolute point. | No | +| `endAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Coordinate on the plane at which this line should end. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | + +### Returns + +[`Sketch`](/docs/kcl-std/types/std-types-Sketch) - A sketch is a collection of paths. + + +### Examples + +```kcl +// Example using relative control points. +exampleSketch = startSketchOn(XZ) + |> startProfile(at = [0, 0]) + |> line(end = [0, 10]) + |> bezierCurve( + control1 = [5, 0], + control2 = [5, 10], + end = [10, 10], + ) + |> line(endAbsolute = [10, 0]) + |> close() + +example = extrude(exampleSketch, length = 10) +``` + +![Rendered example of bezierCurve 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADNeElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVdd9b/CNddc82Ce6b777ruVq6666qqrrrrqqn8Zlauuuuqqq6666qqrrrrqv90111zzYIAzZ848+MVe7MVeC+Caa6558DXXXPPgM2fOPPiaa655MM/0W7/1W99933333fqjP/qjn8NVV1111VVXXXXVC0flqquuuuqqq6666qqrrvovcc011zz4tV/7td8L4JprrnnwNddc8+AzZ848+JprrnkwD7C7uwvA7u4uT3/607nvvvv4gz/4Ay5evMju7i7v+77v+97DMNz6D//wD7/zD//wD7/NVVddddVVV1111QuGHvSgB3HVVVddddVVV1111VVX/ee45pprHvzar/3a7/U6r/M6733NNdc8eHd3F4Dd3V1uvfVWAHZ3d9nd3WV3d5fd3V0AbPOCHD9+nI/5mI/hvvvuu/VDPuRDHsJVV1111VVXXXXVC4Ye9KAHcdVVV1111VVXXXXVVVf9x7nmmmse/Nqv/drv9Tqv8zrvfc011zx4d3eXv/7rv+YZz3gGt956Kw9kmxeFbR7opV/6pXmbt3kbfuu3fuu7v/7rv/59uOqqq6666qqrrnr+qFx11VVXXXXVVVddddVV/27XXHPNg1/7tV/7vV7ndV7nva+55poH7+7u8td//df80i/9ErfeeisviCSem22emyQe6K//+q95yEMewuu8zuu893333Xfrj/7oj34OV1111VVXXXXVVc8LPehBD+Kqq6666qqrrrrqqquu+te75pprHvzar/3a7/XiL/7ir/1iL/Zir727u8tf//Vfc+nSJf76r/+a/yi2eX6OHz/Oe7/3ezMMw61f//Vf/z7/8A//8NtcddVVV1111VVXPSf0oAc9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q7wKAPfccw/33HMPtnl+bPPcbPP82Oa52ea52ea52ea52ea52ea52ea52ea52QZgPp8DcPbs2Vu56qqrrrrqqqv+p6Ny1VVXXXXVVVddddVV/w7v9E7v9Fl//ud/ztOe9jT+I0gCQBIviCSemyReGEncTxL/EkncTxIAOzs7vNEbvRE333wzAM94xjO4cOECz802z49tnh/bPDfbPDfbPD+2eW62eW62eW62eSDbPDfbPNBsNgPgvvvuu5Wrrrrqqquuuup/OoKrrrrqqquuuuqqq676N3qd13md936xF3ux1/71X/91ACQBIAkASQBIAkASAJJ4UUni30oS/1F2dnZ4ozd6I26++WaGYeDJT34yFy5c4IFsY5vnZhvbPDfb2OaBbGOb52ab52Yb2zyQbWzzQLaxzQPZxjYPZJvnZpurrrrqqquuuup/NSpXXXXVVVddddVVV131b/SO7/iOn/Vrv/ZrXLx4kX8LSQBIAkASL4gknpsknpskXhhJ3E8S95PE/SRxP0ncdNNNvOM7viMAwzDwD//wDzyQbZ4f2zw/tnlutnl+bPPcbPPcbPPcbPPcbPPcbPPcbPPcbAMwm80AuO+++27lqquuuuqqq676n47KVVddddVVV1111VVX/Ru84zu+42ddc801D/61X/s1JPEfSRIviCSemySemyTuJ4l/qxd7sRfjjd7ojQA4ODjgyU9+MgC2eX5s8/zY5vmxzfNjm+dmm+dmm+fHNs/NNs/NNs/NNs/NNlddddVVV1111f9KVK666qqrrrrqqquuuurf4J3e6Z0++0d/9EeRBIAkACQBIAkASQBIAkASAJL4l0jiBZHEc5PECyOJ+0nifpK4nyTu98Zv/Ma82Iu9GAB3330399xzD7Z5fmzz/Njm+bHN82Ob52ab58c2z802z802z802z802z802z20+nwNw9uzZZ3DVVVddddVVV/1PR+Wqq6666qqrrrrqqqv+lT78wz/8u5761Kfy53/+50ji30MSAJJ4QSTxbyWJf62dnR3e+I3fmJtvvhmAJz3pSRwcHPD82Ob5sc3zY5vnxzbPzTbPj22em22em22em22em22em22eH9tcddVVV1111VX/qxBcddVVV1111VVXXXXVv8KLvdiLvfbrvM7rvPev/dqv8Z9BEi+IJJ6bJJ6bJF4YSdxPEveTxM7ODu/0Tu/E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c5PE/2W2+e8giefHNlf9x7DN/zS2+Y+yvb0NwH333XcrV1111VVXXXXV/wdUrrrqqquuuuqq/1d2dnZ45Vd+ZZ7b/v4+AHt7e+zv77O/vw/A/v4+e3t7ANx11128qGzz/Ejiqn8721z1H8M2/1PZ5j/Lzs4OAGfPnr2Vq6666qqrrrrq/wMqV1111VVXXXXV/wsv/uIv/toAT3jCE9jf3+fOO+8EYH9/n/39ff6r2OYFkcRVV/1Hss3/Brb5r7K9vQ3AfffddytXXXXVVVddddX/B1Suuuqqq6666qr/F+67775bX+zFXow777yTJz7xifxPZJsXRhJXXfXcbPO/iW3+O9nmqquuuuqqq676f4XKVVddddVVV131/8J99913K8D29ja2eW6S+J/ONv8SSVz1f4dt/jezzX8321x11VVXXXXVVf+vUbnqqquuuuqqq64CbPPcJPG/jW1eFJK46r+Pbf6vsc3/BLZ5YXZ2dgC47777buWqq6666qqrrvr/gMpVV1111VVXXfX/wtmzZ58BsLOzw4vKNs+PJP63s82/liSuel62+f/ENv+T2OZfY3t7G4CzZ88+g6uuuuqqq6666v8DKlddddVVV1111VX/SrZ5bpL4v842/xkk8V/BNlf969jmfxrbXHXVVVddddVVV/0rULnqqquuuuqqq/5fuO+++24F2N7e5j+DbV4QSVz1gtnmqv8+tvmfzDb/kXZ2dgC47777buWqq6666qqrrvr/gMpVV1111VVXXXXVfzLbvCCSuOqq/wq2+d/ANv+Ztre3ATh79uytXHXVVVddddVV/x9Queqqq6666qqr/l84e/bsrQA7Ozv8T2KbF0QSV131orLN/za2ueqqq6666qqrrvpPRuWqq6666qqrrvp/xTb/W9jmhZHEVf9/2OZ/M9tcddVVV1111VVX/TegctVVV1111VVX/b9w33333Qqws7ODbZ6bJP63sc2LQhJX/c9mm/9LbPM/jW0AdnZ2ALjvvvtu5aqrrrrqqquu+v+A4Kqrrrrqqquu+n/jvvvuuxVge3ub52Yb29jGNraxzf8FtrGNbWxjG9vYxja2sY1tbHPVv59tbGMb29jGNraxjW1sYxvb/G9mG9vYxja2+Z/ANraxjW2uuuqqq6666qr/t6hcddVVV1111VVXvRC2eX4k8X+Vbf69JPG/lW2uel62+Z/MNv+S7e1tAO67775bueqqq6666qqr/r+gctVVV1111VVX/b9x9uzZW6+55poH7+zssL+/z7+HbZ4fSVwFtrnqfyfb/G9gm3+tnZ0dAM6ePXsrV1111VVXXXXV/xdUrrrqqquuuuqqq/4D2eYFkcRVV/1PYZv/TWzz77WzswPAfffddytXXXXVVVddddX/FwRXXXXVVVddddX/G/fdd9+tANvb2/x3sI1tbGMb29jGNldd9Z/BNraxjW1sYxvb/E9mG9vYxja2ueqqq6666qqrrvo3onLVVVddddVVV/2/cd99990KsLOzw/80tnlhJHHVVc/NNv8X2Oaqq6666qqrrrrqPwmVq6666qqrrrrqqv8FbPMvkcRV/3fY5v8i2/x32d7eBuC+++67lauuuuqqq6666v8LKlddddVVV1111f8729vb2AZAEv9X2OZFIYmr/nvY5v8T2/xPsrOzA8DZs2efwVVXXXXVVVdd9f8Flauuuuqqq6666v+Ns2fPPoPnYpvnJon/y2zzbyGJq57NNlddYZv/iWxz1VVXXXXVVVf9v0flqquuuuqqq676f+O+++67FWBnZ4cXxjbPjyT+P7PNfxdJPD+2ueq/lm3+p7LNC7O9vQ3AfffddytXXXXVVVddddX/F1Suuuqqq6666qqrXkS2eX4kcdV/Lttc9V/LNv+T2eZfa2dnB4CzZ8/eylVXXXXVVVdd9f8Flauuuuqqq6666v+Ns2fP3gqws7PDfyTbvCCSuOqq/6ls87+Fba666qqrrrrqqqv+DahcddVVV1111VVX/SeyzQsiiauu+s9mm/9tbHPVVVddddVVV131H4TKVVddddVVV131/8Z99913K8D29jb/E9jmhZHEVVf9S2zzv51t/ivs7OwAcN99993KVVddddVVV131/wXBVVddddVVV131/8p99913K8DOzg7/09nGNraxjW1sYxvb2Oaq//tsYxvb2MY2trGNbf63sY1tbGMb21x11VVXXXXVVVf9J6Jy1VVXXXXVVVf9v2Sb/wts86KQxFX/c9jm/wPb/E+xs7MDwH333XcrV1111VVXXXXV/ycEV1111VVXXXXV/ytnz569FWB7exvb2MY2trHN/1W2sY1tbGMb29jGNraxjW1sY5urXjS2sY1tbGMb29jGNraxjW1sY5v/a2xjG9vYxja2+Z/ANrbZ3t4G4OzZs7dy1VVXXXXVVVf9f0Llqquuuuqqq6666gFs8/xI4v8b2/xnkcR/Ndtc9e9jm//pbPP87OzsAHDffffdylVXXXXVVVdd9f8JwVVXXXXVVVdd9f/KfffddyvAzs4O/xq2sY1tbGMb21z1b2Mb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNra56kVnG9vYxja2sc3/NLaxjW1sY5urrrrqqquuuuqq50Llqquuuuqqq676f+W+++67FWBnZ4f/CLZ5QSRx1VX/k9nmfxPbXHXVVVddddVVV/0rUbnqqquuuuqqq676T2KbF0YSV131n8k2/1vZ5j/S9vY2APfdd9+tXHXVVVddddVV/59Queqqq6666qqr/l/a2dnhv5ttXhhJXHXVC2Ob/yts859pZ2cHgLNnzz6Dq6666qqrrrrq/xMqV1111VVXXXXV/ytnz559Bv9L2OZfIomr/m+yzf9Vtrnqqquuuuqqq676L0Llqquuuuqqq676f+W+++67FWB7e5v/C2zzopLEVf/9bPP/hW3+p9jZ2QHgvvvuu5Wrrrrqqquuuur/EypXXXXVVVddddX/W7a5nyT+r7PNv4Ukrnpetrnq2WzzP9nOzg4AZ8+evZWrrrrqqquuuur/EypXXXXVVVddddX/K2fPnr0VYGdnhweyzfMjif/vbPNfSRL/Fra56j+fbf43sM1VV1111VVXXXUVQOWqq6666qqrrrrqhbDNCyKJq/7j2eaq/362+d/CNlddddVVV1111VUvAJWrrrrqqquuuur/lfvuu+9WgJ2dHf69bPP8SOKqq/43sM3/Rrb519rZ2QHgvvvuu5Wrrrrqqquuuur/E4Krrrrqqquuuur/nfvuu+9WgJ2dHf4z2MY2trGNbWxjG9tcddV/JdvYxja2sY1tbPO/gW1sYxvb2Oaqq6666qqrrrrqX4HKVVddddVVV1111X8x27wwkrjqqheVbf6vsM1/hp2dHQDOnj37DK666qqrrrrqqv9vCK666qqrrrrqqv937rvvvlsBdnZ2+J/INraxjW1sYxvb2MY2V/3/YBvb2MY2trGNbWxjm/+tbGMb29jGNv9ZdnZ2ALjvvvtu5aqrrrrqqquu+v+GylVXXXXVVVddddX/QrZ5UUniqv85bPP/jW3+O+3s7ABw33333cpVV1111VVXXfX/DZWrrrrqqquuuur/nbNnz94KsLOzw/8Htvm3kMRVL5htrnpetrnqqquuuuqqq676H4TKVVddddVVV131/8599913K8D29ja2eW6SuAps819FEv9RbHPVfz7b/G9gG9tcddVVV1111VX/b1G56qqrrrrqqquuei62eUEkcdV/PNtc9T+Tbf43sc1z29nZAeC+++57OlddddVVV1111f83VK666qqrrrrqqv+3dnZ2+NeyzQsiiauu+t/INv8b2eZFcezYMQDOnj37DK666qqrrrrqqv9vqFx11VVXXXXVVf/vnD179lb+E9jmBZHEVVf9d7LN/3a2ueqqq6666qqrrvpXonLVVVddddVVV/2/c999990KsLOzw38V27wwkrjqqn8P2/xfYpv/KDs7OwCcPXv2Vq666qqrrrrqqv9vqFx11VVXXXXVVVf9D2Cbf4kkrvr/yTb/l9nmP9POzg4A9913361cddVVV1111VX/31C56qqrrrrqqqv+37nvvvtuBdjZ2eF/E9u8qCRx1f9stvn/yDZXXXXVVVddddVV/4WoXHXVVVddddVVV/0fZJt/LUlc9W9jm6uek22uuuqqq6666qqr/gegctVVV1111VVX/b9z9uzZZwDs7OxgGwBJ/H9nm/9okvifxjZX/ceyzf9kOzs7ANx33323ctVVV1111VVX/X9DcNVVV1111VVX/b9033333Qqws7MDgG1sYxvb2MY2V/372MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1trvq3s41tbGMb29jmfyrb2Oaqq6666qqrrvp/jcpVV1111VVXXXXVC2Gb50cSV131f5Ft/reyzXPb2dkB4L777ruVq6666qqrrrrq/yOCq6666qqrrrrq/6WzZ8/eCrCzs8O/hW1sYxvb2MY2trHNVVf9T2Yb29jGNraxjW3+t7CNbWxjG9s8Pzs7OwCcPXv2Vq666qqrrrrqqv+PqFx11VVXXXXVVVf9J7DNCyOJq676z2Kb/0ts82917NgxAO67775bueqqq6666qqr/j8iuOqqq6666qqr/l+67777bgXY2dnhv4NtbGMb29jGNraxzVVXvTC2sY1tbGMb29jGNv/b2cY2trHNVVddddVVV1111b8Dlauuuuqqq6666v+l++67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VVddddVV/6+dPXv2VoBjx47xn8E2LwpJXHXVi8o2/x/Z5l/r7Nmzt3LVVVddddVVV/1/RuWqq6666qqrrrrqfwDbvCgkcdX/Xba56grbXHXVVVddddVVV/0HoHLVVVddddVVV/2/dt99990KsLOzw/8GtvnXksRV//Vsc9W/zDb/GY4dOwbAfffddytXXXXVVVddddX/ZwRXXXXVVVddddX/e/fdd9+tAMeOHeP/ItvYxja2sY1tbGMb29jGNraxjW1sYxvb2Ob/C9vYxja2sY1tbGMb29jGNraxjW1sYxvb2Oaq52Ub29jGNra56qqrrrrqqquu+k9G5aqrrrrqqquuuuqqF4ltrrrqRWGb/07Hjh0D4L777ruVq6666qqrrrrq/zuCq6666qqrrrrq/72zZ8/eCrCzs8NVV131orGNbWxjG9vYxjb/3XZ2dgA4e/bsrVx11VVXXXXVVf/fUbnqqquuuuqqq656JtvYBkASV131/51t/jc6duwYAPfdd9+tXHXVVVddddVV/98RXHXVVVddddVV/+/dd999twIcO3aM+9nGNraxjW1sYxvbXHXV/xW2sY1tbGMb29jmqquuuuqqq6666v8AKlddddVVV1111f979913360Ax44d40VlmxdGEldd9T+Bbf6/sM1VV1111VVXXXXVc6Fy1VVXXXXVVVdd9Z/ANv8SSVx11b+Hbf4/ss0Ls7OzA8B99913K1ddddVVV1111f93VK666qqrrrrqqque6dixY/xXss2LShJX/f9gm6uezTb/WseOHQPg7Nmzz+Cqq6666qqrrvr/jspVV1111VVXXfX/3tmzZ5/B/3C2+deSxFX//Wxz1YvGNlddddVVV1111VX/wahcddVVV1111VX/79133323Auzs7PB/iW3+vSTx/5VtrvrPYZv/TMeOHQPgvvvuu5Wrrrrqqquuuur/OypXXXXVVVddddVVV71Atrnqqn8r2/x3OHbsGFddddVVV1111VXPROWqq6666qqrrvp/7+zZs7cCHDt2jKuuuupfxzb/U509e/ZWrrrqqquuuuqq/++oXHXVVVddddVVV1111VX/IttcddVVV1111VVX/S9E5aqrrrrqqquu+n/vvvvuuxXg2LFj2OYFkcRVV/1fZZv/K44dOwbAfffddytXXXXVVVddddX/dwRXXXXVVVddddVVwH333XcrwLFjx3hBbGMb29jGNraxjW2uuup/MtvYxja2sY1tbGObq6666qqrrrrqqv+jqFx11VVXXXXVVVf9B7HNv0QSV131H802/1/Z5oGOHTsGwNmzZ5/BVVddddVVV111FRBcddVVV1111VVXAffdd9+tAMeOHeM/k21sYxvb2MY2trGNbWxz1VUAtrGNbWxjG9vYxja2sc3/F7axjW1sY5vnduzYMQDuu+++W7nqqquuuuqqq64CKlddddVVV1111VX/A9nmX0sSV/3PZpurXjS2+bc4duwYAPfdd9+tXHXVVVddddVVVwGVq6666qqrrrrqKuDs2bO3Ahw7doz/rWzz7yGJq14421z1H8s2V1111VVXXXXVVf+JqFx11VVXXXXVVVcB9913360AOzs7/H9lm6uu+s9im6uuuuqqq6666qr/BlSuuuqqq6666qqrrrrqqv8wtvnvdOzYMQDuu+++p3PVVVddddVVV10FVK666qqrrrrqqquuuuqqfxXb/E917NgxAM6ePfsMrrrqqquuuuqqq4DKVVddddVVV111FXD27NlbAY4dO4ZtJHHVVf+f2eaqq6666qqrrrrq/wAqV1111VVXXXXVVcB99913K8CxY8cAsM0LI4mrrvrfzDb/Fx07dgyAs2fP3spVV1111VVXXXUVULnqqquuuuqqq676N7DNv0QSV13138E2/18dO3aMq6666qqrrrrqqgegctVVV1111VVXXQXcd999twIcO3aM/yi2eVFI4qqrXhS2uerZbPOC3Hfffbdy1VVXXXXVVVddBVSuuuqqq6666qqr/pvZ5l9DElf932Gbq14421x11VVXXXXVVVf9G1G56qqrrrrqqquuAs6ePfsMgGPHjvE/nW3+LSRx1X8O21z1H8M2/x7Hjh0D4L777ruVq6666qqrrrrqKiC46qqrrrrqqquueqb77rvvVoBjx47xf5FtbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2+d/CNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGObq/71bGMb29jGNra56qqrrrrqqquu+g9G5aqrrrrqqquuuuqqfzfbXHXVc7PNf6Vjx44BcN99993KVVddddVVV1111RUEV1111VVXXXXVVc909uzZWwGOHTvGVVdd9aKzjW1sYxvb2Oa/2rFjxwA4e/bsrVx11VVXXXXVVVddQeWqq6666qqrrrrqqquu+hfZ5n+6Y8eOAXDffffdylVXXXXVVVddddUVBFddddVVV1111VXPdN99990KsLOzg21sY5urrvr/wDa2sY1tbGMb29jmqquuuuqqq6666n8pKlddddVVV1111VXPdN99990KcOzYMR7INv8SSVx11f9ktrnqqquuuuqqq676f4jKVVddddVVV1111X8A2/xLJHHVVf/RbHPVFceOHQPgvvvuu5WrrrrqqquuuuqqK6hcddVVV1111VVX/RexzYtKElf9/2abq14w2zy3Y8eOAXD27NlncNVVV1111VVXXXUFlauuuuqqq6666qpnOnv27DMAjh8/zn832/xrSeKq/5lsc9W/jW2uuuqqq6666qqr/h2oXHXVVVddddVVVz3TfffddyvAsWPH+N/INv8RJHHVFba56r+Gbf69jh07BsB99913K1ddddVVV1111VVXULnqqquuuuqqq6666jnY5qqr/rPY5qqrrrrqqquuuuq/EJWrrrrqqquuuuqqZzp79uytAMeOHeOqq67697HNf7Xjx48DcPbs2Vu56qqrrrrqqquuuoLKVVddddVVV1111VVXXfVvYpurrrrqqquuuuqq/+GoXHXVVVddddVVVz3TfffddyvAsWPHuOqqq8A2/5scO3YMgPvuu+9Wrrrqqquuuuqqq64guOqqq6666qqrrnqA++6771aAnZ0dbGMb29jmqqv+r7GNbWxjG9vYxja2ueqqq6666qqrrvo/gMpVV1111VVXXXXVi8g2/xJJXHXV/xS2+f/i2LFjANx33323ctVVV1111VVXXfVsBFddddVVV1111VUPcPbs2VsBjh07xr+FbWxjG9vYxja2sY1tbHPVVf8etrGNbWxjG9vYxja2sc3/J8eOHQPg7Nmzt3LVVVddddVVV131bFSuuuqqq6666qqr/hvY5l9DElf932Wbq150tnlux44dA+C+++67lauuuuqqq6666qpnI7jqqquuuuqqq656gPvuu+9WgOPHj/M/iW1sYxvb2MY2trGNbWxjG9vYxja2ueq/jm1sYxvb2MY2trGNbWxjG9vYxjZXPX+2sY1tbGMb21x11VVXXXXVVVf9K1C56qqrrrrqqquueoD77rvvVoBjx47xf4Vt/jNI4n8r21z1P4dtrrrqqquuuuqqq/6TULnqqquuuuqqq6666t/ENldd9a9hm/8sx44dA+C+++67lauuuuqqq6666qpno3LVVVddddVVV1111VVX/YeyzX+148ePA3D27NlncNVVV1111VVXXfVsVK666qqrrrrqqqse4OzZs88AOHbsGFddddXzZ5urrrrqqquuuuqq/yWoXHXVVVddddVVVz3AfffddyvAsWPHuOqq/89s87/JsWPHALjvvvtu5aqrrrrqqquuuurZqFx11VVXXXXVVVe9ALZ5bpK46qr/7Wxz1VVXXXXVVVdd9f8Elauuuuqqq6666qoHOHv27K0Ax48f5/mxzYtCEldd9d/BNv8fHT9+HICzZ8/eylVXXXXVVVddddWzUbnqqquuuuqqq676T2CbF4UkrrrqRWGbq6666qqrrrrqqqv+1ahcddVVV1111VVXPcB99913K8CxY8f4r2Cbfy1JXPW/n22u+rexzXM7duwYAPfdd9+tXHXVVVddddVVVz0bwVVXXXXVVVddddVzue+++24FOH78OP8T2cY2trGNbWxjG9vYxja2sY1tbGMb21z1H8M2trGNbWxjG9vYxja2sY1tbGMb29jmqn+ZbWxjG9vYxjZXXXXVVVddddVV/wpUrrrqqquuuuqqq/6fsc1/F0n8R7HNVf832Obf49ixYwDcd999t3LVVVddddVVV131nAiuuuqqq6666qqrnsvZs2dvBTh27BhX/ceyjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbHPV/z62sY1tbGMb2/x7HT9+HICzZ8/eylVXXXXVVVddddVzonLVVVddddVVV1111VVX/YexzX+1Y8eOAXDffffdylVXXXXVVVddddVzIrjqqquuuuqqq656Lvfdd9+tAMeOHeOqq656XraxjW1sYxvb2Oaqq6666qqrrrrqfxgqV1111VVXXXXVVc/lvvvuuxXg2LFjXHXV/0e2ueqqq6666qqrrvo/gspVV1111VVXXXXVC2Gb5yaJq67638o2/9ccP34cgPvuu+9Wrrrqqquuuuqqq54Tlauuuuqqq6666qp/Jdu8KCRx1VX/lWzz/9GxY8cAOHv27DO46qqrrrrqqquuek5Urrrqqquuuuqqq57L2bNnnwFw/Phx/j1s86KSxFVXPT+2ueqqq6666qqrrrrq34zKVVddddVVV1111XO57777bgU4duwY/1Vs868liav+d7HNVf/xjh8/DsB99913K1ddddVVV1111VXPicpVV1111VVXXXXV/1K2+feSxFUvGttc9d/PNs/NNlddddVVV1111VUvAJWrrrrqqquuuuqq53L27NlbAY4fP87/dba56qr/iWzzojp+/DgAZ8+evZWrrrrqqquuuuqq50Tlqquuuuqqq6666qqrrvpvYZurrrrqqquuuuqq/2RUrrrqqquuuuqqq57LfffddyvAsWPHuOqqq/79bPOf6fjx4wDcd999t3LVVVddddVVV131nAiuuuqqq6666qqrno/77rvvVoDjx49z1VVX/ctsYxvb2MY2trHNVVddddVVV1111X8jKlddddVVV1111VVXXXXVv8g2/xMdP34cgPvuu+9Wrrrqqquuuuqqq54XwVVXXXXVVVddddXzcfbs2VsBjh07xlVX/X9gG9vYxja2sY1tbPM/1bFjxwA4e/bsrVx11VVXXXXVVVc9LypXXXXVVVddddVVL4RtbPOCSOKqq/6ns83/VcePHwfgvvvuu5Wrrrrqqquuuuqq50Vw1VVXXXXVVVdd9Xzcd999twIcP36cF8Y2trGNbWxjG9vYxja2ueqq/wy2sY1tbGMb29jGNraxzVVXXXXVVVddddX/Y1Suuuqqq6666qqrno/77rvvVoBjx47xH8E2/xqSuOr/H9tcddVVV1111VVXXfUfispVV1111VVXXXXV/0C2+beSxFX/fWxz1X8u29zv2LFjANx33323ctVVV1111VVXXfW8qFx11VVXXXXVVVf9H2Ob/yyS+L/CNlf9z2abf8nx48cBOHv27DO46qqrrrrqqquuel5Urrrqqquuuuqqq56Ps2fPPgPg+PHjXPVstrnqqv9otrnqqquuuuqqq676T0Llqquuuuqqq6666vm47777bgU4fvw4V1111b+fbf4zHDt2DID77rvvVq666qqrrrrqqqueF5Wrrrrqqquuuuqqq6666j+Eba666qqrrrrqqqv+h6Fy1VVXXXXVVVdd9XycPXv2VoBjx45x1VVXXWGb/2mOHz8OwNmzZ2/lqquuuuqqq6666nlRueqqq6666qqrrrrqqqsus81VV1111VVXXXXV/zFUrrrqqquuuuqqq56P++6771aA48ePY5vnRxJXXfW/gW3+rzp+/DgA9913361cddVVV1111VVXPS+Cq6666qqrrrrqqhfgvvvuuxXg+PHjPD+2sY1tbGMb29jGNraxzVVX/WexjW1sYxvb2MY2trGNba666qqrrrrqqqv+H6Ny1VVXXXXVVVdd9Z/MNv8akrjq/yfbXPWiO378OABnz559BlddddVVV1111VXPH8FVV1111VVXXXXVC3DffffdCnDs2DH+K9nGNraxjW1sYxvb2MY2trGNbWxjm6v++9nGNraxjW1sYxvb2MY2trGNbWxjm6v+dY4dOwbAfffddytXXXXVVVddddVVzx+Vq6666qqrrrrqqv9DbPOfRRL/l9jmqv8dbPP8HD9+HID77rvvVq666qqrrrrqqquePypXXXXVVVddddVVL8DZs2dvBTh+/DjPeMYz+P/ONldd9Z/FNlddddVVV1111VX/CahcddVVV1111VVX/QuOHz/OVVdd9R/DNlddddVVV1111VX/hahcddVVV1111VVXvQD33XffrVx11VX/Krb5r3Ls2DEA7rvvvqdz1VVXXXXVVVdd9fxRueqqq6666qqrrrrqqqv+VWzzP8Hx48cBOHv27DO46qqrrrrqqquuev6oXHXVVVddddVVV70AZ8+evRXg+PHjXHXV/xe2ueqqq6666qqrrvo/hMpVV1111VVXXXXVC3DffffdCnDs2DFsAyCJq67638o2/5ccP36cq6666qqrrrrqqn8Blauuuuqqq6666qp/Bdu8qCRx1VX/FWzz/9nZs2dv5aqrrrrqqquuuur5o3LVVVddddVVV131Atx33323Ahw/fpx/C9v8a0jiqqsAbHPVv+z48eMA3Hfffbdy1VVXXXXVVVdd9fxRueqqq6666qqrrvofwjb/FpK46n8m21x11VVXXXXVVVdd9d+KylVXXXXVVVddddULcPbs2WcAHD9+nP/JbPOfQRL/n9jmqv/ZbPNAx48fB+C+++67lauuuuqqq6666qrnj8pVV1111VVXXXXVi+D48ePs7u7y/4ltrrrqv4Ntrrrqqquuuuqqq/6DEFx11VVXXXXVVVe9EPfdd9+tXHXVVf/hbGMb29jGNraxzYvi+PHjANx33323ctVVV1111VVXXfWCEVx11VVXXXXVVVe9EGfPnr0V4Pjx41x11VX/OraxjW1sYxvb2Obf6/jx4wCcPXv2Vq666qqrrrrqqqteMCpXXXXVVVddddVVV1111b+Jbf67HD9+nKuuuuqqq6666qoXAcFVV1111VVXXXXVC3HffffdCnD8+HGuuur/G9vYxja2sY1tbGOb/wnuu+++W7nqqquuuuqqq656wahcddVVV1111VVXvQiOHTvGVVf9X2Kbq6666qqrrrrqqv8HqFx11VVXXXXVVVe9EPfdd9+tPJNtXhhJXHXVfzfb/H9w/PhxAO67775bueqqq6666qqrrnrBqFx11VVXXXXVVVf9B7HNv4YkrrrqX2Kbq57X8ePHATh79uwzuOqqq6666qqrrnrBqFx11VVXXXXVVVe9EGfPnn0GwIMf/GBe+qVfmv8JJHHV/z62ueo/zvHjx7nqqquuuuqqq656EVC56qqrrrrqqquueiHuu+++W3/rt37ru1/ndV7nvR/84Adz1VVX/c/xD//wD79933333cpVV1111VVXXXXVC0blqquuuuqqq6666oX4h3/4h9/mqquu+h/pR3/0Rz/nvvvuu5WrrrrqqquuuuqqFww96EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+EeoGfPPfV0XrwAAAABJRU5ErkJggg==) + +```kcl +// Example using absolute control points. +startSketchOn(XY) + |> startProfile(at = [300, 300]) + |> bezierCurve(control1Absolute = [600, 300], control2Absolute = [-300, -100], endAbsolute = [600, 600]) + |> close() + |> extrude(length = 10) +``` + +![Rendered example of bezierCurve 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABrN0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/inL8+HGuuuqqq6666qqrrrrqqqv+t3qxF3ux136d13md9wJ09uzZW7nqqquuuuqqqx4IPehBD+Kqq6666qqrrrrqqquuuup/i2uuuebBr/3ar/1e11xzzYNf53Ve570Bzp07R2be+qM/+qOf81u/9VvfzVVXXXXVVVdddT8qV1111VVXXXXVVVddddVV/8Ndc801D37t137t97rmmmse/Dqv8zrvzTOdO3eO06dPc+HCBR75yEc+mKuuuuqqq6666rlRueqqq6666qqrrrrqqquu+h/ommuuefBrv/Zrv9c111zz4Nd5ndd5bx7gD//wD3nUox7Fn/zJn/CLv/iLvNIrvRKPfOQj+Yd/+Iff5qqrrrrqqquueiAqV1111VVXXXXVVVddddVV/0Ncc801D37t137t93rxF3/x136xF3ux1+YBzp8/zx/8wR/waq/2aly8eJHP/MzPBODkyZM84hGP4Kqrrrrqqquuer6oXHXVVVddddVVV1111VVX/Te65pprHvzar/3a7/XiL/7ir/NiL/Zir8VzOX/+PKdOneLChQs87WlP41d+5VcAeOVXfmXe9E3flFOnTgHwmZ/5ma9z33333cpVV1111VVXXfVAVK666qqrrrrqqquuuuqqq/6LXXPNNQ9+7dd+7fd68Rd/8dd+sRd7sdcGOH/+PADnz5/n1KlTnD9/HoA/+ZM/4Y//+I85f/48p06d4k3f9E155Vd+ZVprnDp1ivvuu+/WH/3RH/3sf/iHf/htrrrqqquuuuqq50blqquuuuqqq6666qqrrrrqv8A111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bYDz58/zh3/4h5w/f563eIu3AOAP//APedVXfVX+5E/+hF/8xV8E4OTJk7zpm74pb/Zmb8b9fuRHfuSzf/u3f/t77rvvvlu56qqrrrrqqqteEPSgBz2Iq6666qqrrrrqqquuuuqq/wzXXHPNg1/7tV/7vV78xV/8tV/sxV7stQHOnz/PH/7hH/KHf/iHvOqrvipv8RZvwfnz5/nDP/xDXvVVX5Vf+qVf4o//+I8BOHnyJK/8yq/Mm77pmwJw33333fpbv/Vb3/2jP/qjn8NVV1111VVXXfWiQA960IO46qqrrrrqqquuuuqqq676j3LNNdc8+LVf+7Xf65prrnnw67zO67w3wPnz5/nDP/xDfu7nfo5XfdVX5S3e4i04deoU58+f59SpU/ziL/4if/Inf8L58+cBeOVXfmXe5E3ehFOnTgFw33333fpbv/Vb3/2jP/qjn8NVV1111VVXXfWvgR70oAdx1VVXXXXVVVddddVVV13173HNNdc8+LVf+7Xf65prrnnI67zO67wXwPnz5/nDP/xDfv7nf55Tp07xKq/yKrzqq74qp06d4vz580jij//4j/mlX/olAE6cOMErv/Ir80qv9Eq01rjmmmu47777bv3RH/3Rz/mt3/qt7+aqq6666qqrrvq3QA960IO46qqrrrrqqquuuuqqq67617rmmmse/Nqv/drvdc011zz4dV7ndd4b4Pz58/zhH/4hP//zPw/AqVOneJVXeRXe4i3eAoCf+7mf49Ve7dX44z/+Y37pl34JgJMnT/JKr/RKvOmbvin3+5Ef+ZHP/u3f/u3vue+++27lqquuuuqqq67696By1VVXXXXVVVddddVVV131r/BiL/Zir/1iL/Zir/VO7/ROnw1w/vx5fu7nfo6f//mf536nTp3iLd7iLXiVV3kVzp8/D8CFCxfY29vjsz7rswA4efIkb/qmb8orvdIrAXDffffd+lu/9Vvf/aM/+qOfw1VXXXXVVVdd9R+FylVXXXXVVVddddVVV1111b/gxV7sxV77xV7sxV7rnd7pnT4b4Pz58/zcz/0cP//zP88Dvfmbvzmv+qqvyqlTpzh//jwAf/qnf8qf/MmfcOHCBQBe6ZVeiTd90zfl5MmTANx33323/tZv/dZ3/+iP/ujncNVVV1111VVX/UdDD3rQg7jqqquuuuqqq6666qqrrnpu11xzzYNf+7Vf+73e6Z3e6bMBzp8/zx/90R/x8z//8zzQqVOneJVXeRXe/M3fHIA/+qM/4lGPehR/8id/wi/90i8BcPLkSV7plV6JN3mTN+G+++7jmmuu4b777rv1R3/0Rz/nt37rt76bq6666qqrrrrqPwt60IMexFVXXXXVVVddddVVV111FcA111zz4Nd+7dd+r3d6p3f6bIDz58/zR3/0R/zRH/0R58+f54FOnTrFq7zKq/Dmb/7mnD9/nj/6oz/iVV/1VfmTP/kTfumXfgmAkydP8kqv9Eq8yZu8Cff7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80Zv9EZcuHCB1hp/93d/dytXXXXVVVddddVV/zmoXHXVVVddddVVV1111X+iF3uxF3vtD//wD/+ua6655sG/+qu/yq/92q8BIIl/iW3+K0niBbHNv8fJkyd5+Zd/ed7ojd6ICxcuAPBHf/RH/ORP/iRv8AZv8GCuuuqqq6666qqr/nNQueqqq6666qqrrrrqqv8E11xzzYPf8R3f8bNf53Ve570uXrzIN3/zN/PUpz6Vfw1J/Ets819BEi+IbV6QkydP8vIv//K80Ru9EQC/8iu/wiu+4ivyuZ/7udx9992cOnWKl3iJl3jwj/3Yj3HVVVddddVVV131n4DKVVddddVVV1111VVX/Qd7ndd5nff+8A//8O+6ePEiP/IjP8Kf//mf859FEi+Mbf6zSeKBTpw4wSu8wivwsIc9jIc97GFcuHABgIsXL3Lbbbfx67/+64zjyKlTp3j3d3937r777lu56qqrrrrqqquu+s+BHvSgB3HVVVddddVVV1111VX/Ea655poHf/iHf/h3vdiLvdhrP/WpT+VbvuVbeEFs8z+Bbf6jPOxhD+PlX/7leYVXeAUAnvrUp3Lq1Cn+6q/+ir/8y7/kwoULtNZorfF6r/d6vPEbvzH33XffrR/yIR/yEK666qqrrrrqqqv+c1C56qqrrrrqqquuuuqq/wAv9mIv9tqf+7mf+1sXL17km7/5m3na057GCyOJf4lt/rNJ4gWxzQtz4sQJXuEVXoETJ07wCq/wCgBcuHABgGc84xnccccdfP/3fz+ZSWYC8Pqv//q83Mu9HCdOnOAf/uEffvszP/MzX4errrrqqquuuuqq/zxUrrrqqquuuuqqq6666t/pHd/xHT/rnd7pnT77qU99Kt/yLd/CfxRJvDC2+c8kied24sQJXv7lX56HP/zhPPShDwXgwoULAFy6dIl/+Id/4Hd/93exTWYCcPz4cV7qpV6K133d1wXgvvvuu/VHfuRHvvtHf/RHP4errrrqqquuuuqq/1xUrrrqqquuuuqqq6666t/hwz/8w7/rdV7ndd77L/7iL/jRH/1RJGGb/wqSeGFs8+914sQJXv7lXx6AN3zDNwTg4sWLPPWpT+WhD30oly5d4nGPexy///u/j21sc78HPehBvPRLvzQv9VIvBcB9991362/91m9994/+6I9+DlddddVVV1111VX/NdCDHvQgrrrqqquuuuqqq6666t/iwz/8w7/rdV7ndd77L/7iL/jRH/1R/jVs89/JNs/PiRMneNjDHsaJEyd4hVd4BU6cOMHFixcBOHHiBHt7e/z93/89ly5d4u///u+xjW1sY5udnR1uueUW3uIt3oLz589z6tQp7rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqquu+q9F5aqrrrrqqquuuuqqq/4Nrrnmmge/9Eu/9Hv/2q/9Gr/+67/Ov5Yk/iW2+c8iCYATJ07w8i//8gC8/Mu/PCdOnADg4sWLnDhxgr29PQ4PD/mHf/gHbr/9di5duoRt7nfs2DFuvvlmbr75Zl7iJV6CB/r1X//1z/6Hf/iH3/6Hf/iH3+Gqq6666qqrrrrqvweVq6666qqrrrrqqquu+jf4nM/5nN+6ePEiv/7rv85/Fkm8MLb51zhx4gQnTpzgYQ97GA996EN52MMexv0uXrzIiRMn2NvbY29vjzvvvJM77riD22+/HQDb2AZgZ2eHF3/xF+fmm2/m5ptv5oHuu+++W3/0R3/0c37rt37ru7nqqquuuuqqq67670flqquuuuqqq6666qqr/pVe53Ve572uueaaB99+++1I4vmxzX82Sbwgx48f58SJEzzsYQ/joQ99KA972MO438WLF/nzP/9zHvawh7G/v8+dd97J3t4ed955J3fccQe2AbANwM7ODtvb29x000282Iu9GDs7OzzQfffdd+uP/uiPfs5v/dZvfTdXXXXVVVddddVV/7NQueqqq6666qqrrrrqqn+lM2fOPJh/gST+Jbb59zpx4gQnTpzgoQ99KAAPe9jDeOhDH8r9Ll68yNOe9jQA9vf32d/f56677uLo6Ihv+qZvwja2AbANgCS2t7d59KMfzU033cRNN93EA9133323/tZv/dZ3A/zoj/7o53DVVVddddVVV131Pxd60IMexFVXXXXVVVddddVVV/1rfdmXfZlPnDjBX/zFX/Drv/7r/GewDcCJEycAeOhDH8qJEyc4efIkJ06c4KEPfSj3u3jxIhcvXuShD30oAAcHB+zv73P33Xezv7/PE5/4RABsYxsA29hma2sLgEc/+tHceOON3HjjjQBcuHCBkydPAnDffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddX/DuhBD3oQV1111VVXXXXVVVdd9a/1vu/7vk9/qZd6qQffdNNNXLx4kac97Wk87WlP4+LFiwBcvHiRixcv8oKcOHGC+504cYITJ05w4sQJAE6cOMHJkyc5fvw4J06c4IEuXrzIxYsXufbaa9nc3OTg4ACApzzlKQDcfffd3H333QDYxja2sQ2Abba2trjhhhvY2tpie3ubRz/60QBcuHCBkydPAnDffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddX/TlSuuuqqq6666qqrrrrqX+maa655cCnlwY9//ONZLpc84hGPAOD1X//1OXHiBP9WFy9eBODixYs85CEP4X6Hh4cA3HfffRwcHADwR3/0R9xzzz3Yxja2sY1tHmhra4utrS2uv/56rr/+em644Qaen/vuu+/W3/qt3/ruf/iHf/jtf/iHf/gdrrrqqquuuuqqq/5voHLVVVddddVVV1111VX/Si/2Yi/22v/wD//w213XvfYdd9zBX/7lX/LgBz+YzGQcR2azGZJorfGCDMOAbQCWyyVHR0ccHR1hm8PDQ37/93+fw8NDDg4OyExsY5vMxDa2eW5bW1tce+21bG1tcd1113H99ddzvwsXLjBN063Ag++7775bz549e+vf//3f//Y//MM//M4//MM//DZXXXXVVVddddVV/zdRueqqq6666qqrrrrqqn+ls2fP3vpSL/VSt95xxx3c78KFCzzjGc/gwQ9+MMeOHWNnZ4dSCuM4cnR0xMHBAXt7exwcHHB4eMhqtWK1WjEMA+M4Mk0TrTVaa7TWyEwyEwBJ2AZgc3MT21xzzTVsbm5y7bXXsrm5ydbWFs/Pfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqqquuuur/DypXXXXVVVddddVVV131r/T3f//3v/2O7/iOn/X6r//63HfffVy4cAEASUhCEpKQhCQkASAJAEk8kCTut1gsyEzm8zknT57ENhsbG2xsbHDNNdfwwtx33323/sM//MNv33fffbf+wz/8w+/8wz/8w29z1VVXXXXVVVdd9f8betCDHsRVV1111VVXXXXVVVf9a11zzTUPfsd3fMfPep3XeZ33vnjxIidOnGAYBmqtdF3HbDYDQBLjODIMA+v1mmEYsE1rjVormclsNmM+n/PcLl68yIkTJ3ig++6771aAf/iHf/jtf/iHf/gdwPfdd98z/uEf/uG3ueqqq6666qqrrrrquaEHPehBXHXVVVddddVVV1111b/VNddc8+B3fMd3/KxrrrnmwS/2Yi/22vw73XfffbcCnD179ta///u//22As2fPPuO+++679R/+4R9+m6uuuuqqq6666qqr/jXQgx70IK666qqrrrrqqquuuuo/wjXXXPNggDNnzjz4mmuueTDgM2fOPJjncvbs2WcA3Hfffbdyhf/hH/7hd7jqqquuuuqqq6666j8aetCDHsRVV1111VVXXXXVVVddddVVV1111VVXXfV/EpWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X8U/AlBOBPetNe/QAAAAAElFTkSuQmCC) + + diff --git a/docs/kcl-std/functions/std-sketch-circle.md b/docs/kcl-std/functions/std-sketch-circle.md index fbe14a1c5..485c335d7 100644 --- a/docs/kcl-std/functions/std-sketch-circle.md +++ b/docs/kcl-std/functions/std-sketch-circle.md @@ -1,15 +1,15 @@ --- title: "circle" subtitle: "Function in std::sketch" -excerpt: "" +excerpt: "Construct a 2-dimensional circle, of the specified radius, centered at the provided (x, y) origin point." layout: manual --- - +Construct a 2-dimensional circle, of the specified radius, centered at the provided (x, y) origin point. ```kcl circle( - @sketch_or_surface: Sketch | Plane | Face, + @sketchOrSurface: Sketch | Plane | Face, center: Point2d, radius?: number(Length), diameter?: number(Length), @@ -17,14 +17,13 @@ circle( ): Sketch ``` -Construct a 2-dimensional circle, of the specified radius, centered at -the provided (x, y) origin point. + ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch_or_surface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Sketch to extend, or plane or surface to sketch on. | Yes | +| `sketchOrSurface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Sketch to extend, or plane or surface to sketch on. | Yes | | `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center of the circle. | Yes | | `radius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The radius of the circle. Incompatible with `diameter`. | No | | `diameter` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The diameter of the circle. Incompatible with `radius`. | No | diff --git a/docs/kcl-std/circleThreePoint.md b/docs/kcl-std/functions/std-sketch-circleThreePoint.md similarity index 99% rename from docs/kcl-std/circleThreePoint.md rename to docs/kcl-std/functions/std-sketch-circleThreePoint.md index b313030ba..9a54118c5 100644 --- a/docs/kcl-std/circleThreePoint.md +++ b/docs/kcl-std/functions/std-sketch-circleThreePoint.md @@ -9,11 +9,11 @@ Construct a circle derived from 3 points. ```kcl circleThreePoint( - @sketchSurfaceOrGroup: Sketch | Plane | Face, + @sketchOrSurface: Sketch | Plane | Face, p1: Point2d, p2: Point2d, p3: Point2d, - tag?: TagDeclarator, + tag?: tag, ): Sketch ``` @@ -23,11 +23,11 @@ circleThreePoint( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSurfaceOrGroup` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Plane or surface to sketch on. | Yes | +| `sketchOrSurface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Plane or surface to sketch on. | Yes | | `p1` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | 1st point to derive the circle. | Yes | | `p2` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | 2nd point to derive the circle. | Yes | | `p3` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | 3rd point to derive the circle. | Yes | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Identifier for the circle to reference elsewhere. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Identifier for the circle to reference elsewhere. | No | ### Returns @@ -38,7 +38,7 @@ circleThreePoint( ```kcl exampleSketch = startSketchOn(XY) - |> circleThreePoint(p1 = [10, 10], p2 = [20, 8], p3 = [15, 5]) + |> circleThreePoint(p1 = [10,10], p2 = [20,8], p3 = [15,5]) |> extrude(length = 5) ``` diff --git a/docs/kcl-std/close.md b/docs/kcl-std/functions/std-sketch-close.md similarity index 99% rename from docs/kcl-std/close.md rename to docs/kcl-std/functions/std-sketch-close.md index bcb18f654..18d886755 100644 --- a/docs/kcl-std/close.md +++ b/docs/kcl-std/functions/std-sketch-close.md @@ -10,18 +10,21 @@ Construct a line segment from the current origin back to the profile's origin, e ```kcl close( @sketch: Sketch, - tag?: TagDeclarator, + tag?: tag, ): Sketch ``` - +If you want to perform some 3-dimensional operation on a sketch, like +extrude or sweep, you must `close` it first. `close` must be called even +if the end point of the last segment is coincident with the sketch +starting point. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | The sketch you want to close | Yes | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | The sketch you want to close. | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns @@ -32,11 +35,11 @@ close( ```kcl startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> line(end = [10, 10]) - |> line(end = [10, 0]) - |> close() - |> extrude(length = 10) + |> startProfile(at = [0, 0]) + |> line(end = [10, 10]) + |> line(end = [10, 0]) + |> close() + |> extrude(length = 10) ``` ![Rendered example of close 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADXc0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqq/zeuueaaB7/jO77jZ3HVVVf9h/vRH/3Rz7nvvvtu5aqrrrrqqqv+Z0EPetCDuOqqq6666qqrrrrq/74P//AP/64Xe7EXe+1rrrnmwVx11VX/oe67775bAb7+67/+ff7hH/7ht7nqqquuuuqq/znQgx70IK666qqrrrrqqquu+r/twz/8w7/rdV7ndd6bZ/qMz/gM/qPY5v8y2/xvZpv/LWzzP5ltXpDXf/3X5/Vf//W57777bv2sz/qs17nvvvtu5aqrrrrqqqv+ZyC46qqrrrrqqquuuur/tM/93M/9rdd5ndd57x//8R/nP4MkJCEJSUhCEpKQhCQkIQlJSOJ/E0lIQhKSkIQkJCEJSUhCEv8TSUISkpCEJCQhCUlI4n8KSUhCEpKQhCQkIYn/bpKQhCQkIQlJSOI3fuM3+PVf/3WuueaaB3/O53zO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/uf86I/+KACS+JdI4rlJ4l8iiecmiecmiecmiecmiecmiecmiReVJF6YBz3oQdzvTd7kTbjqqquu+ve65pprHmybq6666qqr/kejctVVV1111VVXXfW/zOu8zuu894d/+Id/15//+Z/zoz/6owBI4rlJ4oEk8dwk8dwk8S+RxHOTxHOTxHOTxHOTxItKEs9NEs+PJAAe9KAH8e7v/u4AnD17lsPDQ656wWzzv41t/rPZ5n8K2/xPYJv/DLb5n8A299ve3uaGG27gge67775bz549eytXXXXVVVf9T0blqquuuuqqq6666n+R13md13nvD//wD/+uP//zP+dHf/RHAZDEc5PEv0QSz00Sz00S/xaS+PeQxHOTxHOTxPMjCYCXfMmX5C3e4i0A+Id/+Ace97jH8b+Rbf4z2OY/gm3+rWzzb2Gbfy3b/GvZ5l/DNv8atnlR2eZfwzYvKtu8qGzzorLNi8o2Lyrb/GvY5kVlm/ttb2/zyEc+kkc96lHc77777rv1t37rt777R3/0Rz+Hq6666qqr/qejctVVV1111VVXXfW/xOu8zuu894d/+Id/15//+Z/zoz/6o7wgknhuknggSTw3STw3STw3STw3SbwoJPHcJPHcJPHcJPHcJPH8SALgJV/yJXmLt3gLAP7sz/6MW2+9lf+pbPOfzTb/UWzz72Gbfwvb/FvY5l/DNv9atvnXsM2/hm1eVLZ5UdnmRWWbF5Vt/jVs86KyzYvKNv8atgHY3t7m5V7u5XjUox7F/e67775bf/RHf/Rzfuu3fuu7ueqqq6666n8LKlddddVVV1111VX/C3z4h3/4d73O67zOe//ar/0av/Zrv8b9JPFAknhukviXSOK5SeK5SeK5SeK5SeK5SeK5SeK5SeK5SeJFJQmAt3iLt+AlX/IlAfizP/szbr31Vv472ea/km3+I9nm38s2/xa2+bewzb+Wbf61bPOvYZt/Ddu8qGzzorLNv4ZtXlS2eVHZ5kVlm38N27yobAPwci/3cjzqUY9ie3ub+/3Ij/zIZ//2b//299x33323ctVVV1111f82VK666qqrrrrqqqv+h/vwD//w73qd13md9/7RH/1R/vzP/5z7SeKBJPHcJPHcJPFAknhuknhuknhuknhuknhuknhuknhuknhRSeK5SQLgLd7iLXjJl3xJAH77t3+bs2fP8h/NNv9T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/dzP/a2nPOUpfOM3fiOSeCBJPDdJPJAknpsk/iWSeG6SeG6S+LeQxHOTxHOTxL/kwQ9+MO/1Xu8FwN13383P//zP80C2eUEkcdX/Hbb5n8Q2/17b29s88pGP5OVe7uW433333Xfrb/3Wb333j/7oj34OV1111VVXXXXVVf92VK666qqrrrrqqv82L/ZiL/ban/u5n/tbT3nKU/jGb/xGJPFAknhukviXSOK5SeJfIonnJonnJonnJon/SJK434Mf/GDe673eC4C7776bn//5n+dfwzYvjCSu+p/DNv9T2eY/0vb2Ni/3ci/HIx/5SO73D//wD7/9W7/1W9/zW7/1W9/NVVddddVVV1111b8flauuuuqqq6666r/Fi73Yi732537u5/7WU57yFL7xG78RSfxLJPHcJPFAknhuknhuknggSTw3STw3STw3STw3STw3STw3STw3SdzvwQ9+MO/1Xu8FwN13383P//zP8x/NNi8KSVz1b2eb/01s85/l5V7u5XjkIx/J9vY2APfdd9+tv/Vbv/Xdv/3bv/099913361cddVVV1111VVX/cehctVVV1111VVX/Zd7sRd7sdf+3M/93N96ylOewjd+4zciiecmiX+JJP4lknhukviXSOK5SeK5SeK5SeK5SeK5SeK5SeJ+D37wg3mv93ovAJ70pCfxO7/zO/x3ss2/hST+L7HN/yW2+a+wvb3NIx/5SF7u5V6O+9133323/tZv/dZ3/+iP/ujncNVVV1111VVXXfWfg8pVV1111VVXXfVf6sVe7MVe+3M/93N/6ylPeQrf+I3fyPMjiecmiQeSxHOTxANJ4rlJ4rlJ4l8iiecmiecmiecmiecmiecmifu99Eu/NG/1Vm8FwF/8xV/wl3/5l/xvZZur/mewzX+17e1tHvnIR/JyL/dy3O++++679bd+67e++0d/9Ec/h6uuuuqqq6666qr/XFSuuuqqq6666qr/Mq/zOq/z3h/+4R/+XU95ylP4xm/8RgAk8UCSeG6S+JdI4l8iiecmiecmif9OL/3SL81bvdVbAfDbv/3bPOlJT+IFkcRVVz2Qbf4nuP7663nt135ttre3ud9v/dZvffeP/uiPfs599913K1ddddVVV1111VX/NahcddVVV1111VX/JV7ndV7nvT/8wz/8u/7sz/6MH/qhHwJAEg8kiecmiecmiQeS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PYrt7W3u9yM/8iOf/du//dvfc999993KVVddddVVV1111VXPjcpVV1111VVXXfV8XXPNNQ/+8A//8O96sRd7sdf+hm/4Bp7ylKcAIIkHksS/RBLPTRIPJInnJonnJol/iSSemySemySemySemySemyQA3vu935sHP/jBAPzMz/wMd911F/8ZbPOCSOKq/7u2t7d51KMexcu//Mtzv/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq656YahcddVVV1111VXP45prrnnwh3/4h3/X9ddf/9rf8A3fwFOe8hQAJPFAknhukviXSOJfIonnJonnJol/iSSemySemySemySemyQA3vu935sHP/jB7O/v85u/+Zvcdddd/HewzQsjiav+99ne3uZRj3oUL//yL8/97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqquuuupFQeWqq6666qqrrnoO11xzzYM//MM//Luuv/761/6hH/ohnvKUpwAgiX+JJJ6bJB5IEs9NEv8SSTw3STw3SfxnO378OG/91m/Ngx/8YPb39/mN3/gN7r77bv6nss2LQhJX/dexzfNzww038Aqv8ArccMMN3O8f/uEffvvrv/7r3+e+++67lauuuuqqq6666qqr/jWoXHXVVVddddVVz3LNNdc8+MM//MO/6/rrr3/tH/qhH+IpT3kKAJJ4bpJ4IEk8N0n8SyTx3CTxL5HEc5PEc5PEc5PEc5PEc5PEcztx4gRv/dZvzYMf/GD29/f5vu/7Pl4QSfxvYpt/DUlc9Wy2+bfa3t7mUY96FI9+9KPZ3t4G4L777rv1t37rt777t3/7t7/nvvvuu5Wrrrrqqquuuuqqq/4tqFx11VVXXXXVVZddc801D/7wD//w77r++utf+4d+6Id4ylOewgsiiQeSxHOTxHOTxANJ4rlJ4rlJ4oEk8dwk8dwk8dwk8dwk8dwk8dxOnDjBe7/3e3P8+HH29/f5vu/7Pl4Y2zw/kvi/wDb/kSTxX8k2/922t7d51KMexSu8witwv/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq67696Jy1VVXXXXVVVdxzTXXPPhzPudzfqvW+uAf+qEf4ilPeQr3k8QDSeJfIonnJol/iSSemyT+LSTx3CTx3CTx3CTx3E6cOMFHf/RHA3DnnXfyMz/zM/xb2eb5kcT/Z7b5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AP78z/+cB5LEc5PEc5PEc5PE/V7v9V6P13u91wPgF3/xF/n7v/97/jPZ5oEk8a917NgxXvVVX5UXf/EX53733XffrT/6oz/6Ob/1W7/13Vx11VVXXXXVVVddddVVV/3HoHLVVVddddVV/8le53Ve573//M//nH+JJJ6bJJ6bJO739m//9rzsy74sAD/0Qz/E7bffzn812zw3STw/r/qqr8qLv/iLc+zYMe73Iz/yI5/927/9299z33333cpVV1111VVXXXXVVVddddV/LCpXXXXVVVdd9Z/odV7ndd4b4Nd+7dd4IEn8SyTx3CRxv/d///fnoQ99KAA/9EM/xO23387/FLa537Fjx3jxF39xXu3VXo373Xfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVddddVVV131n4fKVVddddVVV/0nesd3fMfP+vM//3MuXrzI/STx3CTxr/H+7//+PPShDwXgh37oh7jtttt4IEn8dzt27Bgv/uIvzqu92qtxv/vuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq6666qqr/vNRueqqq6666qr/JK/zOq/z3tdcc82Df/Inf5L7SeK5SeK5SeK5SQLg/d///XnoQx/KpUuX+MVf/EVuu+02npttHkgS/1WOHTvGq73aq/HiL/7i3O++++679Ud/9Ec/+7d+67e+h6uuuuqqq6666qqrrrrqqv86VK666qqrrrrqP8nrvM7rvNdTn/pUnva0p/GCSOK5SeK5SeLEiRO83du9HQ996EO5dOkSv/iLv8htt93Gi8I2DySJ/2iv9mqvxou/+Itz7Ngx7vcjP/Ijn/3bv/3b33PffffdylVXXXXVVVddddVVV1111X89KlddddVVV131n+DFXuzFXvvFXuzFXvtHf/RHuZ8k/iWSeG6SOHHiBG/3dm/HQx/6UC5dusQv/uIvctttt/FvZZsHksS/xbFjx3jxF39xXu3VXo373Xfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVddddVVV13134vKVVddddVVV/0neJ3XeZ33AvjzP/9zACTx3CTxojhx4gRv93Zvx0Mf+lAuXbrEN3/zN/MfzTYPJIkX5tixY7z4i784r/Zqr8b97rvvvlt/67d+67t/9Ed/9HO46qqrrrrqqquuuuqqq676n4HKVVddddVVV/0neJ3XeZ33/rVf+zUAJPHcJPHcJPHcTp48ySd8wicAcOnSJb75m7+Z/wq2eSBJANx888282qu9Grfccgv3+63f+q3v/tEf/dHPue+++27lqquuuuqqq6666qqrrrrqfxYqV1111VVXXfUf7HVe53XeC+DP//zPeX4k8dwk8dxOnjzJJ3zCJwBw22238UM/9EP8dzh27Bgv/uIvzku8xEtw7NgxAO67775bf+u3fuu7f/u3f/t77rvvvlu56qqrrrrqqquuuuqqq676n4nKVVddddVVV/0He8d3fMfP/vM//3MuXryIJP4tHvrQh/IBH/ABANx222384A/+IJL4r3Ts2DFe/MVfnFd/9Vfnfvfdd9+tv/Vbv/XdP/qjP/o5XHXVVVddddVVV1111VVX/c9H5aqrrrrqqqv+A73O67zOe19zzTUP/smf/Ekk8dwk8dwk8UAPfehD+YAP+AAAbrvtNn7wB38QANvcTxL/WY4dO8arvdqr8RIv8RLc77777rv1R3/0Rz/nt37rt76bq6666qqrrrrqqquuuuqq/z2oXHXVVVddddV/oNd5ndd5r6c+9ak8/elP57lJ4rlJ4oEe+tCH8gEf8AEA/N3f/R2/8Au/wPNjmweSxL/Xq73aq/ESL/ESHDt2jPv9yI/8yGf/9m//9vfcd999t3LVVVddddVVV1111VVXXfW/D5Wrrrrqqquu+g/yYi/2Yq/9Yi/2Yq/9oz/6ozw3STw3STzQQx/6UD7gAz4AgL/7u7/jF37hF3hR2eaBJPGiOHbsGC/+4i/Oq7/6q3O/++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qqrrrrqqqv+d6Ny1VVXXXXVVf9BXud1Xue9AP7iL/6Cf62Xe7mX4+3f/u0B+P3f/31+//d/n38P2zyQJB7o2LFjvPiLvziv/uqvzv3uu+++W3/rt37ru3/0R3/0c7jqqquuuuqqq6666qqrrvq/gcpVV1111VVX/Qd5ndd5nff+tV/7NZ6bJJ6bJO73eq/3erz+678+AL/wC7/A3/3d3/EfzTYAx44d49Vf/dV5iZd4Ce5333333fqjP/qjn/1bv/Vb38NVV1111VVXXXXVVVddddX/LVSuuuqqq6666j/AO77jO34WwF/8xV/wQJJ4bpK439u//dvzci/3cgD8wi/8An/3d3/Hf4ZXf/VX5yVe4iU4duwY9/uRH/mRz/7t3/7t77nvvvtu5aqrrrrqqquuuuqqq6666v8mKlddddVVV131H+B1Xud13vsv/uIvuHjxIi+MJO739m//9rzcy70cAD/4gz/Ibbfdxn+kY8eO8RIv8RK8+qu/Ove77777bv2t3/qt7/7RH/3Rz+Gqq6666qqrrrrqqquuuur/PipXXXXVVVdd9e/0Oq/zOu99zTXXPPinfuqneCBJvCAf8AEfwEMf+lAAfuAHfoDbbrsNSfxHOHbsGC/xEi/Bq7/6q3O/++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qqrrrrqqqv+/6By1VVXXXXVVf9Or/M6r/NeT3va03ja057G/STx3CQB8AEf8AE89KEPBeAHfuAHuO222wCwzf0k8a91yy238Oqv/urccsst3O8f/uEffvvrv/7r3+e+++67lauuuuqqq6666qqrrrrqqv9/qFx11VVXXXXVv8OLvdiLvfaLvdiLvfaP/uiPcj9JPDdJAHzAB3wAD33oQ7l06RI///M/z2233cbzY5sHksTzc+zYMV7iJV6Cl3iJl+DYsWMA3Hfffbf+1m/91nf/9m//9vfcd999t3LVVVddddVVV1111VVXXfX/F5Wrrrrqqquu+nd4ndd5nfcC+Iu/+AtemBMnTvD2b//2PPShD+XSpUv8/M//PLfddhsvKts80PHjx3mJl3gJXv3VX5373Xfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVddddVVV111FQCVq6666qqrrvp3eJ3XeZ33/tEf/VHuJ4nndvLkSd7+7d+ehz70oVy6dIkf+IEf4NKlS/xbHDt2jNd4jdfgJV7iJbjffffdd+uP/uiPfs5v/dZvfTdXXXXVVVddddVVV1111VVXPRCVq6666qqrrvo3+vAP//DvAnja054GgCSe28mTJ3n7t397HvrQh3Lp0iW+8Ru/kX+LV3/1V+clX/IlOXbsGPf7kR/5kc/+7d/+7e+57777buWqq6666qqrrrrqqquuuuqq54fKVVddddVVV/0bvdiLvdhr/8Vf/AUXL15EEs/t5MmTfOInfiIAt912Gz/wAz/Av8axY8d4iZd4CV7jNV6D+9133323/tZv/dZ3/+iP/ujncNVVV1111VVXXXXVVVddddW/hMpVV1111VVX/Ru8zuu8zntfc801D/7O7/xOnp+HPvShfOAHfiAAt912Gz/wAz/Ai+rYsWO8xEu8BK/xGq/B/e67775bf+u3fuu7f/RHf/RzuOqqq6666qqrrrrqqquuuupFReWqq6666qqr/g1e53Ve573+4i/+gosXLyKJB3roQx/KB37gBwLwjGc8gx/4gR9AEv+SY8eO8Rqv8Rq8xEu8BPe77777bv3RH/3Rz/6t3/qt7+Gqq6666qqrrrrqqquuuuqqfy0qV1111VVXXfWv9GIv9mKv/WIv9mKv/S3f8i1I4oEe+tCH8oEf+IEAPOMZz+AHfuAHALDNA0nifq/+6q/OS77kS3Ls2DHu9yM/8iOf/du//dvfc999993KVVddddVVV1111VVXXXXVVf9WVK666qqrrrrqX+md3umdPgvgaU97GpK430Mf+lA+8AM/EIC//du/5ed//ud5QXZ2dnjJl3xJXuM1XoP73Xfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVddddVVV1111X8EKlddddVVV131r/RiL/Zir/2jP/qjSOJ+L/dyL8c7vMM7APC3f/u3/PzP/zzPz7Fjx3jJl3xJXuM1XoP73Xfffbf+1m/91nf/6I/+6Odw1VVXXXXVVVddddVVV1111X8kKlddddVVV131r/DhH/7h3wXwl3/5l9zv5V7u5XiHd3gHAH7+53+ev/3bv+W5HTt2jNd4jdfgJV/yJbnfP/zDP/z2j/zIj3zOP/zDP/w2V1111VVXXXXVVVddddVVV/1noHLVVVddddVV/wqv8zqv895/8Rd/wf1e//Vfn9d//dcH4Od//uf527/9Wx7oNV7jNXjJl3xJjh07BsB9991362/91m9992//9m9/z3333XcrV1111VVXXXXVVVddddVVV/1nonLVVVddddVVL6LXeZ3XeS+AX//1XwfgHd7hHXi5l3s5AL7/+7+f2267DYBjx47xki/5krzGa7wG97vvvvtu/a3f+q3v/tEf/dHP4aqrrrrqqquuuuqqq6666qr/KlSuuuqqq6666kX0ju/4jp/9F3/xF1y8eJEP/MAP5KEPfSgA3//9389tt93GsWPHeMmXfEle4zVeg/vdd999t/7oj/7o5/zWb/3Wd3PVVVddddVVV1111VVXXXXVfzUqV1111VVXXfUieJ3XeZ33vuaaax780z/903zgB34gD33oQwH4/u//fo4fP85bvMVbcOzYMe73Iz/yI5/927/9299z33333cpVV1111VVXXXXVVVddddVV/12oXHXVVVddddWL4HVe53Xe6+LFi7z+678+D33oQwF4xjOewVu8xVtw7NgxAO67775bf+u3fuu7f/RHf/RzuOqqq6666qqrrrrqqquuuup/AipXXXXVVVdd9S+45pprHvxiL/Zirw1w4sQJ7vegBz0IgPvuu+/W3/qt3/ruH/3RH/0crrrqqquuuuqqq6666qqrrvqfhMpVV1111VVX/Qve8R3f8bN4Pu67775bf/RHf/Szf+u3fut7uOqqq6666qqrrrrqqquuuup/IipXXXXVVVdd9S94ndd5nffmAX7kR37ks3/7t3/7e+67775bueqqq6666qqrrrrqqquuuup/MvSgBz2Iq6666qqrrnphrrnmmgd/zud8zm/91m/91nf/6I/+6Odw1VVXXXXVVVddddVVV1111f8W6EEPehBXXXXVVVddddVVV1111VVXXXXVVVddddX/SVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X8U/AhLvJ18DdoOGAAAAAElFTkSuQmCC) diff --git a/docs/kcl-std/extrude.md b/docs/kcl-std/functions/std-sketch-extrude.md similarity index 99% rename from docs/kcl-std/extrude.md rename to docs/kcl-std/functions/std-sketch-extrude.md index b8718834f..35ccbd947 100644 --- a/docs/kcl-std/extrude.md +++ b/docs/kcl-std/functions/std-sketch-extrude.md @@ -9,31 +9,32 @@ Extend a 2-dimensional sketch through a third dimension in order to create new 3 ```kcl extrude( - @sketches: [Sketch], - length: number, + @sketches: [Sketch; 1+], + length: number(Length), symmetric?: bool, - bidirectionalLength?: number, - tagStart?: TagDeclarator, - tagEnd?: TagDeclarator, -): [Solid] + bidirectionalLength?: number(Length), + tagStart?: tag, + tagEnd?: tag, +): [Solid; 1+] ``` -You can provide more than one sketch to extrude, and they will all be extruded in the same direction. +You can provide more than one sketch to extrude, and they will all be +extruded in the same direction. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) | Which sketch or sketches should be extruded | Yes | -| `length` | [`number`](/docs/kcl-std/types/std-types-number) | How far to extrude the given sketches | Yes | +| `sketches` | [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) | Which sketch or sketches should be extruded. | Yes | +| `length` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | How far to extrude the given sketches. | Yes | | `symmetric` | [`bool`](/docs/kcl-std/types/std-types-bool) | If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch. | No | -| `bidirectionalLength` | [`number`](/docs/kcl-std/types/std-types-number) | If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored. | No | -| `tagStart` | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | A named tag for the face at the start of the extrusion, i.e. the original sketch | No | -| `tagEnd` | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch | No | +| `bidirectionalLength` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored. | No | +| `tagStart` | [`tag`](/docs/kcl-std/types/std-types-tag) | A named tag for the face at the start of the extrusion, i.e. the original sketch. | No | +| `tagEnd` | [`tag`](/docs/kcl-std/types/std-types-tag) | A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch. | No | ### Returns -[`[Solid]`](/docs/kcl-std/types/std-types-Solid) +[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) ### Examples @@ -42,10 +43,18 @@ You can provide more than one sketch to extrude, and they will all be extruded i example = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [10, 0]) - |> arc(angleStart = 120, angleEnd = 0, radius = 5) + |> arc( + angleStart = 120, + angleEnd = 0, + radius = 5, + ) |> line(end = [5, 0]) |> line(end = [0, 10]) - |> bezierCurve(control1 = [-10, 0], control2 = [2, 10], end = [-5, 10]) + |> bezierCurve( + control1 = [-10, 0], + control2 = [2, 10], + end = [-5, 10], + ) |> line(end = [-5, -2]) |> close() |> extrude(length = 10) @@ -56,10 +65,18 @@ example = startSketchOn(XZ) ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [-10, 0]) - |> arc(angleStart = 120, angleEnd = -60, radius = 5) + |> arc( + angleStart = 120, + angleEnd = -60, + radius = 5, + ) |> line(end = [10, 0]) |> line(end = [5, 0]) - |> bezierCurve(control1 = [-3, 0], control2 = [2, 10], end = [-5, 10]) + |> bezierCurve( + control1 = [-3, 0], + control2 = [2, 10], + end = [-5, 10], + ) |> line(end = [-4, 10]) |> line(end = [-5, -2]) |> close() @@ -72,10 +89,18 @@ example = extrude(exampleSketch, length = 10) ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [-10, 0]) - |> arc(angleStart = 120, angleEnd = -60, radius = 5) + |> arc( + angleStart = 120, + angleEnd = -60, + radius = 5, + ) |> line(end = [10, 0]) |> line(end = [5, 0]) - |> bezierCurve(control1 = [-3, 0], control2 = [2, 10], end = [-5, 10]) + |> bezierCurve( + control1 = [-3, 0], + control2 = [2, 10], + end = [-5, 10], + ) |> line(end = [-4, 10]) |> line(end = [-5, -2]) |> close() @@ -88,10 +113,18 @@ example = extrude(exampleSketch, length = 20, symmetric = true) ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [-10, 0]) - |> arc(angleStart = 120, angleEnd = -60, radius = 5) + |> arc( + angleStart = 120, + angleEnd = -60, + radius = 5, + ) |> line(end = [10, 0]) |> line(end = [5, 0]) - |> bezierCurve(control1 = [-3, 0], control2 = [2, 10], end = [-5, 10]) + |> bezierCurve( + control1 = [-3, 0], + control2 = [2, 10], + end = [-5, 10], + ) |> line(end = [-4, 10]) |> line(end = [-5, -2]) |> close() diff --git a/docs/kcl-std/getCommonEdge.md b/docs/kcl-std/functions/std-sketch-getCommonEdge.md similarity index 99% rename from docs/kcl-std/getCommonEdge.md rename to docs/kcl-std/functions/std-sketch-getCommonEdge.md index ce240ebb9..025b56d7b 100644 --- a/docs/kcl-std/getCommonEdge.md +++ b/docs/kcl-std/functions/std-sketch-getCommonEdge.md @@ -8,7 +8,7 @@ layout: manual Get the shared edge between two faces. ```kcl -getCommonEdge(faces: [TagIdentifier]): Uuid +getCommonEdge(faces: [tag; 2]): Edge ``` @@ -17,11 +17,11 @@ getCommonEdge(faces: [TagIdentifier]): Uuid | Name | Type | Description | Required | |----------|------|-------------|----------| -| `faces` | [`[TagIdentifier]`](/docs/kcl-lang/types#TagIdentifier) | The tags of the faces you want to find the common edge between | Yes | +| `faces` | `[tag; 2]` | The tags of the faces you want to find the common edge between. | Yes | ### Returns -`Uuid` +[`Edge`](/docs/kcl-std/types/std-types-Edge) - An edge of a solid. ### Examples @@ -29,17 +29,16 @@ getCommonEdge(faces: [TagIdentifier]): Uuid ```kcl // Get an edge shared between two faces, created after a chamfer. - scale = 20 part001 = startSketchOn(XY) - |> startProfile(at = [0, 0]) - |> line(end = [0, scale]) - |> line(end = [scale, 0]) - |> line(end = [0, -scale]) - |> close(tag = $line0) - |> extrude(length = 20, tagEnd = $end0) - // We tag the chamfer to reference it later. - |> chamfer(length = 10, tags = [getOppositeEdge(line0)], tag = $chamfer0) + |> startProfile(at = [0, 0]) + |> line(end = [0, scale]) + |> line(end = [scale, 0]) + |> line(end = [0, -scale]) + |> close(tag = $line0) + |> extrude(length = 20, tagEnd = $end0) + // We tag the chamfer to reference it later. + |> chamfer(length = 10, tags = [getOppositeEdge(line0)], tag = $chamfer0) // Get the shared edge between the chamfer and the extrusion. commonEdge = getCommonEdge(faces = [chamfer0, end0]) diff --git a/docs/kcl-std/getNextAdjacentEdge.md b/docs/kcl-std/functions/std-sketch-getNextAdjacentEdge.md similarity index 99% rename from docs/kcl-std/getNextAdjacentEdge.md rename to docs/kcl-std/functions/std-sketch-getNextAdjacentEdge.md index cf11bbc2c..ba95ad255 100644 --- a/docs/kcl-std/getNextAdjacentEdge.md +++ b/docs/kcl-std/functions/std-sketch-getNextAdjacentEdge.md @@ -8,7 +8,7 @@ layout: manual Get the next adjacent edge to the edge given. ```kcl -getNextAdjacentEdge(@edge: TagIdentifier): Uuid +getNextAdjacentEdge(@edge: tag): Edge ``` @@ -17,11 +17,11 @@ getNextAdjacentEdge(@edge: TagIdentifier): Uuid | Name | Type | Description | Required | |----------|------|-------------|----------| -| `edge` | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The tag of the edge you want to find the next adjacent edge of. | Yes | +| `edge` | [`tag`](/docs/kcl-std/types/std-types-tag) | The tag of the edge you want to find the next adjacent edge of. | Yes | ### Returns -`Uuid` +[`Edge`](/docs/kcl-std/types/std-types-Edge) - An edge of a solid. ### Examples @@ -30,14 +30,27 @@ getNextAdjacentEdge(@edge: TagIdentifier): Uuid exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [10, 0]) - |> angledLine(angle = 60, length = 10) - |> angledLine(angle = 120, length = 10) + |> angledLine( + angle = 60, + length = 10, + ) + |> angledLine( + angle = 120, + length = 10, + ) |> line(end = [-10, 0]) - |> angledLine(angle = 240, length = 10, tag = $referenceEdge) + |> angledLine( + angle = 240, + length = 10, + tag = $referenceEdge, + ) |> close() example = extrude(exampleSketch, length = 5) - |> fillet(radius = 3, tags = [getNextAdjacentEdge(referenceEdge)]) + |> fillet( + radius = 3, + tags = [getNextAdjacentEdge(referenceEdge)], + ) ``` ![Rendered example of getNextAdjacentEdge 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD8UklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VX/Qa655poHv/Zrv/Z7cdVVV/27/PZv//b33Hfffbdy1VVXXXXVVVdd9e9H5aqrrrrqqquuuuo/wIu92Iu99ju90zt91ou92Iu9NlddddW/yzXXXPPg3/qt3/qef/iHf/htrrrqqquuuuqqq/590IMe9CCuuuqqq6666qqr/r2+6Zu+6enXXHPNg3/2Z3+Wv/mbv+G/g22u+o9lm//LbPM/zUu/9Evz1m/91tx33323fsiHfMhDuOqqq6666qqrrvr3Ibjqqquuuuqqq676d3qd13md977mmmseDPA3f/M3/HeRhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkvi/SBKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkvifShKSkIQkJCEJSUhCEpKQhCQkIYn/TLfeeiu7u7tcc801D36d13md9+aqq6666qqrrrrq34fgqquuuuqqq6666t/pHd/xHT8L4Gd/9mf5/0wSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOJ/M0lIQhKSkIQkJCEJSUhCEpKQhCQkIYn/aSQhCUlIQhKSkIQkJCEJSUhCEi+q3d1dfvu3fxuAd3zHd/wsrrrqqquuuuqqq/59CK666qqrrrrqqqv+HV7ndV7nva+55poHA/zt3/4tkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46vmThCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfxvIQlJSEISkpCEJCQhCUlIQhKSkIQkJPE/gSQkIQlJSEISkpCEJCQhiWc84xns7u5yzTXXPPh1Xud13purrrrqqquuuuqqfzuCq6666qqrrrrq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/xaSeEEk8YJI4kUliedHEs9NEi8KSTyQJJ6bJF4YSTyQJB5IEi+IJO4niftJ4vmRxP0kcT9JPD+SuJ8k7ieJ5yaJ+0kCQBLPjyQAJHE/STw3SdxPEgCSeH4kcb8HPehBHDt2jH/4h3/47c/8zM98Ha666qqrrrrqqqv+c6AHPehBXHXVVVddddVVV/1nueaaax78Td/0TU/nqquueg733Xffrddcc82DP/MzP/N1/uEf/uG3ueqqq6666qqrrvrPgR70oAdx1VVXXXXVVVdd9Z/pmmuuefBrv/Zrv9eLv/iLvzZXXXXVZX//93//27/927/9Pffdd9+tXHXVVVddddVVV/3nQQ960IO46qqrrrrqqquuuuqqq6666qqrrrrqqqv+T6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+EcikFdC987s0gAAAABJRU5ErkJggg==) diff --git a/docs/kcl-std/getOppositeEdge.md b/docs/kcl-std/functions/std-sketch-getOppositeEdge.md similarity index 99% rename from docs/kcl-std/getOppositeEdge.md rename to docs/kcl-std/functions/std-sketch-getOppositeEdge.md index eb31f4179..59d84bfe8 100644 --- a/docs/kcl-std/getOppositeEdge.md +++ b/docs/kcl-std/functions/std-sketch-getOppositeEdge.md @@ -8,7 +8,7 @@ layout: manual Get the opposite edge to the edge given. ```kcl -getOppositeEdge(@edge: TagIdentifier): Uuid +getOppositeEdge(@edge: tag): Edge ``` @@ -17,11 +17,11 @@ getOppositeEdge(@edge: TagIdentifier): Uuid | Name | Type | Description | Required | |----------|------|-------------|----------| -| `edge` | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The tag of the edge you want to find the opposite edge of. | Yes | +| `edge` | [`tag`](/docs/kcl-std/types/std-types-tag) | The tag of the edge you want to find the opposite edge of. | Yes | ### Returns -`Uuid` +[`Edge`](/docs/kcl-std/types/std-types-Edge) - An edge of a solid. ### Examples @@ -30,14 +30,27 @@ getOppositeEdge(@edge: TagIdentifier): Uuid exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [10, 0]) - |> angledLine(angle = 60, length = 10) - |> angledLine(angle = 120, length = 10) + |> angledLine( + angle = 60, + length = 10, + ) + |> angledLine( + angle = 120, + length = 10, + ) |> line(end = [-10, 0]) - |> angledLine(angle = 240, length = 10, tag = $referenceEdge) + |> angledLine( + angle = 240, + length = 10, + tag = $referenceEdge, + ) |> close() example = extrude(exampleSketch, length = 5) - |> fillet(radius = 3, tags = [getOppositeEdge(referenceEdge)]) + |> fillet( + radius = 3, + tags = [getOppositeEdge(referenceEdge)], + ) ``` ![Rendered example of getOppositeEdge 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEelklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VX/Qa655poHv/Zrv/Z7cdVVV/27/PZv//b33Hfffbdy1VVXXXXVVVdd9e9H5aqrrrrqqquuuuo/wIu92Iu99ju90zt91ou92Iu9NlddddW/yzXXXPPg3/qt3/qef/iHf/htrrrqqquuuuqqq/590IMe9CCuuuqqq6666qqr/r2+6Zu+6enXXHPNg3/2Z3+Wv/mbv+G/g22u+o9lm//LbPM/zUu/9Evz1m/91tx33323fsiHfMhDuOqqq6666qqrrvr3Ibjqqquuuuqqq676d3qd13md977mmmseDPA3f/M3/HeRhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkvi/SBKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkvifShKSkIQkJCEJSUhCEpKQhCQkIYn/TLfeeiu7u7tcc801D36d13md9+aqq6666qqrrrrq34fgqquuuuqqq6666t/pHd/xHT8L4Gd/9mf5/0wSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOJ/M0lIQhKSkIQkJCEJSUhCEpKQhCQkIYn/aSQhCUlIQhKSkIQkJCEJSUhCEi+q3d1dfvu3fxuAd3zHd/wsrrrqqquuuuqqq/59CK666qqrrrrqqqv+HV7ndV7nva+55poHA/zt3/4tkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpK46vmThCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSfxvIQlJSEISkpCEJCQhCUlIQhKSkIQkJPE/gSQkIQlJSEISkpCEJCQhiWc84xns7u5yzTXXPPh1Xud13purrrrqqquuuuqqfzuCq6666qqrrrrqqn+HD//wD/8ugJ/92Z/lP4okJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/6yQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJ/E8mCUlIQhKSkIQkJCEJSUhCEpKQxH+X3d1dfud3fgeAd3zHd/wsrrrqqquuuuqqq/7tCK666qqrrrrqqqv+jd7xHd/xs3imv/3bv+X/IklIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI4v8CSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8TyMJSUhCEpKQhCQkIQlJSEISkviPcuuttwJwzTXXPPjDP/zDv4urrrrqqquuuuqqfxuCq6666qqrrrrqqn+jd3qnd/psgN/93d/lqn8fSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk/reRhCQkIQlJSEISkpCEJCQhCUlIQhL/U0hCEpKQhCQkIQlJSEISkpCEJJ6f3d1dfuZnfgaAF3uxF3vta6655sFcddVVV1111VVX/esRXHXVVVddddVVV/0bfPiHf/h38Uy/93u/hyQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhiaueTRKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpDE/3SSkIQkJCEJSUhCEpKQhCQkIQlJ/E8gCUlIQhKSkMQznvEMAK655poHv+M7vuNncdVVV1111VVXXfWvR3DVVVddddVVV131r3TNNdc8+HVe53XeG+B3f/d3+Z9GEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYn/6yQhCUlIQhKSkIQkJCEJSUhCEpKQhCQk8T+RJCQhCUlIQhKSkIQkJCEJSUhCEv8Vdnd3+Zmf+RkAXuzFXuy1r7nmmgdz1VVXXXXVVVdd9a9DcNVVV1111VVXXfWv9I7v+I6fxTP93u/9HlddIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCT+r5CEJCQhCUlIQhKSkIQkJCEJSUhCEpL4n0QSkpCEJCQhCUlIQhKSkIQkJPFv8YxnPAOAa6655sHv+I7v+FlcddVVV1111VVX/esQXHXVVVddddVVV/0rXHPNNQ9+ndd5nfe+dOkSz3jGM5CEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIYmrnj9JSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL430oSkpCEJCQhCUlIQhKSkIQkJCGJ/ykkIQlJSEISkpCEJCQhCUlIAmB3d5e/+Zu/AeDFXuzFXvvFXuzFXpurrrrqqquuuuqqFx3BVVddddVVV1111b/Ch3/4h38XwLFjxzh+/Dj/0SQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/+skIQlJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/y0kIQlJSEISkpCEJCQhCUlIQhKS+O8mCUn87u/+LgDXXHPNg9/pnd7ps7jqqquuuuqqq6560RFcddVVV1111VVXvYhe7MVe7LVf7MVe7LV/5Ed+hO///u/n2LFjvPmbvzn/F0lCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUji/wJJSEISkpCEJCQhCUlIQhKSkIQkJCGJ/+kkIQlJSEISkpCEJCQhCUlIQhL/GXZ3d/mbv/kbAF7sxV7stV/sxV7stbnqqquuuuqqq6560RBcddVVV1111VVXvYje6Z3e6bMA/vZv/5azZ8/yt3/7t7zkS74kH/ZhH8axY8e46l9HEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJPG/jSQkIQlJSEISkpCEJCQhCUlIQhKS+J9KEpKQhCQkIQlJSEISkpCEJF5Uv/u7v8v93umd3umzuOqqq6666qqrrnrRUI4fP85VV1111VVXXXXVv+TFXuzFXvud3umdPvtHf/RHOXv2LMMwcN999zEMA4985CN51KMexXw+5/bbb0cSkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+P9IEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkMT/dJKQhCQkIQlJSEISkpCEJCQhCUn8TyMJSUhCEpKQhCQkIQlJrNdrjh07xnXXXcc111zz4H/4h3/4nbNnz97KVVddddVVV1111QtHOX78OFddddVVV1111VX/ko/4iI/4rlLKg3/6p3+aUgqlFIZhYG9vj8ViwS233MKDHvQgXvIlX5LZbMZtt93GfzdJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkvi/RhKSkIQkJCEJSUhCEpKQhCQkIQlJSEIS/xNJQhKSkIQkJCEJSUhCEpKQhCQk8T/Bfffdxyu+4isCcM011zz4t37rt76Hq6666qqrrrrqqheOcvz4ca666qqrrrrqqqtemNd5ndd57zd/8zf/6O/7vu9jf3+fiCAiiAiGYeDJT34ye3t7XHPNNVy6dImXfMmX5CVf8iW59tprWa1WXLp0if8PJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKS+N9MEpKQhCQkIQlJSEISkpCEJCQhCUn8TyMJSUhCEpKQhCQkIQlJSEIS/xlWqxXHjh3juuuu45prrnnwP/zDP/zO2bNnb+Wqq6666qqrrrrqBaMcP36cq6666qqrrrrqqhfmfd/3fb/q0qVLD/6d3/kdSimUUogIIgJJRARnz57lqU99Kuv1mvl8zr333stLvMRL8JIv+ZK85Eu+JPP5HEns7e0hCUlIQhKSkMRVz58kJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUn8byEJSUhCEpKQhCQkIQlJSEISkpDE/xSSkIQkJCEJSUhCEpKQhCQk8aK67777eMVXfEUAXuzFXuy1f+EXfuFruOqqq6666qqrrnrBKMePH+eqq6666qqrrrrqBXmd13md937zN3/zj/6Jn/gJ9vf3iQgigohAEhGBJCQxDAPnzp3jcY97HOfOnWO9XnPs2DEuXbrES7zES/ASL/ESvMRLvATXXnst6/WaS5cu8UCSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpL4/0ASkpCEJCQhCUlIQhKSkIQkJCEJSUhCEv+TSUISkpCEJCQhCUlIQhKSkIQkJPHfTRKSkIQkJCEJSUhCEpJYr9ccP36ca6+9ls3NzeNnz559xq233vrXXHXVVVddddVVVz1/6EEPehBXXXXVVVddddVVL8g3fdM3Pf3SpUsP/u7v/m5qrZRSiAgiAklEBJKQhCQkIQlJSGJnZ4djx47x2Mc+lsc85jH83d/9HS/xEi8BwKVLlwD4u7/7O2677TZuu+02/q+zzVVgm//tbPPf5dixY3z4h384APfdd9+tH/IhH/IQrrrqqquuuuqqq54/KlddddVVV1111VUvwOu8zuu89zXXXPPgn/7pnyYikIQkJAEgiQeSxHPb399nf3+fO++8kz/90z8FYLlccuONN3LjjTdy22238eqv/urc79KlS9x2223cdtttXLp0idtuu43/SyTxH802/9tI4t/CNv9TSOJfyzb/ES5dusQznvEMHvSgB3HNNdc8+HVe53Xe+7d+67e+m6uuuuqqq6666qrnhR70oAdx1VVXXXXVVVdd9fx80zd909MvXbr04O/+7u+m1kophYggIpBERCAJSUhCEpKQBIAkJCEJAElIAkASOzs7bG9v85jHPIbt7W1uuOEG/u7v/o5jx45xyy23AHDp0iUAbrvtNm6//XYALl26xG233cYD2eaqfx/b/F9lm/9tbPPCHDt2jA//8A8H4L777rv1Qz7kQx7CVVddddVVV1111fOictVVV1111VVXXfV8vOM7vuNnXXPNNQ/+6Z/+aSKCiEASkgCQxAsjCUncTxL3kwTA/v4++/v73H333QDs7OwgiRtuuIHVasXW1hY33HADAMeOHeMlXuIluN+lS5cAuO222wC4/fbbuXTpEpcuXeLSpUv8Z7PN/zWS+Peyzf9EkvjXss1/J0m8MHt7ezzjGc/gQQ96ENdcc82D3/Ed3/GzfvRHf/RzuOqqq6666qqrrnpO6EEPehBXXXXVVVddddVVz+0nfuIn/Md//Mf83M/9HLVWSilEBBGBJCICSUhCEpKQhCQAJCEJSQBIQhIAkgCQhCQAJAEgCQBJSGJ7exuA66+/nhtuuIGtrS22t7cB2Nra4rbbbuOWW27hgS5dugTApUuXuHTpEgC33347AJcuXeLSpUtcunSJ/4ls8/+Vbf43s81/tWPHjvFhH/ZhANx33323fsiHfMhDuOqqq6666qqrrnpOVK666qqrrrrqqqueyzu+4zt+FsDv/M7vUEohIpCEJAAk8cJIQhL3k8Rzk8RzkwSAJO63v7+PJJ7ylKfwlKc8BUkAbG9vA3D99ddz++23c+2117K1tcXW1hbHjh0D4NixY9x2223ccsstvMRLvATP7dKlSwBcunQJgEuXLgFw6dIl9vb2uN+lS5cAuHTpEve7dOkS/xkk8R/FNv+bSOLfwjb/E0jiX8M2/16XLl3iGc94Bg960IO45pprHvzhH/7h3/X1X//178NVV1111VVXXXXVs1G56qqrrrrqqquuei7v9E7v9Nl/9md/xt7eHrVWJCEJ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qqsu+/u///vf/u3f/u3vue+++27lqquuuuqqq6666j8PetCDHsRVV1111VVXXXXVVVddddVVV1111VVXXfV/EpWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwJv/zYrqSeLCQAAAABJRU5ErkJggg==) diff --git a/docs/kcl-std/getPreviousAdjacentEdge.md b/docs/kcl-std/functions/std-sketch-getPreviousAdjacentEdge.md similarity index 99% rename from docs/kcl-std/getPreviousAdjacentEdge.md rename to docs/kcl-std/functions/std-sketch-getPreviousAdjacentEdge.md index 9f8ad0b3a..3daf7a4a9 100644 --- a/docs/kcl-std/getPreviousAdjacentEdge.md +++ b/docs/kcl-std/functions/std-sketch-getPreviousAdjacentEdge.md @@ -8,7 +8,7 @@ layout: manual Get the previous adjacent edge to the edge given. ```kcl -getPreviousAdjacentEdge(@edge: TagIdentifier): Uuid +getPreviousAdjacentEdge(@edge: tag): Edge ``` @@ -17,11 +17,11 @@ getPreviousAdjacentEdge(@edge: TagIdentifier): Uuid | Name | Type | Description | Required | |----------|------|-------------|----------| -| `edge` | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The tag of the edge you want to find the previous adjacent edge of. | Yes | +| `edge` | [`tag`](/docs/kcl-std/types/std-types-tag) | The tag of the edge you want to find the previous adjacent edge of. | Yes | ### Returns -`Uuid` +[`Edge`](/docs/kcl-std/types/std-types-Edge) - An edge of a solid. ### Examples @@ -30,14 +30,27 @@ getPreviousAdjacentEdge(@edge: TagIdentifier): Uuid exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [10, 0]) - |> angledLine(angle = 60, length = 10) - |> angledLine(angle = 120, length = 10) + |> angledLine( + angle = 60, + length = 10, + ) + |> angledLine( + angle = 120, + length = 10, + ) |> line(end = [-10, 0]) - |> angledLine(angle = 240, length = 10, tag = $referenceEdge) + |> angledLine( + angle = 240, + length = 10, + tag = $referenceEdge, + ) |> close() example = extrude(exampleSketch, length = 5) - |> fillet(radius = 3, tags = [getPreviousAdjacentEdge(referenceEdge)]) + |> fillet( + radius = 3, + tags = [getPreviousAdjacentEdge(referenceEdge)], + ) ``` ![Rendered example of getPreviousAdjacentEdge 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEEH0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXvVDXXHPNgwHOnDnzYIBrrrnmwTzTmTNnHsRVV/0H++3f/u3vue+++27lqquuuuqqq6666t+PylVXXXXVVVddddX/c9dcc82DAV7sxV7stc+cOfOga6655sHXXHPNg8+cOfNggGuuuebBXHXVf6Frrrnmwb/1W7/1Pf/wD//w21x11VVXXXXVVVf9+6AHPehBXHXVVVddddVVV/1/cc011zz4xV7sxV77zJkzD3rxF3/x136xF3ux1+aZ7rvvvlv7vn8wwO7uLpcuXWJ3dxeA3d1ddnd3Abh06RL3293d5aVe6qV4q7d6K/7mb/6Gn/mZn+H/Etv8X2ab/2le+qVfmrd+67fmvvvuu/VDPuRDHsJVV1111VVXXXXVvw+Vq6666qqrrrrqqv/Drrnmmge/9mu/9nu9+Iu/+Gu/2Iu92GvzTLu7uwD8zu/8DgC33norz3jGMx4siX8NSRw/fpz/qyTxH8E2/xNJ4t/CNv9Zbr31VnZ3d7nmmmse/Dqv8zrv/Vu/9VvfzVVXXXXVVVddddW/HZWrrrrqqquuuuqq/0OuueaaB7/2a7/2e734i7/4a7/Yi73Ya/NMu7u7/M7v/A633norz3jGM7ifJO4niX+L48ePA/CMZzwDSfxnsc3/VpL497DN/ySS+NeyzYtid3eX3/7t3+at3/qtecd3fMfP+q3f+q3v5qqrrrrqqquuuurfjspVV1111VVXXXXV/3LXXHPNg1/7tV/7vV7ndV7nva+55poHA+zu7vI7v/M73HrrrTzjGc/gfpKQxH+kBz3oQQA84xnP4D+TJP6j2eZ/A0n8e9jmv5skXlTPeMYz2N3d5Zprrnnw67zO67z3b/3Wb303V1111VVX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RhLPjyReEEk8P5J4fiTx3CTx3CTx3CTx3CTx3CTxQJJ4bpK4nyQeSBIPJIkHksT9JHE/STyQJO4niftJ4n6SuJ8k7ieJ+0nifpIAkMT9JHE/SQBI4n6SuJ8kACRxP0ncTxIAkrifJO4niftJ4n6SuJ8kAB71qEcxn8/5h3/4h9/+0R/90c/hqquuuuqqq6666j8elauuuuqqq6666qr/JL/927/9PS/+4i/+2i/2Yi/22q/3eq/HE57wBP69JPEvkcQLI4l/C0m8IJJ4QSTxopLE8yOJ5yaJF4UkHkgSz00SL4wkHkgSDySJF0QS95PE/STx/EjifpK4nySeH0ncTxL3k8Rzk8T9JAEgiedHEgCSuJ8knpsk7icJAEk8P5K434Me9CCOHTvGP/zDP/z2Z37mZ74OV1111VVXXXXVVf850IMe9CCuuuqqq6666qqr/rNcc801D/6mb/qmp3PVVVc9h/vuu+/Wa6655sGf+Zmf+Tr/8A//8NtcddVVV1111VVX/edAD3rQg7jqqquuuuqqq676z3TNNdc8+LVf+7Xf68Vf/MVfm6uuuuqyv//7v//t3/7t3/6e++6771auuuqqq6666qqr/vOgBz3oQVx11VVXXXXVVVddddVVV1111VVXXXXVVf8nUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1X8I9Hb9zkc9TJAAAAAAElFTkSuQmCC) diff --git a/docs/kcl-std/involuteCircular.md b/docs/kcl-std/functions/std-sketch-involuteCircular.md similarity index 97% rename from docs/kcl-std/involuteCircular.md rename to docs/kcl-std/functions/std-sketch-involuteCircular.md index 4019c63ba..f057ab6f7 100644 --- a/docs/kcl-std/involuteCircular.md +++ b/docs/kcl-std/functions/std-sketch-involuteCircular.md @@ -10,11 +10,11 @@ Extend the current sketch with a new involute circular curve. ```kcl involuteCircular( @sketch: Sketch, - startRadius: number, - endRadius: number, - angle: number, + startRadius: number(Length), + endRadius: number(Length), + angle: number(Angle), reverse?: bool, - tag?: TagDeclarator, + tag?: tag, ): Sketch ``` @@ -25,11 +25,11 @@ involuteCircular( | Name | Type | Description | Required | |----------|------|-------------|----------| | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | -| `startRadius` | [`number`](/docs/kcl-std/types/std-types-number) | The involute is described between two circles, start_radius is the radius of the inner circle. | Yes | -| `endRadius` | [`number`](/docs/kcl-std/types/std-types-number) | The involute is described between two circles, end_radius is the radius of the outer circle. | Yes | -| `angle` | [`number`](/docs/kcl-std/types/std-types-number) | The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve. | Yes | -| `reverse` | [`bool`](/docs/kcl-std/types/std-types-bool) | If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. Defaults to false. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `startRadius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The involute is described between two circles, start_radius is the radius of the inner circle. | Yes | +| `endRadius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The involute is described between two circles, end_radius is the radius of the outer circle. | Yes | +| `angle` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve. | Yes | +| `reverse` | [`bool`](/docs/kcl-std/types/std-types-bool) | If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns @@ -44,12 +44,7 @@ b = 14 startSketchOn(XZ) |> startProfile(at = [0, 0]) |> involuteCircular(startRadius = a, endRadius = b, angle = 60) - |> involuteCircular( - startRadius = a, - endRadius = b, - angle = 60, - reverse = true, - ) + |> involuteCircular(startRadius = a, endRadius = b, angle = 60, reverse = true) ``` ![Rendered example of involuteCircular 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABu4klEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqv9g111zz4Bd7sRd7bZ7Lfffdd+s//MM//DZXXXXVVVddddVVV1111X8UKlddddVVV1111VX/xV77tV/7vd7pnd7ps3kuP/IjP/LZ//AP//DbXHXVVVddddVVV1111VX/UahcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111X+xs2fPPuO3fuu3vptnep3XeZ33Bjh79uwzuOqqq6666qqrrrrqqqv+I1G56qqrrrrqqquu+i/2W7/1W9/9W7/1W9/NA7zO67zOe7/Yi73Ya/3Wb/3Wd3PVVVddddVVV1111VVX/UchuOqqq6666qqrrvpv9qM/+qOfA/BiL/Zir/1iL/Zir81VV1111VVXXXXVVVdd9R+F4Kqrrrrqqquuuuq/2X333XfrP/zDP/z2Nddc8+DXeZ3XeS+uuuqqq6666qqrrrrqqv8oBFddddVVV1111VX/A/zIj/zI5wC82Iu92Gtz1VVXXXXVVVddddVVV/1HIbjqqquuuuqqq676H+Af/uEffvsf/uEffvuaa6558Iu92Iu9NlddddVVV1111VVXXXXVfwSCq6666qqrrrrqqv8hfuu3fut7AN7pnd7ps7jqqquuuuqqq6666qqr/iMQXHXVVVddddVVV/0P8Q//8A+/DfBiL/Zir/1iL/Zir81VV1111VVXXXXVVVdd9e9FcNVVV1111VVXXfU/xH333Xfrb/3Wb303wIu92Iu9FlddddVVV1111VVXXXXVvxfBVVddddVVV1111f8gv/Vbv/U9AK/zOq/z3lx11VVXXXXVVVddddVV/14EV1111VVXXXXVVf+DnD179laAa6655sEv9mIv9tpcddVVV1111VVXXXXVVf8eBFddddVVV1111VX/g9x33323/tZv/dZ3A7zYi73Ya3HVVVddddVVV1111VVX/XsQXHXVVVddddVVV/0P81u/9VvfA/A6r/M6781VV1111VVXXXXVVVdd9e9BcNVVV1111VVXXfU/zNmzZ28FuOaaax78Yi/2Yq/NVVddddVVV1111VVXXfVvRXDVVVddddVVV131P8x9991362/91m99N8CLvdiLvRZXXXXVVVddddVVV1111b8VwVVXXXXVVVddddX/QL/1W7/1PQCv8zqv895cddVVV1111VVXXXXVVf9WBFddddVVV1111VX/A509e/ZWgGuuuebBL/ZiL/baXHXVVVddddVVV1111VX/FgRXXXXVVVddddVV/wPdd999t/7DP/zDbwO82Iu92Gtx1VVXXXXVVVddddVVV/1bEFx11VVXXXXVVVf9D/UjP/IjnwPw4i/+4q/NVVddddVVV1111VVXXfVvQeWqq6666qqrrrrqf6izZ8/eCnDmzJkHc9VVV1111VVXXXXVVVf9WxBcddVVV1111VVX/Q9133333foP//APv33NNdc8+MVe7MVem6uuuuqqq6666qqrrrrqX4vgqquuuuqqq6666n+w3/qt3/oegHd6p3f6LK666qqrrrrqqquuuuqqfy0qV1111VVXXXXVVf+D/cM//MNvA5w5c+bBXHXVVVddddVVV1111VX/WgRXXXXVVVddddVV/4Pdd999t/7DP/zDb19zzTUPfrEXe7HX5qqrrrrqqquuuuqqq6761yC46qqrrrrqqquu+h/u7//+738b4HVe53Xei6uuuuqqq6666qqrrrrqX4PKVVddddVVV1111f9w//AP//A7AC/2Yi/22lx11VVXXXXVVVddddVV/xoEV1111VVXXXXVVf/D/cM//MNvA1xzzTUPfrEXe7HX5qqrrrrqqquuuuqqq656URFcddVVV1111VVX/S/wD//wD78N8GIv9mKvxVVXXXXVVVddddVVV131oiK46qqrrrrqqquu+l/gR37kRz4H4MVf/MVfm6uuuuqqq6666qqrrrrqRUXlqquuuuqqq6666n+Bs2fP3gpw5syZB3PVVVddddVVV1111VVXvagIrrrqqquuuuqqq/4XuO+++279h3/4h9++5pprHvxiL/Zir81VV1111VVXXXXVVVdd9aIguOqqq6666qqrrvpf4u///u9/G+Cd3umdPourrrrqqquuuuqqq6666kVBcNVVV1111VVXXfW/xG//9m9/D8CZM2cezFVXXXXVVVddddVVV131oiC46qqrrrrqqquu+l/ivvvuu/Uf/uEffvuaa6558Iu92Iu9NlddddVVV1111VVXXXXVv4Tgqquuuuqqq6666n+Rv//7v/9tgBd7sRd7La666qqrrrrqqquuuuqqfwnBVVddddVVV1111f8i//AP//A7AK/zOq/z3lx11VVXXXXVVVddddVV/xKCq6666qqrrrrqqv9Fzp49eyvANddc8+AXe7EXe22uuuqqq6666qqrrrrqqheG4Kqrrrrqqquuuup/kfvuu+/Wf/iHf/htrrrqqquuuuqqq6666qoXBcFVV1111VVXXXXV/zK/9Vu/9T0A7/RO7/RZXHXVVVddddVVV1111VUvDJWrrrrqqquuuuqq/2X+4R/+4bcBzpw582Cuuuqqq6666qqrrrrqqheG4Kqrrrrqqquuuup/mfvuu+/Wf/iHf/jta6655sEv9mIv9tpcddVVV1111VVXXXXVVS8IwVVXXXXVVVddddX/Yi/2Yi/2Wlx11VVXXXXVVVddddVVLwjBVVddddVVV1111f9CP/IjP/I5AC/+4i/+2lx11VVXXXXVVVddddVVLwiVq6666qqrrrrqqv+Fzp49eyvAmTNnHsxVV1111VVXXXXVVVdd9YIQXHXVVVddddVVV/0vdN999936D//wD799zTXXPPjFXuzFXpurrrrqqquuuuqqq6666vkhuOqqq6666qqrrvpf6u///u9/G+DFXuzFXourrrrqqquuuuqqq6666vkhuOqqq6666qqrrvpf6h/+4R9+B+DFX/zFX5urrrrqqquuuuqqq6666vmhctVVV1111VVXXfW/1NmzZ28FOHPmzIO56qqrrrrqqquuuuqqq54fgquuuuqqq6666qr/pe67775b/+Ef/uG3r7nmmge/2Iu92Gtz1VVXXXXVVVddddVVVz03gquuuuqqq6666qr/xf7+7//+twFe7MVe7LW46qqrrrrqqquuuuqqq54bwVVXXXXVVVddddX/Yv/wD//wOwCv8zqv895cddVVV1111VVXXXXVVc+N4Kqrrrrqqquuuup/sbNnz94KcM011zz4mmuueTBXXXXVVVddddVVV1111QMRXHXVVVddddVVV/0vdt999936D//wD78NcObMmQdz1VVXXXXVVVddddVVVz0QwVVXXXXVVVddddX/cn//93//2wDv9E7v9FlcddVVV1111VVXXXXVVQ9EcNVVV1111VVXXfW/3G//9m9/D8CZM2cezFVXXXXVVVddddVVV131QARXXXXVVVddddVV/8vdd999twJcc801D36xF3ux1+aqq6666qqrrrrqqquuuh/BVVddddVVV1111f8B//AP//DbXHXVVVddddVVV1111VXPjeCqq6666qqrrrrq/4C///u//22AF3uxF3strrrqqquuuuqqq6666qr7EVx11VVXXXXVVVf9H/AP//APvwPw4i/+4q/NVVddddVVV1111VVXXXU/KlddddVVV1111VX/B5w9e/ZWgDNnzjyYq6666qqrrrrqqquuuup+BFddddVVV1111VX/B9x33323/sM//MNvX3PNNQ9+sRd7sdfmqquuuuqqq6666qqrrgIguOqqq6666qqrrvo/4r777rsV4MVe7MVei6uuuuqqq6666qqrrroKgOCqq6666qqrrrrq/4jf+q3f+h6AF3/xF39trrrqqquuuuqqq6666ioAKlddddVVV1111VX/R5w9e/ZWgDNnzjyYq6666qqrrrrqqquuugqA4Kqrrrrqqquuuur/iPvuu+9WgGuuuebB11xzzYO56qqrrrrqqquuuuqqqwiuuuqqq6666qqr/g/5h3/4h98GOHPmzIO56qqrrrrqqquuuuqqqwiuuuqqq6666qqr/g/5+7//+98GeLEXe7HX4qqrrrrqqquuuuqqq64iuOqqq6666qqrrvo/5B/+4R9+B+DFX/zFX5urrrrqqquuuuqqq666ispVV1111VVXXXXV/yFnz569FeDMmTMP5qqrrrrqqquuuuqqq64iuOqqq6666qqrrvo/5L777rv1H/7hH377mmuuefCLvdiLvTZXXXXVVVddddVVV131/xvBVVddddVVV1111f9R11xzzYO56qqrrrrqqquuuuqq/98Irrrqqquuuuqqq/6P+fu///vfBnid13md9+Kqq6666qqrrrrqqqv+f6Ny1VVXXXXVVVdd9X/MP/zDP/wOwJkzZx7MVVddddVVV1111VVX/f9G5aqrrrrqqquuuur/mLNnz94KcM011zyYq6666qqrrrrqqquu+v+N4Kqrrrrqqquuuur/mPvuu+/Wf/iHf/htgBd7sRd7ba666qqrrrrqqquuuur/L4Krrrrqqquuuuqq/4P+/u///rcBXuzFXuy1uOqqq6666qqrrrrqqv+/CK666qqrrrrqqqv+D/qHf/iH3wF48Rd/8dfmqquuuuqqq6666qqr/v+ictVVV1111VVXXfV/0NmzZ28FOHPmzIO56qqrrrrqqquuuuqq/78Irrrqqquuuuqqq/4Puu+++2697777br3mmmse/GIv9mKvzVVXXXXVVVddddVVV/3/RHDVVVddddVVV131f9TZs2dv5aqrrrrqqquuuuqqq/5/I7jqqquuuuqqq676P+rv//7vfxvgxV7sxV6Lq6666qqrrrrqqquu+v+J4Kqrrrrqqquuuur/qH/4h3/4HYAXf/EXf22uuuqqq6666qqrrrrq/ycqV1111VVXXXXVVf/HnTlz5sFcddVVV1111VVXXXXV/09Urrrqqquuuuqqq/6POnv27K1cddVVV1111VVXXXXV/28EV1111VVXXXXVVf9H3Xfffbfed999t15zzTUPvuaaax7MVVddddVVV1111VVX/f9DcNVVV1111VVXXfV/2NmzZ28FOHPmzIO56qqrrrrqqquuuuqq/38Irrrqqquuuuqqq/4Pu++++24FeLEXe7HX4qqrrrrqqquuuuqqq/7/oXLVVVddddVVV131f9h99913K1ddddVVV1111VVXXfX/F8FVV1111VVXXXXV/2H/8A//8DsAL/7iL/7aXHXVVVddddVVV1111f8/VK666qqrrrrqqqv+Dzt79uytAGfOnHkwV1111VVXXXXVVVdd9f8Plauuuuqqq6666qr/B6655poHc9VVV1111VVXXXXVVf//EFx11VVXXXXVVVf9H3bffffd+g//8A+/DfBiL/Zir81VV1111VVXXXXVVVf9/0Llqquuuuqqq6666qqrrrrqqquuuuqqq676v4rgqquuuuqqq6666v+4v//7v/9tgBd7sRd7La666qqrrrrqqquuuur/FypXXXXVVVddddVV/8edPXv2GQDXXHPNg7nqqquuuuqqq6666qr/X6hcddVVV1111VVX/R9333333QpwzTXXPJirrrrqqquuuuqqq676/4XKVVddddVVV1111f9xZ8+evRXgzJkzD+aqq6666qqrrrrqqqv+f6Fy1VVXXXXVVVdd9X/cfffddyvANddc82Cuuuqqq6666qqrrrrq/xeCq6666qqrrrrqqv8H/uEf/uG3AV7sxV7stbnqqquuuuqqq6666qr/Pwiuuuqqq6666qqr/h+55pprHsxVV1111VVXXXXVVVf9/0Fw1VVXXXXVVVdd9f/A3//93/82wJkzZx7EVVddddVVV1111VVX/f9BcNVVV1111VVXXfX/wD/8wz/8DsCLv/iLvzZXXXXVVVddddVVV131/weVq6666qqrrrrqqv9Hzpw582Cuuuqqq6666qqrrrrq/w8qV1111VVXXXXVVf8PnD179lauuuqqq6666qqrrrrq/x+Cq6666qqrrrrqqv8H7rvvvlvvu+++W6+55poHX3PNNQ/mqquuuuqqq6666qqr/n8guOqqq6666qqrrvp/4uzZs7cCnDlz5sFcddVVV1111VVXXXXV/w8EV1111VVXXXXVVf9P3HfffbcCvNiLvdhrcdVVV1111VVXXXXVVf8/ULnqqquuuuqqq676f+K+++67lauuuuqqq6666qqrrvr/heCqq6666qqrrrrq/4l/+Id/+B2AF3/xF39trrrqqquuuuqqq6666v8HKlddddVVV1111VX/T5w9e/ZWgDNnzjyYq6666qqrrrrqqquu+v+BylVXXXXVVVddddX/M9dcc82Dueqqq6666qqrrrrqqv8fCK666qqrrrrqqqv+n7jvvvtu/Yd/+IffBrjmmmsezFVXXXXVVVddddVVV/3fR3DVVVddddVVV131/9CZM2cezFVXXXXVVVddddVVV/3fR+Wqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxXBVVddddVVV1111f8j9913360A11xzzYO56qqrrrrqqquuuuqq//uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXV/yP33XffrQBnzpx5EFddddVVV1111VVXXfV/H5Wrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXfX/yNmzZ58BcM011zyYq6666qqrrrrqqquu+r+PylVXXXXVVVddddX/Q/fdd9+tXHXVVVddddVVV1111f99VK666qqrrrrqqqv+H3mxF3ux1wI4e/bsM7jqqquuuuqqq6666qr/+6hcddVVV1111VVX/T/yYi/2Yq/NVVddddVVV1111VVX/f9B5aqrrrrqqquuuur/oX/4h3/4ba666qqrrrrqqquuuur/PipXXXXVVVddddVV/49cc801Dwa47777buWqq6666qqrrrrqqqv+76Ny1VVXXXXVVVdd9f/E67zO67w3wG/91m99N1ddddVVV1111VVXXfX/A5Wrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVV/0+82Iu92GsB/MM//MPvcNVVV1111VVXXXXVVf8/ULnqqquuuuqqq676f+LFXuzFXhvgH/7hH36bq6666qqrrrrqqquu+v+BylVXXXXVVVddddX/E9dcc82DAe67775bueqqq6666qqrrrrqqv8fqFx11VVXXXXVVVf9P3DNNdc8GOC+++67lauuuuqqq6666qqrrvr/g8pVV1111VVXXXXV/wMv9mIv9toA//AP//DbXHXVVVddddVVV1111f8fVK666qqrrrrqqqv+H3ixF3ux1wK47777buWqq6666qqrrrrqqqv+/6By1VVXXXXVVVdd9f/I2bNnn8FVV1111VVXXXXVVVf9/0Hlqquuuuqqq6666v+BF3uxF3ttgH/4h3/4ba666qqrrrrqqquuuur/DypXXXXVVVddddVV/w9cc801Dwa47777buWqq6666qqrrrrqqqv+/6By1VVXXXXVVVdd9X/c67zO67w3wD/8wz/8NlddddVVV1111VVXXfX/C5Wrrrrqqquuuuqq/yfuu+++W7nqqquuuuqqq6666qr/X6hcddVVV1111VVX/R/3Yi/2Yq8F8A//8A+/w1VXXXXVVVddddVVV/3/QuWqq6666qqrrrrq/7gXe7EXe22uuuqqq6666qqrrrrq/ycqV1111VVXXXXVVf9P/MM//MNvc9VVV1111VVXXXXVVf+/ULnqqquuuuqqq676P+6aa655MMB99913K1ddddVVV1111VVXXfX/C5Wrrrrqqquuuuqq/8Ne53Ve570Bfuu3fuu7ueqqq6666qqrrrrqqv9/qFx11VVXXXXVVVf9H3bmzJkHcdVVV1111VVXXXXVVf9/Ubnqqquuuuqqq676P+yaa655MMA//MM//A5XXXXVVVddddVVV131/w+Vq6666qqrrrrqqv/DXuzFXuy1Af7hH/7ht7nqqquuuuqqq6666qr/f6hcddVVV1111VVX/R92zTXXPBjgvvvuu5Wrrrrqqquuuuqqq676/4fKVVddddVVV1111f9RL/ZiL/baAPfdd9+tXHXVVVddddVVV1111f9PVK666qqrrrrqqqv+j7rmmmseDPAP//APv81VV1111VVXXXXVVVf9/0Tlqquuuuqqq6666v+oF3uxF3stgPvuu+9Wrrrqqquuuuqqq6666v8nKlddddVVV1111VX/x509e/YZXHXVVVddddVVV1111f9PVK666qqrrrrqqqv+j3qxF3ux1wb4h3/4h9/mqquuuuqqq6666qqr/n+ictVVV1111VVXXfV/1DXXXPNggPvuu+9Wrrrqqquuuuqqq6666v8nKlddddVVV1111VX/B73O67zOewP8wz/8w29z1VVXXXXVVVddddVV/39Rueqqq6666qqrrvo/7L777ruVq6666qqrrrrqqquu+v+LylVXXXXVVVddddX/QS/2Yi/2WgD/8A//8DtcddVVV1111VVXXXXV/19Urrrqqquuuuqqq/4PerEXe7HX5qqrrrrqqquuuuqqq66ictVVV1111VVXXfV/2D/8wz/8NlddddVVV1111VVXXfX/F5Wrrrrqqquuuuqq/4OuueaaBwPcd999t3LVVVddddVVV1111VX/f1G56qqrrrrqqquu+j/mdV7ndd4b4Ld+67e+m6uuuuqqq6666qqrrvr/jcpVV1111VVXXXXV/zFnzpx5EFddddVVV1111VVXXXUVAJWrrrrqqquuuuqq/2OuueaaBwP8wz/8w+9w1VVXXXXVVVddddVV/79Rueqqq6666qqrrvo/5sVe7MVeG+Af/uEffpurrrrqqquuuuqqq676/43KVVddddVVV1111f8x11xzzYMB7rvvvlu56qqrrrrqqquuuuqq/9+oXHXVVVddddVVV/0f8mIv9mKvDXDffffdylVXXXXVVVddddVVV11F5aqrrrrqqquuuur/kGuuuebBAP/wD//w21x11VVXXXXVVVddddVVVK666qqrrrrqqqv+D3mxF3ux1wK47777buWqq6666qqrrrrqqquuonLVVVddddVVV131f8g111zzYICzZ88+g6uuuuqqq6666qqrrrqKylVXXXXVVVddddX/IS/2Yi/22gD/8A//8NtcddVVV1111VVXXXXVVVSuuuqqq6666qqr/o94ndd5nfcG+K3f+q3vvu+++27lqquuuuqqq6666qqrrqJy1VVXXXXVVVdd9X/Ei73Yi70WwD/8wz/8DlddddVVV1111VVXXXUVAJWrrrrqqquuuuqq/yNe53Ve570B/uEf/uG3ueqqq6666qqrrrrqqqsAqFx11VVXXXXVVVf9H/A6r/M67w3wW7/1W99933333cpVV1111VVXXXXVVVddBUDlqquuuuqqq6666v+AF3uxF3stgH/4h3/4Ha666qqrrrrqqquuuuqq+1G56qqrrrrqqquu+j/gdV7ndd4b4B/+4R9+m6uuuuqqq6666qqrrrrqflSuuuqqq6666qqr/pd7ndd5nfcG+K3f+q3vvu+++27lqquuuuqqq6666qqrrroflauuuuqqq6666qr/5V7sxV7stQD+4R/+4Xe46qqrrrrqqquuuuqqqx6IylVXXXXVVVddddX/cq/zOq/z3gD/8A//8NtcddVVV1111VVXXXXVVQ9E5aqrrrrqqquuuup/sdd5ndd5b4Df+q3f+u777rvvVq666qqrrrrqqquuuuqqB6Jy1VVXXXXVVVdd9b/Yi73Yi70WwD/8wz/8DlddddVVV1111VVXXXXVc6Ny1VVXXXXVVVdd9b/Y67zO67w3wD/8wz/8NlddddVVV1111VVXXXXVc6Ny1VVXXXXVVVdd9b/U67zO67w3wG/91m9993333XcrV1111VVXXXXVVVddddVzo3LVVVddddVVV131v9SLvdiLvRbAP/zDP/wOV1111VVXXXXVVVddddXzQ+Wqq6666qqrrrrqf6nXeZ3XeW+Af/iHf/htrrrqqquuuuqqq6666qrnh8pVV1111VVXXXXV/0Kv8zqv894A//AP//Db9913361cddVVV1111VVXXXXVVc8Plauuuuqqq6666qr/hV7sxV7stQB+67d+63u46qqrrrrqqquuuuqqq14QKlddddVVV1111VX/C73Yi73YawP8wz/8w29z1VVXXXXVVVddddVVV70gVK666qqrrrrqqqv+l3md13md977mmmse/A//8A+/fd99993KVVddddVVV1111VVXXfWCULnqqquuuuqqq676X+bFXuzFXgvgt37rt76Hq6666qqrrrrqqquuuuqFoXLVVVddddVVV131v8yLvdiLvTbAP/zDP/w2V1111VVXXXXVVVddddULQ+Wqq6666qqrrrrqf5HXeZ3Xee9rrrnmwQD33XffrVx11VVXXXXVVVddddVVLwyVq6666qqrrrrqqv9FXuzFXuy1AH7rt37ru7nqqquuuuqqq6666qqr/iVUrrrqqquuuuqqq/4XebEXe7HXBvjRH/3Rz+Gqq6666qqrrrrqqquu+pdQueqqq6666qqrrvpf4nVe53Xe+5prrnkwwH333XcrV1111VVXXXXVVVddddW/hMpVV1111VVXXXXV/xIv9mIv9loAv/Vbv/XdXHXVVVddddVVV1111VUvCipXXXXVVVddddVV/0u82Iu92GsD/OiP/ujncNVVV1111VVXXXXVVVe9KKhcddVVV1111VVX/S/wOq/zOu99zTXXPBjgvvvuu5Wrrrrqqquuuuqqq6666kVB5aqrrrrqqquuuup/gRd7sRd7LYDf+q3f+m6uuuqqq6666qqrrrrqqhcVlauuuuqqq6666qr/BV7sxV7stQF+67d+63u46qqrrrrqqquuuuqqq15UVK666qqrrrrqqqv+h3ud13md977mmmseDPAP//APv81VV1111VVXXXXVVVdd9aKictVVV1111VVXXfU/3Iu92Iu9FsBv/dZvfTdXXXXVVVddddVVV1111b8Glauuuuqqq6666qr/4V7sxV7stQF+67d+63u46qqrrrrqqquuuuqqq/41qFx11VVXXXXVVVf9D/Y6r/M6733NNdc8GOAf/uEffpurrrrqqquuuuqqq6666l+DylVXXXXVVVddddX/YC/2Yi/2WgC/9Vu/9d1cddVVV1111VVXXXXVVf9aVK666qqrrrrqqqv+B3uxF3ux1wb4rd/6re/hqquuuuqqq6666qqrrvrXonLVVVddddVVV131P9SLvdiLvfY111zzYIB/+Id/+G2uuuqqq6666qqrrrrqqn8tKlddddVVV1111VX/Q73O67zOewH81m/91ndz1VVXXXXVVVddddVVV/1bULnqqquuuuqqq676H+rFXuzFXhvgt37rt76Hq6666qqrrrrqqquuuurfgspVV1111VVXXXXV/0Av9mIv9trXXHPNgwH+4R/+4be56qqrrrrqqquuuuqqq/4tqFx11VVXXXXVVVf9D/Q6r/M67wXwW7/1W9/NVVddddVVV1111VVXXfVvReWqq6666qqrrrrqf6AXe7EXe22A3/qt3/oerrrqqquuuuqqq6666qp/KypXXXXVVVddddVV/wNdc801Dwb4h3/4h9/mqquuuuqqq6666qqrrvq3onLVVVddddVVV131P8zrvM7rvDfAb/3Wb303V1111VVXXXXVVVddddW/B5Wrrrrqqquuuuqq/2He8R3f8bMAfuu3fut7uOqqq6666qqrrrrqqqv+PahcddVVV1111VVX/Q9zzTXXPBjgH/7hH36bq6666qqrrrrqqquuuurfg8pVV1111VVXXXXV/yCv8zqv894Av/Vbv/XdXHXVVVddddVVV1111VX/XlSuuuqqq6666qqr/gd5x3d8x88C+Id/+Iff4aqrrrrqqquuuuqqq67696Jy1VVXXXXVVVdd9T/Ei73Yi732Nddc82CA3/qt3/purrrqqquuuuqqq6666qp/LypXXXXVVVddddVV/0O8zuu8znsB/NZv/dZ3c9VVV1111VVXXXXVVVf9R6By1VVXXXXVVVdd9T/E67zO67w3wI/+6I9+DlddddVVV1111VVXXXXVfwQqV1111VVXXXXVVf8DvM7rvM57A/zWb/3Wd9933323ctVVV1111VVXXXXVVVf9R6By1VVXXXXVVVdd9T/A67zO67wXwD/8wz/8DlddddVVV1111VVXXXXVfxQqV1111VVXXXXVVf/NXuzFXuy1X+zFXuy1AX7rt37ru7nqqquuuuqqq6666qqr/qNQueqqq6666qqrrvpv9jqv8zrvBfBbv/Vb381VV1111VVXXXXVVVdd9R+JylVXXXXVVVddddV/s9d5ndd5b4Af/dEf/Ryuuuqqq6666qqrrrrqqv9IVK666qqrrrrqqqv+G73O67zOewP81m/91nffd999t3LVVVddddVVV1111VVX/UeictVVV1111VVXXfXf6B3f8R0/C+Af/uEffoerrrrqqquuuuqqq6666j8alauuuuqqq6666qr/Ji/2Yi/22tdcc82DAX7rt37ru7nqqquuuuqqq6666qqr/qNRueqqq6666qqrrvpv8jqv8zrvBfBbv/Vb381VV1111VVXXXXVVVdd9Z+BylVXXXXVVVddddV/k9d5ndd5b4Af/dEf/Ryuuuqqq6666qqrrrrqqv8MVK666qqrrrrqqqv+G7zO67zOewP81m/91nffd999t3LVVVddddVVV1111VVX/WegctVVV1111VVXXfXf4B3f8R0/C+C3fuu3voerrrrqqquuuuqqq6666j8Llauuuuqqq6666qr/Yq/zOq/z3tdcc82DAf7hH/7ht7nqqquuuuqqq6666qqr/rNQueqqq6666qqrrvov9mIv9mKvBfAjP/Ijn81VV1111VVXXXXVVVdd9Z+JylVXXXXVVVddddV/sdd5ndd5b4Df/u3f/h6uuuqqq6666qqrrrrqqv9MVK666qqrrrrqqqv+C73O67zOewP81m/91nffd999t3LVVVddddVVV1111VVX/WeictVVV1111VVXXfVf6B3f8R0/C+C3fuu3voerrrrqqquuuuqqq6666j8blauuuuqqq6666qr/Iq/zOq/z3tdcc82DAf7hH/7ht7nqqquuuuqqq6666qqr/rNRueqqq6666qqrrvov8mIv9mKvBfD1X//178NVV1111VVXXXXVVVdd9V+BylVXXXXVVVddddV/kdd5ndd5b4B/+Id/+G2uuuqqq6666qqrrrrqqv8KVK666qqrrrrqqqv+C7zjO77jZwH81m/91nffd999t3LVVVddddVVV1111VVX/VegctVVV1111VVXXfVf4HVe53XeG+C3fuu3voerrrrqqquuuuqqq6666r8Klauuuuqqq6666qr/ZK/zOq/z3tdcc82D77vvvlv/4R/+4be56qqrrrrqqquuuuqqq/6rULnqqquuuuqqq676T/Y6r/M67wXwoz/6o5/DVVddddVVV1111VVXXfVficpVV1111VVXXXXVf7IXe7EXe22Af/iHf/htrrrqqquuuuqqq6666qr/SlSuuuqqq6666qqr/hO94zu+42cB/NZv/dZ333fffbdy1VVXXXXVVVddddVVV/1XonLVVVddddVVV131n+h1Xud13hvgt37rt76Hq6666qqrrrrqqquuuuq/GpWrrrrqqquuuuqq/ySv8zqv897XXHPNg++7775b/+Ef/uG3ueqqq6666qqrrrrqqqv+q1G56qqrrrrqqquu+k/yOq/zOu8F8KM/+qOfw1VXXXXVVVddddVVV13134HKVVddddVVV1111X+SF3uxF3ttgN/6rd/6bq666qqrrrrqqquuuuqq/w5Urrrqqquuuuqqq/4TfPiHf/h3AfzWb/3Wd3PVVVddddVVV1111VVX/XehctVVV1111VVXXfWf4MVe7MVeG+C3fuu3voerrrrqqquuuuqqq6666r8Llauuuuqqq6666qr/YK/zOq/z3tdcc82D/+Ef/uG3/+Ef/uG3ueqqq6666qqrrrrqqqv+u1C56qqrrrrqqquu+g/2Oq/zOu8F8Fu/9Vvfw1VXXXXVVVddddVVV13134nKVVddddVVV1111X+ga6655sEv9mIv9toAv/Vbv/XdXHXVVVddddVVV1111VX/nahcddVVV1111VVX/Qd6x3d8x88C+K3f+q3v5qqrrrrqqquuuuqqq67670blqquuuuqqq6666j/Qi73Yi702wG/91m99D1ddddVVV1111VVXXXXVfzcqV1111VVXXXXVVf9BXud1Xue9r7nmmgf/wz/8w2//wz/8w29z1VVXXXXVVVddddVVV/13o3LVVVddddVVV131H+R1Xud13gvgt37rt76Hq6666qqrrrrqqquuuup/AipXXXXVVVddddVV/wFe7MVe7LVf7MVe7LUBfuu3fuu7ueqqq6666qqrrrrqqqv+J6By1VVXXXXVVVdd9R/gdV7ndd4L4Ld+67e+m6uuuuqqq6666qqrrrrqfwoqV1111VVXXXXVVf8BXud1Xue9AX70R3/0c7jqqquuuuqqq6666qqr/qegctVVV1111VVXXfXv9I7v+I6fBfBbv/Vb333ffffdylVXXXXVVVddddVVV131PwWVq6666qqrrrrqqn+n13md13lvgN/6rd/6Hq666qqrrrrqqquuuuqq/0moXHXVVVddddVVV/07vM7rvM57X3PNNQ/+h3/4h9/+h3/4h9/mqquuuuqqq6666qqrrvqfhMpVV1111VVXXXXVv8PrvM7rvBfAb/3Wb30PV1111VVXXXXVVVddddX/NFSuuuqqq6666qqr/o1e7MVe7LVf7MVe7LUBfuu3fuu7ueqqq6666qqrrrrqqqv+p6Fy1VVXXXXVVVdd9W/0Oq/zOu8F8CM/8iOfzVVXXXXVVVddddVVV131PxGVq6666qqrrrrqqn+j13md13lvgN/+7d/+Hq666qqrrrrqqquuuuqq/4moXHXVVVddddVVV/0bfPiHf/h3AfzWb/3Wd9933323ctVVV1111VVXXXXVVVf9T0Tlqquuuuqqq6666t/gxV7sxV4b4Ld+67e+h6uuuuqqq6666qqrrrrqfyoqV1111VVXXXXVVf9Kr/M6r/Pe11xzzYP/4R/+4bf/4R/+4be56qqrrrrqqquuuuqqq/6nonLVVVddddVVV131r/Q6r/M67wXwW7/1W9/DVVddddVVV1111VVXXfU/GZWrrrrqqquuuuqqf4XXeZ3Xee8Xe7EXe22A3/qt3/purrrqqquuuuqqq6666qr/yahcddVVV1111VVX/Su8zuu8znsB/MiP/Mhnc9VVV1111VVXXXXVVVf9T0flqquuuuqqq6666l/hxV7sxV4b4Ld/+7e/h6uuuuqqq6666qqrrrrqfzoqV1111VVXXXXVVS+iD//wD/8ugN/6rd/67vvuu+9Wrrrqqquuuuqqq6666qr/6ahcddVVV1111VVXvYhe53Ve570Bfuu3fut7uOqqq6666qqrrrrqqqv+N6By1VVXXXXVVVdd9SJ4ndd5nfcG+Id/+Iff/od/+Iff5qqrrrrqqquuuuqqq67634DKVVddddVVV1111YvgHd/xHT8L4Ld+67e+h6uuuuqqq6666qqrrrrqfwsqV1111VVXXXXVVf+C13md13nva6655sEAv/Vbv/XdXHXVVVddddVVV1111VX/W1C56qqrrrrqqquu+he8zuu8znsBfP3Xf/37cNVVV1111VVXXXXVVVf9b0Llqquuuuqqq6666oW45pprHvxiL/Zirw3wD//wD7/NVVddddVVV1111VVXXfW/CZWrrrrqqquuuuqqF+Id3/EdPwvgt37rt777vvvuu5Wrrrrqqquuuuqqq6666n8TKlddddVVV1111VUvxOu8zuu8N8Bv/dZvfQ9XXXXVVVddddVVV1111f82VK666qqrrrrqqqtegNd5ndd5b4B/+Id/+O1/+Id/+G2uuuqqq6666qqrrrrqqv9tqFx11VVXXXXVVVe9AO/4ju/4WQA/8iM/8jlcddVVV1111VVXXXXVVf8bUbnqqquuuuqqq656Pl7ndV7nva+55poHA/zDP/zDb3PVVVddddVVV1111VVX/W9E5aqrrrrqqquuuuqZXud1Xue9eabXeZ3XeS+A3/qt3/purrrqqquuuuqqq6666qr/rdCDHvQgrrrqqquuuuqqqwB+4id+wjwfb/d2byeuuuqqq6666qqrrrrqqv+NqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVM/3Wb/3Wd/NML/ZiL/ba11xzzYO56qqrrrrqqquuuuqqq/43o3LVVVddddVVV131TF//9V//PjzTi73Yi732537u5/7WfffddytXXXXVVVddddVVV1111f9WlOPHj3PVVVddddVVV1313M6ePXvri7/4i7/2Qx7ykJc+e/bsM2699da/5qqrrrrqqquuuuqqq67634bgqquuuuqqq6666gX4kR/5kc8BeMd3fMfP4qqrrrrqqquuuuqqq67634hy/Phxrrrqqquuuuqqq56fs2fP3vriL/7ir/2Qhzzkpc+ePfuMW2+99a+56qqrrrrqqquuuuqqq/43Ibjqqquuuuqqq656IX7kR37kcwDe8R3f8bO46qqrrrrqqquuuuqqq/63oRw/fpyrrrrqqquuuuqqF+Ts2bO3vviLv/hrP+QhD3nps2fPPuPWW2/9a6666qqrrrrqqquuuuqq/y0Irrrqqquuuuqqq/4Fv/Vbv/U9AO/4ju/4WVx11VVXXXXVVVddddVV/5tQjh8/zlVXXXXVVVddddULc3R0tPuQhzzkpR/ykIe89D/8wz/8ztmzZ2/lqquuuuqqq6666qqrrvrfgOCqq6666qqrrrrqX3Dffffd+lu/9VvfA/DhH/7h38VVV1111VVXXXXVVVdd9b8FwVVXXXXVVVddddWL4B/+4R9++7777rv1mmuuefCLvdiLvTZXXXXVVVddddVVV1111f8GBFddddVVV1111VUvgvvuu+/WH/3RH/0cgA//8A//Lq666qqrrrrqqquuuuqq/w0Irrrqqquuuuqqq15E//AP//Db9913363XXHPNg1/sxV7stbnqqquuuuqqq6666qqr/qejHD9+nKuuuuqqq6666qoXxeHh4e7R0dGlV3zFV3zra6655sG/9Vu/9T1cddVVV1111VVXXXXVVf+TEVx11VVXXXXVVVf9K/zDP/zDbwO82Iu92Gu/2Iu92Gtz1VVXXXXVVVddddVVV/1PRjl+/DhXXXXVVVddddVVL6rDw8Pds2fPPuMVX/EV3/qaa6558G/91m99D1ddddVVV1111VVXXXXV/1QEV1111VVXXXXVVf9K//AP//DbAC/2Yi/22i/2Yi/22lx11VVXXXXVVVddddVV/1NRjh8/zlVXXXXVVVddddW/xuHh4S7Ai7/4i7/2Nddc8+Df+q3f+h6uuuqqq6666qqrrrrqqv+JCK666qqrrrrqqqv+DX77t3/7ewBe7MVe7LVf7MVe7LW56qqrrrrqqquuuuqqq/4nohw/fpyrrrrqqquuuuqqf63Dw8Pda6655sEPechDXhrgT//0T3+Gq6666qqrrrrqqquuuup/GoKrrrrqqquuuuqqf6Mf/dEf/RyAF3uxF3vtF3uxF3ttrrrqqquuuuqqq6666qr/aSjHjx/nqquuuuqqq6666t/i8PBw95prrnnwi7/4i782wJ/+6Z/+DFddddVVV1111VVXXXXV/yQEV1111VVXXXXVVf8OP/qjP/o5AC/2Yi/22i/2Yi/22lx11VVXXXXVVVddddVV/5NQjh8/zlVXXXXVVVddddW/1eHh4e4111zz4Bd/8Rd/bYA//dM//Rmuuuqqq6666qqrrrrqqv8pCK666qqrrrrqqqv+nX70R3/0cwBe7MVe7LWvueaaB3PVVVddddVVV1111VVX/U9BOX78OFddddVVV1111VX/HoeHh7sv/uIv/toPechDXnpzc/P4n/7pn/4MV1111VVXXXXVVVddddX/BARXXXXVVVddddVV/wG+/uu//n0AXuzFXuy1ueqqq6666qqrrrrqqqv+p6AcP36cq6666qqrrrrqqn+vw8PD3Rd/8Rd/7Yc85CEvfc011zz4T//0T3+Gq6666qqrrrrqqquuuuq/G8FVV1111VVXXXXVf5Af+ZEf+RyAF3uxF3ttrrrqqquuuuqqq6666qr/CSjHjx/nqquuuuqqq6666j/C2bNnb33xF3/x137IQx7y0gD/8A//8DtcddVVV1111VVXXXXVVf+dCK666qqrrrrqqqv+A/3Ij/zI5wC8zuu8zntz1VVXXXXVVVddddVVV/13oxw/fpyrrrrqqquuuuqq/yhnz5699cVf/MVf+yEPechLnz179hm33nrrX3PVVVddddVVV1111VVX/XchuOqqq6666qqrrvoP9iM/8iOfA/CO7/iOn8VVV1111VVXXXXVVVdd9d+Jcvz4ca666qqrrrrqqqv+I509e/bWF3/xF3/thzzkIS999uzZZ9x6661/zVVXXXXVVVddddVVV13134Hgqquuuuqqq6666j/Bj/zIj3wOwDu+4zt+FlddddVVV1111VVXXXXVfxfK8ePHueqqq6666qqrrvqPJomHPOQhL/2Qhzzkpc+ePfuMW2+99a+56qqrrrrqqquuuuqqq/6rEVx11VVXXXXVVVf9J7jvvvtu/a3f+q3vAXjHd3zHz+Kqq6666qqrrrrqqquu+u9AOX78OFddddVVV1111VX/GY6OjnYf8pCHvPRDHvKQl/6Hf/iH3zl79uytXHXVVVddddVVV1111VX/lQiuuuqqq6666qqr/pPcd999t/7Wb/3W9wB8+Id/+Hdx1VVXXXXVVVddddVVV/1XI7jqqquuuuqqq676T/QP//APv33ffffdes011zz4xV7sxV6bq6666qqrrrrqqquuuuq/EuX48eNcddVVV1111VVX/Wc5PDzcPTo6uvSKr/iKb33NNdc8+Ld+67e+h6uuuuqqq6666qqrrrrqvwrBVVddddVVV1111X+yf/iHf/htgBd7sRd77Rd7sRd7ba666qqrrrrqqquuuuqq/yqU48ePc9VVV1111VVXXfWf6fDwcPfs2bPPeMVXfMW3vuaaax78W7/1W9/DVVddddVVV1111VVXXfVfgeCqq6666qqrrrrqv8A//MM//DbAi73Yi732i73Yi702V1111VVXXXXVVVddddV/Bcrx48e56qqrrrrqqquu+s92eHi4e/bs2We84iu+4ltfc801D/6t3/qt7+Gqq6666qqrrrrqqquu+s9GcNVVV1111VVXXfVf5B/+4R9+G+DFXuzFXvvFXuzFXpurrrrqqquuuuqqq6666j8b5fjx41x11VVXXXXVVVf9Vzg8PNy95pprHvyQhzzkpa+55poH/9Zv/db3cNVVV1111VVXXXXVVVf9ZyK46qqrrrrqqquu+i/0oz/6o58D8GIv9mKv/WIv9mKvzVVXXXXVVVddddVVV131n4ly/Phxrrrqqquuuuqqq/6rHB4e7l5zzTUPfshDHvLSAH/6p3/6M1x11VVXXXXVVVddddVV/1kIrrrqqquuuuqqq/6L/eiP/ujnALzYi73Ya7/4i7/4a3PVVVddddVVV1111VVX/WehHD9+nKuuuuqqq6666qr/SoeHh7vXXHPNg1/8xV/8tQH+9E//9Ge46qqrrrrqqquuuuqqq/4zEFx11VVXXXXVVVf9N/jRH/3RzwF48Rd/8de55pprHsxVV1111VVXXXXVVVdd9Z+Bcvz4ca666qqrrrrqqqv+qx0eHu6++Iu/+Gs/+MEPfunNzc3jf/qnf/ozXHXVVVddddVVV1111VX/0Qiuuuqqq6666qqr/pt8/dd//fsAvNiLvdhrX3PNNQ/mqquuuuqqq6666qqrrvqPRjl+/DhXXXXVVVddddVV/x0ODw93X+zFXuy1H/KQh7z05ubm8T/90z/9Ga666qqrrrrqqquuuuqq/0gEV1111VVXXXXVVf+Nvv7rv/69AV7sxV7stbnqqquuuuqqq6666qqr/qNRjh8/zlVXXXXVVVddddV/l6Ojo0sv/uIv/toPechDXvqaa6558J/+6Z/+DFddddVVV1111VVXXXXVfxSCq6666qqrrrrqqv9mP/IjP/I5AC/2Yi/22lx11VVXXXXVVVddddVV/5Eox48f56qrrrrqqquuuuq/09mzZ2998Rd/8dd+yEMe8tJnz559xq233vrXXHXVVVddddVVV1111VX/EQiuuuqqq6666qqr/gf4kR/5kc8BeMd3fMfP4qqrrrrqqquuuuqqq676j0I5fvw4V1111VVXXXXVVf/dzp49e+uLv/iLv/ZDHvKQlz579uwzbr311r/mqquuuuqqq6666qqrrvr3Irjqqquuuuqqq676H+JHfuRHPgfgnd7pnT6bq6666qqrrrrqqquuuuo/AuX48eNcddVVV1111VVX/U9w9uzZW1/8xV/8tR/84Ae/9NmzZ59x6623/jVXXXXVVVddddVVV1111b8HwVVXXXXVVVddddX/IL/1W7/1PQDv+I7v+FlcddVVV1111VVXXXXVVf9elOPHj3PVVVddddVVV131P8XR0dHugx/84Jd+yEMe8tL/8A//8Dtnz569lauuuuqqq6666qqrrrrq34rgqquuuuqqq6666n+Q++6779bf/u3f/h6AD//wD/8urrrqqquuuuqqq6666qp/D4Krrrrqqquuuuqq/2H+/u///rfuu+++W6+55poHv9iLvdhrc9VVV1111VVXXXXVVVf9WxFcddVVV1111VVX/Q9z9uzZZ/zoj/7o5wB8+Id/+Hdx1VVXXXXVVVddddVVV/1bEVx11VVXXXXVVVf9D/QP//APv33ffffdes011zz4xV7sxV6bq6666qqrrrrqqquuuurfgnL8+HGuuuqqq6666qqr/qc5PDzcPTo6uvSKr/iKb33NNdc8+Ld+67e+h6uuuuqqq6666qqrrrrqX4vgqquuuuqqq6666n+of/iHf/htgBd7sRd77Rd/8Rd/ba666qqrrrrqqquuuuqqfy3K8ePHueqqq6666qqrrvqf6PDwcPfs2bPPeMVXfMW3vuaaax7yW7/1W9/NVVddddVVV1111VVXXfWvQXDVVVddddVVV131P9g//MM//DbAi73Yi73Wi73Yi702V1111VVXXXXVVVddddW/BuX48eNcddVVV1111VVX/U91eHi4C/DiL/7ir33NNdc8+Ld+67e+h6uuuuqqq6666qqrrrrqRUVw1VVXXXXVVVdd9T/cb//2b38PwIu92Iu99ou92Iu9NlddddVVV1111VVXXXXVi4py/Phxrrrqqquuuuqqq/4nOzw83L3mmmse/JCHPOSlAf70T//0Z7jqqquuuuqqq6666qqrXhQEV1111VVXXXXVVf8L/MiP/MhnA7zYi73Ya7/Yi73Ya3PVVVddddVVV1111VVXvSgox48f56qrrrrqqquuuup/uqOjo0vXXHPNg1/8xV/8tQH+9E//9Ge46qqrrrrqqquuuuqqq/4lBFddddVVV1111VX/S/zoj/7o5wC82Iu92Gu/2Iu92Gtz1VVXXXXVVVddddVVV/1LKMePH+eqq6666qqrrrrqf4PDw8Pda6655sEv/uIv/toAf/qnf/ozXHXVVVddddVVV1111VUvDMFVV1111VVXXXXV/yI/+qM/+jkAL/ZiL/ba11xzzYO56qqrrrrqqquuuuqqq14YyvHjx7nqqquuuuqqq6763+Lw8HD3xV/8xV/7IQ95yEtvbm4e/9M//dOf4aqrrrrqqquuuuqqq656QQiuuuqqq6666qqr/pf5+q//+vcBePEXf/HX4aqrrrrqqquuuuqqq656YSjHjx/nqquuuuqqq6666n+Tw8PD3Rd/8Rd/7Qc/+MEvfc011zz4T//0T3+Gq6666qqrrrrqqquuuur5Ibjqqquuuuqqq676X+hHfuRHPgfgxV7sxV6bq6666qqrrrrqqquuuuoFoRw/fpyrrrrqqquuuuqq/23Onj1764u92Iu99kMe8pCXBviHf/iH3+Gqq6666qqrrrrqqquuem4EV1111VVXXXXVVf9L/eiP/uhnA7zO67zOe3PVVVddddVVV1111VVXPT+U48ePc9VVV1111VVXXfW/0dmzZ5/x4i/+4q/9kIc85KXPnj37jFtvvfWvueqqq6666qqrrrrqqqseiOCqq6666qqrrrrqf7Ef+ZEf+RyAd3zHd/wsrrrqqquuuuqqq6666qrnRjl+/DhXXXXVVVddddVV/1udPXv21hd/8Rd/7Yc85CEvffbs2Wfceuutf81VV1111VVXXXXVVVdddT+Cq6666qqrrrrqqv/lfuRHfuRzAN7xHd/xs7jqqquuuuqqq6666qqrHohy/Phxrrrqqquuuuqqq/43k8RDHvKQl37IQx7y0mfPnn3Grbfe+tdcddVVV1111VVXXXXVVQAEV1111VVXXXXVVf/L3Xfffbf+1m/91vcAvNM7vdNnc9VVV1111VVXXXXVVVfdj3L8+HGuuuqqq6666qqr/rc7OjrafchDHvLSD37wg1/6H/7hH37n7Nmzt3LVVVddddVVV1111VVXEVx11VVXXXXVVVf9H3Dffffd+lu/9VvfA/DhH/7h38VVV1111VVXXXXVVVddBUBw1VVXXXXVVVdd9X/EP/zDP/z2fffdd+s111zz4Bd7sRd7ba666qqrrrrqqquuuuoqyvHjx7nqqquuuuqqq676v+Dw8HD36Ojo0iu+4iu+9TXXXPPg3/qt3/oerrrqqquuuuqqq6666v83gquuuuqqq6666qr/Q/7+7//+twBe7MVe7LVf7MVe7LW56qqrrrrqqquuuuqq/98ox48f56qrrrrqqquuuur/iqOjo0tnz559xiu+4iu+9TXXXPPg3/qt3/oerrrqqquuuuqqq6666v8vgquuuuqqq6666qr/Y/7hH/7htwFe7MVe7LVf7MVe7LW56qqrrrrqqquuuuqq/78ox48f56qrrrrqqquuuur/ksPDw92zZ88+4xVf8RXf+pprrnnwb/3Wb30PV1111VVXXXXVVVdd9f8TwVVXXXXVVVddddX/Qf/wD//w2wAv9mIv9tov/uIv/tpcddVVV1111VVXXXXV/0+U48ePc9VVV1111VVXXfV/zeHh4e4111zz4Ic85CEvfc011zzkt37rt76bq6666qqrrrrqqquu+v+H4Kqrrrrqqquuuur/qB/90R/9HIBrrrnmwS/2Yi/22lx11VVXXXXVVVddddX/P5Tjx49z1VVXXXXVVVdd9X/R4eHh7jXXXPPgF3uxF3ttgD/90z/9Ga666qqrrrrqqquuuur/F4Krrrrqqquuuuqq/8N+9Ed/9HMAXuzFXuy1X+zFXuy1ueqqq6666qqrrrrqqv9fKMePH+eqq6666qqrrrrq/6rDw8Pda6655sEv/uIv/toAf/qnf/ozXHXVVVddddVVV1111f8fBFddddVVV1111VX/x/3Ij/zIZwO82Iu92Gtfc801D+aqq6666qqrrrrqqqv+/6AcP36cq6666qqrrrrqqv/Ljo6OLr34i7/4az/kIQ956c3NzeN/+qd/+jNcddVVV1111VVXXXXV/w8EV1111VVXXXXVVf8PfP3Xf/37ALzYi73Ya19zzTUP5qqrrrrqqquuuuqqq/5/ILjqqquuuuqqq676f+C+++679R/+4R9++5prrnnwa7/2a78XV1111VVXXXXVVVdd9f8DwVVXXXXVVVddddX/Ez/yIz/yOQAv/uIv/tpcddVVV1111VVXXXXV/w9Urrrqqquuuuqqq/6fOHv27K0AZ86ceTBXXXXVVVddddVVV131/wPBVVddddVVV1111f8T9913363/8A//8NvXXHPNg1/8xV/8tbnqqquuuuqqq6666qr/+wiuuuqqq6666qqr/h967GMf+1pcddVVV1111VVXXXXV/30EV1111VVXXXXVVf+P/P3f//1vA7z4i7/463DVVVddddVVV1111VX/9xFcddVVV1111VVX/T/y27/9298DcM011zyYq6666qqrrrrqqquu+r+P4Kqrrrrqqquuuur/oTNnzjzommuueTBXXXXVVVddddVVV131fxvBVVddddVVV1111f8j9913363/8A//8NsAZ86ceTBXXXXVVVddddVVV131fxvBVVddddVVV1111f8zf//3f//bAC/2Yi/2Wlx11VVXXXXVVVddddX/bQRXXXXVVVddddVV/8/8wz/8w+8AvPiLv/hrc9VVV1111VVXXXXVVf+3Ubnqqquuuuqqq676f+bs2bO3Apw5c+bBXHXVVVddddVVV1111f9tBFddddVVV1111VX/z9x33323/v3f//1vX3PNNQ9+sRd7sdfmqquuuuqqq6666qqr/u8iuOqqq6666qqrrvp/7MVe7MVei6uuuuqqq6666qqrrvq/i+Cqq6666qqrrrrq/6Hf/u3f/h6AF3/xF39trrrqqquuuuqqq6666v8uKlddddVVV1111VX/D/393//9bwGcOXPmwVx11VVXXXXVVVddddX/XQRXXXXVVVddddVV/w+dPXv2GQDXXHPNg6+55poHc9VVV1111VVXXXXVVf83EVx11VVXXXXVVVf9P/UP//APvw1w5syZB3PVVVddddVVV1111VX/NxFcddVVV1111VVX/T/193//978N8GIv9mKvxVVXXXXVVVddddVVV/3fRHDVVVddddVVV131/9Q//MM//A7Ai7/4i782V1111VVXXXXVVVdd9X8Tlauuuuqqq6666qr/p86ePXsrwJkzZx7MVVddddVVV1111VVX/d9EcNVVV1111VVXXfX/1H333XfrP/zDP/z2Nddc8+AXe7EXe22uuuqqq6666qqrrrrq/x6Cq6666qqrrrrqqv/H7rvvvlsBXuzFXuy1uOqqq6666qqrrrrqqv97CK666qqrrrrqqqv+H/ut3/qt7wF48Rd/8dfmqquuuuqqq6666qqr/u+hctVVV1111VVXXfX/2NmzZ28FOHPmzIO56qqrrrrqqquuuuqq/3sIrrrqqquuuuqqq/4fu++++24FuOaaax58zTXXPJirrrrqqquuuuqqq676v4Xgqquuuuqqq6666v+5f/iHf/htgGuuuebBXHXVVVddddVVV1111f8tBFddddVVV1111VX/z/393//9bwM89rGPfS2uuuqqq6666qqrrrrq/xaCq6666qqrrrrqqv/n/uEf/uF3AF78xV/8dbjqqquuuuqqq6666qr/W6hcddVVV1111VVX/T939uzZWwGuueaaB3PVVVddddVVV1111VX/txBcddVVV1111VVX/T9333333foP//APv33mzJkHvdiLvdhrc9VVV1111VVXXXXVVf93EFx11VVXXXXVVVddxd///d//NsCLvdiLvRZXXXXVVVddddVVV131fwfBVVddddVVV1111VX8wz/8w+8AvPiLv/hrc9VVV1111VVXXXXVVf93ULnqqquuuuqqq666irNnz94KcObMmQdz1VVXXXXVVVddddVV/3cQXHXVVVddddVVV13Ffffdd+t999136zXXXPPgF3uxF3ttrrrqqquuuuqqq6666v8Ggquuuuqqq6666qqrLrvvvvtu5aqrrrrqqquuuuqqq/5vIbjqqquuuuqqq6666rJ/+Id/+G2AF3uxF3strrrqqquuuuqqq6666v8Ggquuuuqqq6666qqrLvuHf/iH3wZ4ndd5nffmqquuuuqqq6666qqr/m+gctVVV1111VVXXXXVZffdd9+tXHXVVVddddVVV1111f8tBFddddVVV1111VVXXXb27Nln/MM//MNvX3PNNQ9+sRd7sdfmqquuuuqqq6666qqr/vcjuOqqq6666qqrrrrqWf7+7//+twFe7MVe7LW46qqrrrrqqquuuuqq//0Irrrqqquuuuqqq656ln/4h3/4HYAXf/EXf22uuuqqq6666qqrrrrqfz8qV1111VVXXXXVVVc9y9mzZ28FOHPmzIO56qqrrrrqqquuuuqq//0Irrrqqquuuuqqq656lvvuu+/W++6779ZrrrnmwS/2Yi/22lx11VVXXXXVVVddddX/bgRXXXXVVVddddVVVz2Hs2fP3spVV1111VVXXXXVVVf930Bw1VVXXXXVVVddddVz+Pu///vfBnid13md9+Kqq6666qqrrrrqqqv+d6Ny1VVXXXXVVVddddVz+Id/+IffAXixF3ux1+aqq6666qqrrrrqqqv+d6Ny1VVXXXXVVVddddVzOHv27K0A11xzzYO56qqrrrrqqquuuuqq/90Irrrqqquuuuqqq656Dvfdd9+t//AP//DbAC/+4i/+2lx11VVXXXXVVVddddX/XgRXXXXVVVddddVVVz2Pv//7v/9tgMc+9rGvxVVXXXXVVVddddVVV/3vRXDVVVddddVVV1111fP4h3/4h98BePEXf/HX4aqrrrrqqquuuuqqq/73onLVVVddddVVV1111fM4e/bsrQDXXHPNg7nqqquuuuqqq6666qr/vQiuuuqqq6666qqrrnoe991336333XffrWfOnHnQi73Yi702V1111VVXXXXVVVdd9b8TwVVXXXXVVVddddVVz9fZs2dvBbjmmmsezFVXXXXVVVddddVVV/3vRHDVVVddddVVV1111fP193//978N8Dqv8zrvxVVXXXXVVVddddVVV/3vROWqq6666qqrrrrqqufr7NmzzwD4+7//+9/mqquuuuqqq6666qqr/neictVVV1111VVXXXXVC3XNNdc8mKuuuuqqq6666qqrrvrficpVV1111VVXXXXVVc/XmTNnHgRw33333cpVV1111VVXXXXVVVf970Tlqquuuuqqq6666qrn65prrnkwwNmzZ5/BVVddddVVV1111VVX/e9E5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVz9eLvdiLvTbAfffddytXXXXVVVddddVVV131vxOVq6666qqrrrrqqqteqLNnz97KVVddddVVV1111VVX/e9E5aqrrrrqqquuuuqq5+uaa655MMB99913K1ddddVVV1111VVXXfW/E5Wrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVVz2PF3uxF3ttgH/4h3/4Ha666qqrrrrqqquuuup/LypXXXXVVVddddVVVz2Pa6655sEA9913361cddVVV1111VVXXXXV/15Urrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV131PM6cOfMggPvuu+/pXHXVVVddddVVV1111f9eVK666qqrrrrqqquueh7XXHPNgwHOnj37DK666qqrrrrqqquuuup/LypXXXXVVVddddVVVz2Pa6655sFcddVVV1111VVXXXXV/35Urrrqqquuuuqqq656HmfOnHkwwD/8wz/8NlddddVVV1111VVXXfW/F5Wrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVVz2Pa6655sEA9913361cddVVV1111VVXXXXV/15Urrrqqquuuuqqq656Dtdcc82DAe67775bueqqq6666qqrrrrqqv/dqFx11VVXXXXVVVdd9RzOnDnzYICzZ8/eylVXXXXVVVddddVVV/3vRuWqq6666qqrrrrqqudwzTXXPBjgvvvuu5Wrrrrqqquuuuqqq676343KVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquew4u92Iu9FsA//MM//A5XXXXVVVddddVVV131vxuVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVc9h2uuuebBAPfdd9+tXHXVVVddddVVV1111f9uVK666qqrrrrqqquueg5nzpx5MMDZs2dv5aqrrrrqqquuuuqqq/53o3LVVVddddVVV1111XO45pprHgxw33333cpVV1111VVXXXXVVVf970blqquuuuqqq6666qrn8Q//8A+/zVVXXXXVVVddddVVV/3vR+Wqq6666qqrrrrqqmd5ndd5nfcGuO+++27lqquuuuqqq6666qqr/vejctVVV1111VVXXXXVs5w5c+ZBXHXVVVddddVVV1111f8dVK666qqrrrrqqquuepZrrrnmwQD/8A//8DtcddVVV1111VVXXXXV/35Urrrqqquuuuqqq656lhd7sRd7bYB/+Id/+G2uuuqqq6666qqrrrrqfz8qV1111VVXXXXVVVc9yzXXXPNggPvuu+9Wrrrqqquuuuqqq6666n8/KlddddVVV1111VVXXfY6r/M67wXwW7/1W9/NVVddddVVV1111VVX/d9A5aqrrrrqqquuuuqqy86cOfNggPvuu+9Wrrrqqquuuuqqq6666v8GKlddddVVV1111VVXXXbNNdc8GODs2bPP4Kqrrrrqqquuuuqqq/5voHLVVVddddVVV1111WUv9mIv9toA//AP//DbXHXVVVddddVVV1111f8NVK666qqrrrrqqquuuuyaa655MMB99913K1ddddVVV1111VVXXfV/A5Wrrrrqqquuuuqqq3id13md9wb4rd/6re/mqquuuuqqq6666qqr/u+gctVVV1111VVXXXUVL/ZiL/ZaAPfdd9+tXHXVVVddddVVV1111f8dVK666qqrrrrqqquuepazZ88+g6uuuuqqq6666qqrrvq/g8pVV1111VVXXXXVVbzYi73YawP8wz/8w29z1VVXXXXVVVddddVV/3dQueqqq6666qqrrrqKa6655sEA9913361cddVVV1111VVXXXXV/x1Urrrqqquuuuqqq/6fe53XeZ33Bvit3/qt7+Gqq6666qqrrrrqqqv+b6Fy1VVXXXXVVVdd9f/ci73Yi70WwD/8wz/8NlddddVVV1111VVXXfV/C5Wrrrrqqquuuuqq/+de7MVe7LUB/uEf/uG3ueqqq6666qqrrrrqqv9bqFx11VVXXXXVVVf9P3fNNdc8GOC+++67lauuuuqqq6666qqrrvq/hcpVV1111VVXXXXV/2Ov8zqv894Av/Vbv/XdXHXVVVddddVVV1111f89VK666qqrrrrqqqv+H3uxF3ux1wL4h3/4h9/hqquuuuqqq6666qqr/u+hctVVV1111VVXXfX/2Iu92Iu9NsA//MM//DZXXXXVVVddddVVV131fw+Vq6666qqrrrrqqv+nXud1Xue9r7nmmgcD3Hfffbdy1VVXXXXVVVddddVV//dQueqqq6666qqrrvp/7rd+67e+m6uuuuqqq6666qqrrvq/icpVV1111VVXXXXV/1Ov8zqv814A//AP//A7XHXVVVddddVVV1111f9NVK666qqrrrrqqqv+n3qxF3ux1wb4h3/4h9/mqquuuuqqq6666qqr/m+ictVVV1111VVXXfX/0Ou8zuu8F8Bv/dZvffd99913K1ddddVVV1111VVXXfV/E5Wrrrrqqquuuuqq/4de7MVe7LUB/uEf/uF3uOqqq6666qqrrrrqqv+7qFx11VVXXXXVVVf9P/RiL/Zirw3wD//wD7/NVVddddVVV1111VVX/d9F5aqrrrrqqquuuur/mdd5ndd572uuuebBAPfdd9+tXHXVVVddddVVV1111f9dVK666qqrrrrqqqv+n3mxF3ux1wL4rd/6re/mqquuuuqqq6666qqr/m+jctVVV1111VVXXfX/zIu92Iu9NsBv/dZvfQ9XXXXVVVddddVVV131fxuVq6666qqrrrrqqv9nrrnmmgcD/MM//MNvc9VVV1111VVXXXXVVf+3Ubnqqquuuuqqq676f+R1Xud13hvgt37rt76Hq6666qqrrrrqqquu+r+PylVXXXXVVVddddX/I6/zOq/zXgD/8A//8NtcddVVV1111VVXXXXV/31Urrrqqquuuuqqq/4febEXe7HXBvit3/qt7+aqq6666qqrrrrqqqv+76Ny1VVXXXXVVVdd9f/E67zO67w3wG/91m99N1ddddVVV1111VVXXfX/A5Wrrrrqqquuuuqq/yde53Ve570A/uEf/uF3uOqqq6666qqrrrrqqv8fqFx11VVXXXXVVVf9P/FiL/Zirw3wD//wD7/NVVddddVVV1111VVX/f9A5aqrrrrqqquuuur/gdd5ndd5b4Df+q3f+u777rvvVq666qqrrrrqqquuuur/BypXXXXVVVddddVV/w+8zuu8znsB/MM//MPvcNVVV1111VVXXXXVVf9/ULnqqquuuuqqq676P+7FXuzFXvvFXuzFXhvgt37rt76bq6666qqrrrrqqquu+v+DylVXXXXVVVddddX/ce/0Tu/0WQA/8iM/8tlcddVVV1111VVXXXXV/y9Urrrqqquuuuqqq/6P+fAP//Dvep3XeZ335rmcPXv2GVx11VVXXXXVVVddddX/L1Suuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676vwo96EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yr+EfTYVZcZgWHoAAAAAElFTkSuQmCC) diff --git a/docs/kcl-std/lastSegX.md b/docs/kcl-std/functions/std-sketch-lastSegX.md similarity index 99% rename from docs/kcl-std/lastSegX.md rename to docs/kcl-std/functions/std-sketch-lastSegX.md index b692aeded..53049d49b 100644 --- a/docs/kcl-std/lastSegX.md +++ b/docs/kcl-std/functions/std-sketch-lastSegX.md @@ -8,7 +8,7 @@ layout: manual Extract the 'x' axis value of the last line segment in the provided 2-d sketch. ```kcl -lastSegX(@sketch: Sketch): number +lastSegX(@sketch: Sketch): number(Length) ``` @@ -17,11 +17,11 @@ lastSegX(@sketch: Sketch): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | The sketch whose line segment is being queried | Yes | +| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | The sketch whose line segment is being queried. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples diff --git a/docs/kcl-std/lastSegY.md b/docs/kcl-std/functions/std-sketch-lastSegY.md similarity index 99% rename from docs/kcl-std/lastSegY.md rename to docs/kcl-std/functions/std-sketch-lastSegY.md index c7331fb72..5b78002b5 100644 --- a/docs/kcl-std/lastSegY.md +++ b/docs/kcl-std/functions/std-sketch-lastSegY.md @@ -8,7 +8,7 @@ layout: manual Extract the 'y' axis value of the last line segment in the provided 2-d sketch. ```kcl -lastSegY(@sketch: Sketch): number +lastSegY(@sketch: Sketch): number(Length) ``` @@ -17,11 +17,11 @@ lastSegY(@sketch: Sketch): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | The sketch whose line segment is being queried | Yes | +| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | The sketch whose line segment is being queried. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples diff --git a/docs/kcl-std/line.md b/docs/kcl-std/functions/std-sketch-line.md similarity index 99% rename from docs/kcl-std/line.md rename to docs/kcl-std/functions/std-sketch-line.md index d1391290d..970931422 100644 --- a/docs/kcl-std/line.md +++ b/docs/kcl-std/functions/std-sketch-line.md @@ -12,7 +12,7 @@ line( @sketch: Sketch, endAbsolute?: Point2d, end?: Point2d, - tag?: TagDeclarator, + tag?: tag, ): Sketch ``` @@ -25,7 +25,7 @@ line( | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | | `endAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Which absolute point should this line go to? Incompatible with `end`. | No | | `end` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | How far away (along the X and Y axes) should this line go? Incompatible with `endAbsolute`. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns diff --git a/docs/kcl-std/loft.md b/docs/kcl-std/functions/std-sketch-loft.md similarity index 99% rename from docs/kcl-std/loft.md rename to docs/kcl-std/functions/std-sketch-loft.md index 5c3cd2e53..9e3e78705 100644 --- a/docs/kcl-std/loft.md +++ b/docs/kcl-std/functions/std-sketch-loft.md @@ -9,13 +9,13 @@ Create a 3D surface or solid by interpolating between two or more sketches. ```kcl loft( - @sketches: [Sketch], - vDegree: number, - bezApproximateRational: bool, - baseCurveIndex?: number, - tolerance?: number, - tagStart?: TagDeclarator, - tagEnd?: TagDeclarator, + @sketches: [Sketch; 2+], + vDegree?: number(_), + bezApproximateRational?: bool, + baseCurveIndex?: number(_), + tolerance?: number(Length), + tagStart?: tag, + tagEnd?: tag, ): Solid ``` @@ -25,13 +25,13 @@ The sketches need to closed and on the same plane. | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) | Which sketches to loft. Must include at least 2 sketches. | Yes | -| `vDegree` | [`number`](/docs/kcl-std/types/std-types-number) | Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified. | Yes | -| `bezApproximateRational` | [`bool`](/docs/kcl-std/types/std-types-bool) | Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary. | Yes | -| `baseCurveIndex` | [`number`](/docs/kcl-std/types/std-types-number) | This can be set to override the automatically determined topological base curve, which is usually the first section encountered. | No | -| `tolerance` | [`number`](/docs/kcl-std/types/std-types-number) | Tolerance for the loft operation. | No | -| `tagStart` | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | A named tag for the face at the start of the loft, i.e. the original sketch | No | -| `tagEnd` | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | A named tag for the face at the end of the loft, i.e. the last sketch | No | +| `sketches` | `[Sketch; 2+]` | Which sketches to loft. Must include at least 2 sketches. | Yes | +| `vDegree` | [`number(_)`](/docs/kcl-std/types/std-types-number) | Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. | No | +| `bezApproximateRational` | [`bool`](/docs/kcl-std/types/std-types-bool) | Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios. Over time, this field won't be necessary. | No | +| `baseCurveIndex` | [`number(_)`](/docs/kcl-std/types/std-types-number) | This can be set to override the automatically determined topological base curve, which is usually the first section encountered. | No | +| `tolerance` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Tolerance for the loft operation. | No | +| `tagStart` | [`tag`](/docs/kcl-std/types/std-types-tag) | A named tag for the face at the start of the loft, i.e. the original sketch. | No | +| `tagEnd` | [`tag`](/docs/kcl-std/types/std-types-tag) | A named tag for the face at the end of the loft. | No | ### Returns @@ -43,19 +43,19 @@ The sketches need to closed and on the same plane. ```kcl // Loft a square and a triangle. squareSketch = startSketchOn(XY) - |> startProfile(at = [-100, 200]) - |> line(end = [200, 0]) - |> line(end = [0, -200]) - |> line(end = [-200, 0]) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> startProfile(at = [-100, 200]) + |> line(end = [200, 0]) + |> line(end = [0, -200]) + |> line(end = [-200, 0]) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() triangleSketch = startSketchOn(offsetPlane(XY, offset = 75)) - |> startProfile(at = [0, 125]) - |> line(end = [-15, -30]) - |> line(end = [30, 0]) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> startProfile(at = [0, 125]) + |> line(end = [-15, -30]) + |> line(end = [30, 0]) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() loft([triangleSketch, squareSketch]) ``` @@ -65,24 +65,20 @@ loft([triangleSketch, squareSketch]) ```kcl // Loft a square, a circle, and another circle. squareSketch = startSketchOn(XY) - |> startProfile(at = [-100, 200]) - |> line(end = [200, 0]) - |> line(end = [0, -200]) - |> line(end = [-200, 0]) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> startProfile(at = [-100, 200]) + |> line(end = [200, 0]) + |> line(end = [0, -200]) + |> line(end = [-200, 0]) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() circleSketch0 = startSketchOn(offsetPlane(XY, offset = 75)) - |> circle(center = [0, 100], radius = 50) + |> circle( center = [0, 100], radius = 50 ) circleSketch1 = startSketchOn(offsetPlane(XY, offset = 150)) - |> circle(center = [0, 100], radius = 20) + |> circle( center = [0, 100], radius = 20 ) -loft([ - squareSketch, - circleSketch0, - circleSketch1 -]) +loft([squareSketch, circleSketch0, circleSketch1]) ``` ![Rendered example of loft 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAIP30lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVdd9b/eNddc82Ce6cyZMw/mma655poH8yK47777buUBzp49e+t99913K1ddddVVV1111VVX/W9H5aqrrrrqqquuuuqq/7GuueaaBwO82Iu92GufOXPmQQDXXHPNg6+55poHnzlz5sHXXHPNg3ku9913363XXHPNg/kPct99990KcPbs2Vvvu+++WwH+4R/+4XcA7rvvvlv/4R/+4be56qqrrrrqqquuuup/KvSgBz2Iq6666qqrrrrqqqv+e11zzTUPPnPmzINf7MVe7LUAXvzFX/y1X+zFXuy1+RdcvHgRgIsXLwJw8eJF7nfx4kX+NU6cOMH9Tpw4AcCJEyc4ceIE/5L77rvv1rNnz95633333foP//APv3Pffffd+g//8A+/zVVXXXXVVVddddVV/93Qgx70IK666qqrrrrqqquu+q91zTXXPPi1X/u13wvgnd7pnT6b5+PixYsAPO1pT+PixYsAPP3pTwfg4sWLXLx4kf9KJ06cAOChD30oAA95yEMAOHHiBA996EN5fu67775b/+Ef/uG3/+Ef/uF37rvvvlv/4R/+4be56qqrrrrqqquuuuq/EnrQgx7EVVddddVVV1111VX/ua655poHv/Zrv/Z7XXPNNQ9+ndd5nffmuVy8eJGnP/3pXLx4kac97Wk8/elP5z+bbf4jnThxghMnTnDixAke8pCHcOLECR760IfyQPfdd9+t//AP//Db//AP//A7v/Vbv/XdXHXVVVddddVVV131nw096EEP4qqrrrrqqquuuuqq/xzv+I7v+Fkv/uIv/tov9mIv9to8wMWLF/nLv/xLnva0p/H0pz+d/6tOnDjB8ePHOXHiBC/7si/LQx/6UO5333333Xr27Nlbf+u3fut7fuu3fuu7ueqqq6666qqrrrrqPwN60IMexFVXXXXVVVddddVV/3GuueaaB7/Yi73Ya3/4h3/4d/FMFy9e5C//8i952tOextOf/nT+vzpx4gTHjx/n5V7u5XjZl31Z7nfffffd+lu/9Vvf/du//dvfc999993KVVddddVVV1111VX/UdCDHvQgrrrqqquuuuqqq67697vmmmse/GIv9mKv/eEf/uHfxTM97WlP4y//8i/5y7/8S656TidOnOAhD3kID33oQ3nZl31ZAO67775bf+u3fuu7f/RHf/RzuOqqq6666qqrrrrqPwJ60IMexFVXXXXVVVddddVV/z4v9mIv9tqf+7mf+1s802/8xm/wV3/1V1y8eJH/DWzz3+nEiRO87Mu+LK/3eq8HwH333Xfr13/917/PP/zDP/w2V1111VVXXXXVVVf9e1COHz/OVVddddVVV1111VX/di/2Yi/22p/7uZ/7WwAXL17kG77hG3j84x/ParXifwtJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhidVqxdOf/nT+6q/+iuuvv56bbrrp+Iu92Iu99ubm5vF/+Id/+B2uuuqqq6666qqrrvq3ohw/fpyrrrrqqquuuuqqq/5tXuzFXuy1P/dzP/e3AH7jN36DH/iBH2C1WnHVv81qteLpT386y+WSl3iJlzh+zTXXPPjWW2/9m7Nnz97KVVddddVVV1111VX/FpTjx49z1VVXXXXVVVddddW/zUd8xEd81zXXXPPg3/iN3+A3f/M3uerfb7Va8fSnPx2Aa6+9dndzc/P4n/7pn/4MV1111VVXXXXVVVf9W1C56qqrrrrqqquuuurf7MVe7MVeG+C3fuu3kMT/Zrb5n+Sv/uqveL3Xe70HA699zTXXPPi+++67lauuuuqqq6666qqr/rWoXHXVVVddddVVV131b/JiL/Zir33ffffdenh4+GD+D5DE/yS7u7tcvHiRa6655sFcddVVV1111VVXXfVvRXDVVVddddVVV1111b/J2bNnb93d3eUhD3kID3nIQ7jqP9bx48c5ceIEAPfdd9+tXHXVVVddddVVV131b0Fw1VVXXXXVVVddddW/yX333Xfrn/7pnz4Y4G3f9m05fvw4V/3HOH78OG/3dm8HwF/+5V9y1VVXXXXVVVddddW/GcFVV1111VVXXXXVVf8mXde991Of+lQuXrzIiRMneP/3f38e+tCHIglJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxP8Ux48f5/3e7/14yEMewsWLF/mBH/gBSinvzVVXXXXVVVddddVV/xaU48ePc9VVV1111VVXXXXVv96xY8e+yvaDH//4x/PiL/7inDhxgoc85CHM53N2d3dZrVb8byIJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkceLECV71VV+Vd3u3d2OxWLC7u8tXfMVXkJnYPr5arb6Hq6666qqrrrrqqqv+tdCDHvQgrrrqqquuuuqqq67617vhhhvc9z21Vk6fPs3LvdzL8bqv+7oA7O7u8vSnP52/+qu/4ulPfzpXvWDHjx/nZV7mZXjd131d7ve7v/u7/NZv/RbTNDGOI/v7+7fec889D+Gqq6666qqrrrrqqn8t9KAHPYirrrrqqquuuuqqq/51aq3vfd11131X3/eUUiilUErh5MmTvM7rvA4v9VIvxf12d3f5y7/8S2699Vae/vSncxUcP36cl3mZl+FlX/ZlOX78OPf7+7//e37v936Pixcv0lpjmibGcWS9XnPbbbe9Tmb+NlddddVVV1111VVX/WugBz3oQVx11VVXXXXVVVdd9a+zvb39XSdOnHjvrusopVBKoZRCRBARnDhxgpd6qZfiNV7jNbh06RLHjh0DYHd3l6c//en81V/9Fbfeeiv/E9jmP9vx48c5ceIED37wg3nZl31Zjh8/zv329vb4h3/4B/7+7/+e3d1dMpPWGpnJNE1M08R6vebChQu/vbu7+zpcddVVV1111VVXXfWvgR70oAdx1VVXXXXVVVddddW/zg033OC+76m1UkqhlEJEEBFEBBGBJE6cOMGDHvQgbrnlFl78xV+cB9rd3QXg6U9/OrfeeisXL17k1ltv5f+C48eP8zIv8zIAPPjBD+YhD3kID7S/v8/jH/949vb2+Id/+Adsk5lkJplJa43MZJompmliHEf29/dvveeeex7CVVddddVVV1111VX/GuhBD3oQV1111VVXXXXVVVe96Eop73399dd/V9d11FoppVBKISKICCICSUQEkpBERPDiL/7ivMmbvAl7e3vs7e1x00038dx2d3cBePrTnw7ArbfeysWLF9nd3WV3d5f/SY4fP87x48c5ceIEx48f5/jx4xw/fpyHPOQhPD/7+/vs7+9zww038Gd/9mf86Z/+KZmJbTKTzMQ2rTUyk9YarTVaa4zjyGq14o477nid1tpvc9VVV1111VVXXXXVi4rKVVddddVVV1111VX/KovF4rUigohAEpKQhCQkASCJ+0kC4Oabbwbgj/7oj3jc4x7H8ePH2dnZ4dixY9x0003s7Oxwww03APAyL/MyALzMy7wM99vd3QXg4sWL7O7uArC7u8vu7i4AFy9e5H67u7vcb3d3lxfm+PHjPNDx48cBOHHiBMePH+d+x48f5/jx45w4cYLjx4/zghwcHABw9913s7+/z913382dd96JbV7u5V6OG264gftJwjaSkIRtJCEJSUQEmUlEUEphe3v7s3Z3d3+bq6666qqrrrrqqqteVFSuuuqqq6666qqrrvpX2dnZee+IQBKSkMQDSQJAEpJ4Qfb29tjf3+fuu+/miU98IhHBsWPHiAhuuOEGtre32dnZYWtri62tLY4fPw7A8ePH+Z/g8PAQgPvuu4/9/X0ODg7Y39/n7rvvxja2sY1t7nfXXXcBcOONNyIJ20jCNpKQhCQkIQkASUiilMJ8Pn8wV1111VVXXXXVVVf9a1C56qqrrrrqqquuuupFVkp5b0lIQhKSkIQkJCEJAEncTxKSuOWWWwC4/fbbeUH29/eJCJ785CcTEUQEpRRKKRw7doxSCjs7O2xvb1NKoes6Tpw4QUQwn8+JCCKCWiuSeFHZxja2GceRzGS9XnN0dERrjdYah4eH3HfffbTW2N/fp7VGZpKZZCaZiW2em23ut7+/D8D29jYAkrCNJGzzQJKQhCQigohgNps9WNJr2/5trrrqqquuuuqqq656UVC56qqrrrrqqquuuupFtlgsXquUQkQgCUlIQhKSAJDE/SRxv52dHQD29vaQxL/W4eEhtVbGcWRvb4++7+n7nt3dXebzOfP5nMViwXw+Zz6fM5/Pmc1m9H1PrZVSChGBbWzTWmMcR4ZhYLVasVqtWK1WLJdLlsslq9WK9XrNMAwMw8A4jkzTxDRNPJBt/j0kYRtJSEISkpCEJCQhCUmUUjh27Nhn7e7u/jZXXXXVVVddddVVV70oCK666qqrrrrqqquuepHt7Oy8d0QgCUlI4oEkASAJSfxb2MY2L4htXhDb/HvY5rnZ5n62eSDbPJBtHsg2D7S/v8/+/j7b29vs7OxwP0ncTxKSkIQkJCGJiCAimM/nD+aqq6666qqrrrrqqhcVwVVXXXXVVVddddVVL5KIeG9JSEISkpCEJCQhCQBJPJAkXvzFXxyA22+/nf8otrmfbV5UknhhbPPcbPNAtnkg27yo9vf3Adje3kYS95OEJB5IEpKQRERQSmE2mz04Il6bq6666qqrrrrqqqteFARXXXXVVVddddVVV71INjY2XquUQkQgCUlIQhL3k8T9JCGJB7p06RIvjG1eENvYBsA2z802ALb5j2Kb+9nmP8L+/j4AOzs7AEhCEveThCQkIQlJSEISkiilsLOz81lcddVVV1111VVXXfWiILjqqquuuuqqq6666kWys7Pz3hGBJCQhiftJQhIAkpDEAx07dgyAvb09/iPZxjb/0Wzzgtjm32Nvbw+A7e1tJHE/SUgCQBKSkIQkJCGJiCAimM1mD+aqq6666qqrrrrqqhcFwVVXXXXVVVddddVV/6KIeG9JSEISkpCEJCQhCQBJPJAkJLGzswPApUuXeFHZ5l/LNv9atnl+bPOf4a677gLghhtuAEASDySJB5KEJCQhiYhgPp8/OCJem6uuuuqqq6666qqr/iUEV1111VVXXXXVVVf9izY2Nl6rlEJEIAlJSEIS95PE/SQhifvdfPPNANx+++38V7CNbf41bGOb52ab58c2L4xtXpjt7W3uJwkASQBIQhKSkIQkJBERRASlFLa3tz+Lq6666qqrrrrqqqv+JQRXXXXVVVddddVVV/2LdnZ23jsikIQkJHE/SUjifpJ4bjs7O/xHs839bPMfxTb/mfb397mfJO4nCQBJ3E8SAJKQhCQigohgPp8/mKuuuuqqq6666qqr/iUEV1111VVXXXXVVVe9UBHx3pKQhCQkIQlJSEIS95PE/SQhCUncb29vj38L29zPNs+PbV4YSfxPsL+/z/7+Ptvb22xvbyMJSQBIAkASkgCQhCQkIQlJRATz+fzBEfHaXHXVVVddddVVV131whBcddVVV1111VVXXfVCbWxsvFYphYhAEpIAkMT9JCEJAElI4n433XQTALfffjv/FrZ5brYBsI1tXhDb/HvY5j/D3t4eANvb29xPEgCSAJCEJCQhCUlIIiKICEopbG9vfxZXXXXVVVddddVVV70wBFddddVVV1111VVXvVA7OzvvHRFIQhKSkASAJB5IEs/t2LFjAFy6dIn/Crb597LNA9kGwDb/Efb39wHY2dlBEveTBIAknpskJCGJiCAimM/nD+aqq6666qqrrrrqqheG4KqrrrrqqquuuuqqFygi3lsSkpCEJCQhCUkASAJAEg8kCUncfPPNAFy6dIn/TWzzn2Vvbw+Ara0tACRxP0kASEISkpCEJCQh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kEREIAlJSEISkpCEJCQhCQBJSEISkgCQhCQAJCEJAEkASEISAJIAkMTLvuzLcs011/BHf/RH3HHHHQBIAkASAJIAkASAJAAkASAJAEkASEISAJKQhCQAJCEJSUhCEpKQhCQkERFIIiKQREQgiYggIogIIoKIQBIRgSQigoggIogISilEBKUUIoJSCqUUSimUUiilEBGUUiilUEohIogIIoKIICKQhCQkIQlJPD+2AbCNbWxjG9tkJplJZpKZZCa2sY1tbJOZZCa2sU1mYhvbANjm+bGNbQBs80C2eW6SeG6SuJ8knpsknpsknpskACTxQOv1mtlsxk033cTOzg6Pe9zj+LeSxHOTxAPZ5oFs89xsA2Ab29zPNq01IgKA22+/nb/6q7/i6OiIBz3oQcdf+7Vf+61f93Vf9302NjaO/cM//MPvcNVVV1111VVX/X9BOX78OFddddVVV1111f9t11xzzYPf7M3e7KM+93M/97df/MVf/LVXq9XxX//1X+cbvuEbeOITn4htbGOb1hq1VkoplFKICCKCiEASEYEkIgJJSEISkpCEJCQhCUlIQhKSkASAJCQBIAlJAEhCEgCSkASAJAAkIQmAt3qrtwLgV3/1V1mv10jifpIAkASAJAAkASAJAElIAkASAJKQhCQAJCEJSUgCQBKSkEREIAlJSCIikEREIImIICKQhCQigoggIogIIoKIICKICCKCiKCUQkRQSqGUQimFiCAiiAgigoggIogIIoJSChGBJCICSUhCEpKQxPNjm/vZxja2sU1mYhvb2MY2trGNbWxjG9vYJjOxjW1sYxsA29jGNraxjW0AbANgm38NSdxPEveTxHOTxHOTBIAknpsk7re/v89Lv/RLA3D27Fn29vZ4YSTxopDEC2Kb+9nGNvezzf1sA2Cb+03TREQAsFwueeITn8hf/dVfsVwu2dzcPP5ar/Var/06r/M67725uXn87Nmzzzg8PNzlqquuuuqqq676v4zKVVddddVVV131f9Y111zz4Hd8x3f8rNd5ndd5b4Dz58/zB3/wB/zcz/0ctgGwjW1sM00TtVYiAklIQhKSkIQkJCEJAElIQhKSkIQkJCEJSTw3SdxPEveTxP0k8dwkcb83fuM3BuBxj3sce3t7PJAkACQBIAkASQBIAkAS95MEgCQeSBLPTRKSkIQkHkgSAJIAkMT9JCGJ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2zyQbR7INvezzQPZ5oFscz/bPJBt7mebB7LNA9nmgWxzP9s8kG0eyDYPZJsHss0D2eaBbPNAtnkg2zw32zyQbZ6bbS5cuMCNN94IwJkzZx70Yi/2Yq/9D//wD7/NVVddddVVV/3rUbnqqquuuuqqf6OzZ8/e+lu/9Vvf/Tqv8zrvDXDjjTdy1f9ttvmX2Oaqq64CSTw3SVx11b/WP/zDP/z22bNnb+Wqq6666qqr/m2oXHXVVVddddW/0X333Xfrb/3Wb33PfffddytXXXXVVVddddV/in/4h3/4nfvuu+9WrrrqqquuuurfBj3oQQ/iqquuuuqqq6666qqrrrrqqquuuuqqq676P4nKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4p/BMakffxqrmkjAAAAAElFTkSuQmCC) @@ -90,29 +86,24 @@ loft([ ```kcl // Loft a square, a circle, and another circle with options. squareSketch = startSketchOn(XY) - |> startProfile(at = [-100, 200]) - |> line(end = [200, 0]) - |> line(end = [0, -200]) - |> line(end = [-200, 0]) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> startProfile(at = [-100, 200]) + |> line(end = [200, 0]) + |> line(end = [0, -200]) + |> line(end = [-200, 0]) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() circleSketch0 = startSketchOn(offsetPlane(XY, offset = 75)) - |> circle(center = [0, 100], radius = 50) + |> circle( center = [0, 100], radius = 50 ) circleSketch1 = startSketchOn(offsetPlane(XY, offset = 150)) - |> circle(center = [0, 100], radius = 20) + |> circle( center = [0, 100], radius = 20 ) -loft( - [ - squareSketch, - circleSketch0, - circleSketch1 - ], - baseCurveIndex = 0, - bezApproximateRational = false, - tolerance = 0.000001, - vDegree = 2, +loft([squareSketch, circleSketch0, circleSketch1], + baseCurveIndex = 0, + bezApproximateRational = false, + tolerance = 0.000001, + vDegree = 2, ) ``` diff --git a/docs/kcl-std/patternCircular2d.md b/docs/kcl-std/functions/std-sketch-patternCircular2d.md similarity index 98% rename from docs/kcl-std/patternCircular2d.md rename to docs/kcl-std/functions/std-sketch-patternCircular2d.md index 35f06b4ba..db42d9dff 100644 --- a/docs/kcl-std/patternCircular2d.md +++ b/docs/kcl-std/functions/std-sketch-patternCircular2d.md @@ -9,13 +9,13 @@ Repeat a 2-dimensional sketch some number of times along a partial or complete c ```kcl patternCircular2d( - @sketchSet: [Sketch], - instances: number, + @sketches: [Sketch; 1+], + instances: number(_), center: Point2d, - arcDegrees?: number, + arcDegrees?: number(Angle), rotateDuplicates?: bool, useOriginal?: bool, -): [Sketch] +): [Sketch; 1+] ``` @@ -24,16 +24,16 @@ patternCircular2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSet` | [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) | Which sketch(es) to pattern | Yes | -| `instances` | [`number`](/docs/kcl-std/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `sketches` | [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) | The sketch(es) to duplicate. | Yes | +| `instances` | [`number(_)`](/docs/kcl-std/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | | `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center about which to make the pattern. This is a 2D vector. | Yes | -| `arcDegrees` | [`number`](/docs/kcl-std/types/std-types-number) | The arc angle (in degrees) to place the repetitions. Must be greater than 0. Defaults to 360. | No | -| `rotateDuplicates` | [`bool`](/docs/kcl-std/types/std-types-bool) | Whether or not to rotate the duplicates as they are copied. Defaults to true. | No | -| `useOriginal` | [`bool`](/docs/kcl-std/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `arcDegrees` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | The arc angle (in degrees) to place the repetitions. Must be greater than 0. | No | +| `rotateDuplicates` | [`bool`](/docs/kcl-std/types/std-types-bool) | Whether or not to rotate the duplicates as they are copied. | No | +| `useOriginal` | [`bool`](/docs/kcl-std/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. | No | ### Returns -[`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) +[`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) ### Examples @@ -49,7 +49,7 @@ exampleSketch = startSketchOn(XZ) center = [0, 0], instances = 13, arcDegrees = 360, - rotateDuplicates = true, + rotateDuplicates = true ) example = extrude(exampleSketch, length = 1) diff --git a/docs/kcl-std/patternLinear2d.md b/docs/kcl-std/functions/std-sketch-patternLinear2d.md similarity index 99% rename from docs/kcl-std/patternLinear2d.md rename to docs/kcl-std/functions/std-sketch-patternLinear2d.md index c2e6c942f..fe0ec0a3a 100644 --- a/docs/kcl-std/patternLinear2d.md +++ b/docs/kcl-std/functions/std-sketch-patternLinear2d.md @@ -1,6 +1,6 @@ --- title: "patternLinear2d" -subtitle: "Function in std" +subtitle: "Function in std::sketch" excerpt: "Repeat a 2-dimensional sketch along some dimension, with a dynamic amount of distance between each repetition, some specified number of times." layout: manual --- @@ -9,12 +9,12 @@ Repeat a 2-dimensional sketch along some dimension, with a dynamic amount of dis ```kcl patternLinear2d( - @sketches: [Sketch], - instances: number, - distance: number, - axis: Point2d, + @sketches: [Sketch; 1+], + instances: number(_), + distance: number(Length), + axis: Axis2d | Point2d, useOriginal?: bool, -): [Sketch] +): [Sketch; 1+] ``` @@ -23,26 +23,29 @@ patternLinear2d( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) | The sketch(es) to duplicate | Yes | -| `instances` | [`number`](/docs/kcl-std/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | -| `distance` | [`number`](/docs/kcl-std/types/std-types-number) | Distance between each repetition. Also known as 'spacing'. | Yes | -| `axis` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The axis of the pattern. A 2D vector. | Yes | -| `useOriginal` | [`bool`](/docs/kcl-std/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false. | No | +| `sketches` | [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) | The sketch(es) to duplicate. | Yes | +| `instances` | [`number(_)`](/docs/kcl-std/types/std-types-number) | The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. | Yes | +| `distance` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Distance between each repetition. Also known as 'spacing'. | Yes | +| `axis` | [`Axis2d`](/docs/kcl-std/types/std-types-Axis2d) or [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The axis of the pattern. A 2D vector. | Yes | +| `useOriginal` | [`bool`](/docs/kcl-std/types/std-types-bool) | If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. | No | ### Returns -[`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) +[`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) ### Examples ```kcl -// / Pattern using a named axis. - +/// Pattern using a named axis. exampleSketch = startSketchOn(XZ) |> circle(center = [0, 0], radius = 1) - |> patternLinear2d(axis = X, instances = 7, distance = 4) + |> patternLinear2d( + axis = X, + instances = 7, + distance = 4 + ) example = extrude(exampleSketch, length = 1) ``` @@ -50,12 +53,15 @@ example = extrude(exampleSketch, length = 1) ![Rendered example of patternLinear2d 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAC6CklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVX/btdc801Dz5z5syDr7nmmgefOXPmQTzA2bNnnwFw33333foP//APv81V/2muueaaBwOcOXPmwS/2Yi/2WjyXs2fPPuO+++67FeAf/uEffpur/tNcc801DwZ4sRd7sdc+c+bMgwDOnj37jDNnzjwI4OzZs8+47777bv2Hf/iH3+aq/1TXXHPNg1/sxV7stc+cOfMgnsvZs2efAXDffffd+g//8A+/zVX/aa655poHnzlz5sHXXHPNg8+cOfMgnsvZs2efcd9999169uzZW++7775bueo/zTXXXPPgM2fOPPjFXuzFXovncvbs2WcA/MM//MNv33fffbdy1X+aa6655sEAL/ZiL/baZ86ceRDPdPbs2WecOXPmQWfPnn3GfffddyvAP/zDP/w2V1111VVX/XtQueqqq6666l/tmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTb/Cvfdd9+t//AP//Db//AP//A7v/Vbv/XdXPXvcs011zz4tV/7td/rxV/8xV/7xV7sxV6bF9F9991369mzZ2/9+7//+9/+h3/4h9/5h3/4h9/mqn+za6655sGv/dqv/V4A7/RO7/TZvAjuu+++W6+55poH33fffbf+wz/8w2//wz/8w+/81m/91ndz1b/LNddc8+DXfu3Xfq8Xf/EXf+0zZ848+JprrnkwL4L77rvv1rNnz97693//97/927/9299z33333cpV/2bXXHPNg1/7tV/7vQDe6Z3e6bN5pvvuu+/Wa6655sG8EPfdd9+t//AP//Db//AP//A7v/Vbv/XdXPXvcs011zz4tV/7td/rmmuuefDrvM7rvDcvxH333XfrNddc82Ce6b777rv1H/7hH377t37rt77nH/7hH36bq/7NrrnmmgefOXPmwS/2Yi/2Wq/zOq/z3tdcc82DeRHdd999t/7DP/zD7/zDP/zDb//Wb/3Wd3PVVVddddW/FnrQgx7EVVddddVVL5prrrnmwe/4ju/4Wa/zOq/z3jzAxYsX2d3dZXd3l93dXR7oxIkTABw/fpwHP/jB3O++++67FeAf/uEffvu3fuu3vucf/uEffpurXmTv+I7v+Fmv8zqv897XXHPNg3mA3d1dnv70p7O7u8tzO3HiBMePH+f48eMcP36cB7rvvvtu/a3f+q3v/tEf/dHP4aoX2TXXXPPgd3zHd/ys13md13lvHmB3d5eLFy9y6dIlLl68yAMdP34cgOPHj/OQhzyEB7rvvvtu/Yd/+Iff/q3f+q3v+Yd/+Iff5qoXyTXXXPPg137t136v13md13nva6655sE8wO7uLru7uzz96U/nuR0/fhyA48eP85CHPASA++6779Zrrrnmwffdd9+tv/Vbv/XdP/qjP/o5XPUiu+aaax782q/92u/1Tu/0Tp/NA+zu7gLw9Kc/nd3dXQBsc7/jx49z4sQJHvKQh/BAZ8+efcbf//3f/9Zv/dZvfc8//MM//DZXvUiuueaaB7/2a7/2e73u677u+5w5c+ZBPMDu7i4XL17k6U9/OvezDcCJEyewzYkTJ3joQx/KA/3Wb/3Wd//DP/zD7/zWb/3Wd3PVi+yaa6558Gu/9mu/1zu90zt9Ns/l4sWLPP3pT+fixYvczzYAJ06c4Pjx4wA87GEP43733Xffrf/wD//w27/1W7/1Pf/wD//w21x11VVXXfWiQA960IO46qqrrrrqX/a5n/u5v3XmzJkHX3PNNQ++ePEif/mXf8nTn/50br31ViQBIAkASTw/x48fB+DBD34wL/MyL8ODH/xg7nfffffd+lu/9Vvf/aM/+qOfw1Uv0Du+4zt+1ju90zt9Ns/09Kc/nac//enceuut3HrrrdxPEi/M8ePHefCDH8yDH/xgXuZlXgaA++6771aAH/3RH/2cf/iHf/jt++6771auer6uueaaB3/4h3/4d73Yi73YawPs7u5y8eJFbr31Vv7qr/6K3d1dJPGC2OZ+x44d4yEPeQgv8zIvw0Me8hDud9999936oz/6o5/zW7/1W9/NVc/XNddc8+DXfu3Xfq93eqd3+myeaXd3l7/6q7/i1ltv5dZbb+W52eZ+trnfsWPHOH78OC/7si/LQx7yEE6cOMF99913K8Bv/dZvffeP/uiPfg5XvUAv9mIv9tof/uEf/l3XXHPNg3mm3d1d/uqv/opbb72VW2+9FQDb3M82ALYBsI1tTpw4wUMe8hAe8pCH8HIv93Lc77777rv167/+69/nH/7hH36bq56va6655sGv/dqv/V7v9E7v9Nk80+7uLn/1V3/F05/+dG699VbuZxsA2wDYxjYAtjl+/Di2echDHsLLv/zL87CHPQyA++6779bf+q3f+u4f/dEf/RyueoHe8R3f8bNe53Ve572vueaaB/NMu7u7/NVf/RVPf/rTefrTnw6AbQBsYxsA29jGNrY5fvw4mcnDHvYwXuEVXoGHP/zhAPzDP/zD73z913/9e9933323ctVVV1111QuDHvSgB3HVVVddddUL9o7v+I6f9U7v9E6fffHiRf78z/+c3/zN30QSkpCEJAAkASCJF9Xx48d56Zd+aV7mZV6G48ePc99999169uzZW3/rt37re37rt37ru7nqWV7sxV7stT/8wz/8u6655poHX7x4kb/8y7/kN3/zN5GEJAAkASCJF4VtAI4fP87x48d5mZd5GV7mZV4GgPvuu+/W3/qt3/ruH/3RH/0crnqWa6655sGv/dqv/V7v9E7v9NkAFy9e5K/+6q/4rd/6LSRxP0m8MLa5n20AbHP8+HFe5mVehpd92ZflxIkTANx33323ftZnfdbr3Hfffbdy1bO84zu+42e90zu902fzTLu7u/zWb/0Wf/VXf4UkXhjb3M82ALaxDYBtHvKQh/CyL/uyvNzLvRwA9913362/9Vu/9d0/+qM/+jlc9SzXXHPNgz/8wz/8u17sxV7stQF2d3f5q7/6K377t3+bF8Q297MNgG1sA2Ab29jm+PHjPPShD+XlXu7leNjDHsZ999136z/8wz/8zo/+6I9+9n333XcrVz3LO77jO37W67zO67z3Nddc82CA3d1dfuu3fou//uu/5n62eSDbANgGwDa2sY1tbGMb2xw/fpyXe7mX4xVf8RU5efIk9913361f//Vf/z7/8A//8Ntc9Swv9mIv9tof/uEf/l3XXHPNgwF2d3f5q7/6K37rt36LB7LN/WwDYBvbANjGNraxTWZim8zk+PHjvMIrvAJv+qZvyn333Xfrj/7oj37Ob/3Wb303V1111VVXvSDoQQ96EFddddVVVz1/n/u5n/tbL/ZiL/bav/qrv8pv/MZvEBFIQhKSkASAJAAk8a9hG4Djx4/z4Ac/mNd93dfl+PHjAPzWb/3Wd//oj/7o59x333238v/cO77jO37WO73TO332xYsX+Yu/+At+8zd/E0lIQhIAkgCQxIvKNvezDcCxY8d42Zd9WV73dV8XgPvuu+/Wz/qsz3qd++6771b+n3ux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ceIEr/u6r8tDHvIQjh8/DsAwDFy8eJHDw0MODw+5nyReEEkAdF3H5uYmx48fZ3Nzk/v9xV/8BX/2Z3/GU5/6VDKTzCQzyUxaaxw/fpz3fM/35OTJk7d+yId8yEP4P+TDP/zDv+t1Xud13vubv/mbufXWW5GEJCQhCUkASALgxIkTvM7rvA4v/dIvzf2GYWB3d5fDw0MODw+xzQtimwfq+57NzU1OnDjB1tYW97tw4QI/9EM/xJOe9CRaa0zTxDiOvNd7vRenTp367c/8zM98Hf4P+aZv+qanX3PNNQ/+9V//dX7zN38TSQBIQhIAkgCQxP0kcfz4cV76pV+al37pl+b48eMArFYr7rnnHi5dusTu7i4Atnlutnlus9mMEydOcPz4ca6//nrud+HCBb7ne76Hxz3ucTzoQQ/i1V7t1b7767/+69+H/0O+6Zu+6enXXHPNg3/jN36D3/zN30QSkgCQxP0k8UCSeKDjx4/z0i/90rz2a7829zs6OuK2227j3LlznDt3Dtu8ILZ5oI2NDc6cOcPp06d50IMexP3Onz/Pj/3Yj/32r/3ar70OV1111VX/v1GOHz/OVVddddX/Z+/yLu/yXR/xER/x1ovFgoODAx7/+Mfz27/929x7771cvHiRB5LECyOJcRy5ePEid9xxB094whO49957Abjhhhu47rrreMxjHsNqtWK1WrFarXhutgEopVBKoZRCKYWIoJTC/v4+1157Lddff/3xa6655sF/+qd/+jP8H/EGb/AG3/3rv/7rvPEbvzHv/d7vzYkTJzg6OuIpT3kKv//7v89tt93GuXPneCBJvCCSABjHkaOjI86fP8/tt9/O7bffTt/3XHvttVx//fU89rGPZT6fc/HiRVarFfezjW1sY5v7lVLY39/nxhtv5MYbbzx+zTXXPPhP//RPf4b/A17sxV7std/pnd7ps7/927+dcRyJCE6ePMmrv/qr8x7v8R6cOHGC1WrF7bffzl//9V9z5513sru7yzRN3E8Sz48k7jdNE9M0sbe3x7333st9993HNE0cP36c66+/noc+9KHM53MuXrzIcrkEwDYAtgGwzeHhIbZ5mZd5meNnz559xq233vrX/B/wOq/zOu/95m/+5h/9nd/5nezu7iIJSUhCEidPnuRVX/VVebd3ezeuv/56IoJz585x5513ct9993F4eMg4jgBI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Nlc9X9dcc82DX/u1X/u93umd3umzeaajoyPOnz/Pbbfdxvnz57mfJJ4fSdxvsVhw8803c+rUKU6dOsX97rvvvlu//uu//n3+4R/+4be56vm65pprHvyO7/iOn/ViL/Zir33NNdc8GGC9XnPp0iXOnj3L3t4eAJJ4IEk8kCQAZrMZp0+fZmdnh+3tbe73D//wD7/99V//9e9z33333cpVz9c111zz4Hd8x3f8rNd5ndd5b55pmiaOjo5YrVYMw8ADSeKBJPFApRQ2NjbY2NiglML9/uEf/uG3v/7rv/597rvvvlu56vm65pprHvyO7/iOn3XNNdc85MVe7MVeC6C1xtHREev1mmEYALDNA9nmudmm1srGxgabm5vUWrnfb/3Wb33313/9178PV71Qn/u5n/tbL/ZiL/baAOv1mmEYOHfuHOv1mv39fWzzQLZ5INsAzGYzZrMZ29vb3HzzzTzQj/zIj3z2b//2b3/PfffddytXPV/XXHPNgz/8wz/8u17sxV7stQGWyyXnz5/n/Pnz3HHHHTw32zw32wBsbGxw6tQpFosFj3rUo3igH/mRH/ns3/7t3/6e++6771auuuqqq656ftCDHvQgrrrqqquueuGuueaaB7/2a7/2e734i7/4a7/Yi73Ya/MABwcHHB4ecnBwwOHhIQcHB9xva2sLgGuvvZZrr72W53bffffd+vVf//Xv8w//8A+/zVUvkmuuuebBr/3ar/1er/M6r/Pe11xzzYN5gKOjI86fPw/A0dERy+WS+y0WCyRx6tQpTp06xXP7rd/6re/+rd/6re/5h3/4h9/mqhfJNddc8+DXfu3Xfq/XeZ3Xee9rrrnmwTzTer0GYG9vD4D1es0wDAD0fQ+AJLa3t9nZ2eG5/ciP/Mhn//Zv//b33Hfffbdy1YvkmmuuefCLvdiLvfaHf/iHf9c//MM//PaLvdiLvTbANE0ADMPANE201gCQRCkFgFIKpRRmsxkP9A//8A+//fd///e//du//dvfc999993KVS+SM2fOPOid3umdPvt1Xud13psHaK0xTROtNVprTNPE/UopANRaKaUwm814oPvuu+/W3/qt3/ru3/7t3/6e++6771auepFcc801D37Hd3zHz3qd13md9+YB1us1wzCwXq9Zr9es12vu1/c9ADs7O8xmM2azGQ9033333fpbv/Vb3/2jP/qjn8NVL7LXeZ3Xee8Xe7EXe63XeZ3XeW8eYLlccv78eQCOjo44OjoCYGNjg/udOnWKU6dO8dz+4R/+4bf//u///rd/9Ed/9HO46qqrrrrqX4Ie9KAHcdVVV1111YvummuuefCLvdiLvfbrvM7rvNeLvdiLvfZ999136zXXXPNgXoj77rvv1muuuebB9913361nz5699bd+67e+57d+67e+m6v+Xa655poHv/Zrv/Z7vfiLv/hrv9iLvdhr8y+47777bgW45pprHnzffffdevbs2Vv//u///rd/9Ed/9HO46t/smmuuefCZM2ce/GIv9mKv9eIv/uKvfebMmQdfc801D+ZFcN99990K8Fu/9VvfDfCjP/qjn8NV/2bXXHPNg1/sxV7stQFe53Ve571e7MVe7LV5Edx33323XnPNNQ++7777bv2t3/qt7/6Hf/iH3/mHf/iH3+aqf7NrrrnmwS/2Yi/22i/2Yi/2Wi/2Yi/22tdcc82D+Ve47777bv2t3/qt7/6Hf/iH3/6Hf/iH3+Gqf7NrrrnmwWfOnHnw67zO67zX67zO67w3z8d999136zXXXPNgno/77rvv1t/6rd/67n/4h3/4nX/4h3/4ba76Nztz5syDXvzFX/x1Xud1Xue9XuzFXuy1+Ve47777bj179uytf//3f//bv/3bv/099913361cddVVV131okIPetCDuOqqq6666t/ummuuefCLvdiLvTbAmTNnHnTNNdc8GOC+++67lWc6e/bsM+67775b/+Ef/uG3ueo/xTXXXPNggBd7sRd7bZ7pxV7sxV6LZ/qHf/iH3zlz5syDfvu3f/t77rvvvlu56j/NNddc82CAF3uxF3ttgBd7sRd7LYD77rvvVh7gH/7hH37nH/7hH36bq/7TXHPNNQ8+c+bMg6+55poHA36xF3ux1+aZ/uEf/uF3zpw586B/+Id/+B2Af/iHf/htrvpPc8011zz4zJkzD77mmmsefObMmQddc801D+aZ7rvvvlsBzp49e+t99933jH/4h3/4ba76T3PmzJkHXXPNNQ8BeLEXe7HXuuaaax7MM9133323nj179hkA991339P/4R/+4Xe46j/NNddc8+AXe7EXey1AZ86cedA111zzYJ7pvvvuuxXgt3/7t78H4L777ruVq6666qqr/q3Qgx70IK666qqrrrrqqquuuuqqq6666qqrrrrqqv+TqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q/iHwEWzvJ4n1Zb8QAAAABJRU5ErkJggg==) ```kcl -// / Pattern using a raw axis. - +/// Pattern using a raw axis. exampleSketch = startSketchOn(XZ) |> circle(center = [0, 0], radius = 1) - |> patternLinear2d(axis = [1, 0], instances = 7, distance = 4) + |> patternLinear2d( + axis = [1, 0], + instances = 7, + distance = 4 + ) example = extrude(exampleSketch, length = 1) ``` diff --git a/docs/kcl-std/polygon.md b/docs/kcl-std/functions/std-sketch-polygon.md similarity index 99% rename from docs/kcl-std/polygon.md rename to docs/kcl-std/functions/std-sketch-polygon.md index 1b07b3b28..642fdc931 100644 --- a/docs/kcl-std/polygon.md +++ b/docs/kcl-std/functions/std-sketch-polygon.md @@ -9,9 +9,9 @@ Create a regular polygon with the specified number of sides that is either inscr ```kcl polygon( - @sketchSurfaceOrGroup: Sketch | Plane | Face, - radius: number, - numSides: u64, + @sketchOrSurface: Sketch | Plane | Face, + radius: number(Length), + numSides: number(_), center: Point2d, inscribed?: bool, ): Sketch @@ -23,11 +23,11 @@ polygon( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSurfaceOrGroup` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Plane or surface to sketch on | Yes | -| `radius` | [`number`](/docs/kcl-std/types/std-types-number) | The radius of the polygon | Yes | -| `numSides` | `u64` | The number of sides in the polygon | Yes | -| `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center point of the polygon | Yes | -| `inscribed` | [`bool`](/docs/kcl-std/types/std-types-bool) | Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius | No | +| `sketchOrSurface` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | Plane or surface to sketch on. | Yes | +| `radius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The radius of the polygon. | Yes | +| `numSides` | [`number(_)`](/docs/kcl-std/types/std-types-number) | The number of sides in the polygon. | Yes | +| `center` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | The center point of the polygon. | Yes | +| `inscribed` | [`bool`](/docs/kcl-std/types/std-types-bool) | Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius. | No | ### Returns @@ -40,11 +40,11 @@ polygon( // Create a regular hexagon inscribed in a circle of radius 10 hex = startSketchOn(XY) |> polygon( - radius = 10, - numSides = 6, - center = [0, 0], - inscribed = true, - ) + radius = 10, + numSides = 6, + center = [0, 0], + inscribed = true, + ) example = extrude(hex, length = 5) ``` @@ -55,11 +55,11 @@ example = extrude(hex, length = 5) // Create a square circumscribed around a circle of radius 5 square = startSketchOn(XY) |> polygon( - radius = 5.0, - numSides = 4, - center = [10, 10], - inscribed = false, - ) + radius = 5.0, + numSides = 4, + center = [10, 10], + inscribed = false, + ) example = extrude(square, length = 5) ``` diff --git a/docs/kcl-std/profileStart.md b/docs/kcl-std/functions/std-sketch-profileStart.md similarity index 99% rename from docs/kcl-std/profileStart.md rename to docs/kcl-std/functions/std-sketch-profileStart.md index 97ed221b2..45a17f6b2 100644 --- a/docs/kcl-std/profileStart.md +++ b/docs/kcl-std/functions/std-sketch-profileStart.md @@ -8,7 +8,7 @@ layout: manual Extract the provided 2-dimensional sketch's profile's origin value. ```kcl -profileStart(@profile: Sketch): [number] +profileStart(@profile: Sketch): Point2d ``` @@ -17,23 +17,23 @@ profileStart(@profile: Sketch): [number] | Name | Type | Description | Required | |----------|------|-------------|----------| -| `profile` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Profile whose start is being used | Yes | +| `profile` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Profile whose start is being used. | Yes | ### Returns -[`[number]`](/docs/kcl-std/types/std-types-number) +[`Point2d`](/docs/kcl-std/types/std-types-Point2d) - A point in two dimensional space. ### Examples ```kcl sketch001 = startSketchOn(XY) - |> startProfile(at = [5, 2]) - |> angledLine(angle = 120, length = 50, tag = $seg01) - |> angledLine(angle = segAng(seg01) + 120, length = 50) - |> line(end = profileStart(%)) - |> close() - |> extrude(length = 20) + |> startProfile(at = [5, 2]) + |> angledLine(angle = 120, length = 50 , tag = $seg01) + |> angledLine(angle = segAng(seg01) + 120, length = 50 ) + |> line(end = profileStart(%)) + |> close() + |> extrude(length = 20) ``` ![Rendered example of profileStart 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADnvklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+ryK46qqrrrrqqquuuur/lWuuuebBXHXVVVddddVVV131/wWVq6666qqrrrrqqqv+z7vmmmse/I7v+I6f9WIv9mKvDfAP//APv/1bv/Vb3/MP//APv81VV1111VVXXXXVVf+XoQc96EFcddVVV1111VVXXfV/0zXXXPPgd3zHd/ys13md13nv8+fP84d/+IcAvMVbvAUAv/Vbv/Xdv/Vbv/U9//AP//DbXHXVVVddddVVV131fxF60IMexFVXXXXVVVddddVV/7dcc801D37Hd3zHz3qd13md9z5//jx/+Id/yM///M9zv1OnTvEqr/IqvMVbvAUAv/Vbv/Xdv/Vbv/U9//AP//DbXHXVVVddddVVV131fwl60IMexFVXXXXVVVddddVV/zdcc801D37Hd3zHz3qd13md9z5//jx/9Ed/xM///M/zgpw6dYpXeZVX4c3f/M0B+K3f+q3v/q3f+q3v+Yd/+Iff5qqrrrrqqquuuuqq/wvQgx70IK666qqrrrrqqquu+t/tmmuuefA7vuM7ftbrvM7rvPf58+f5oz/6I37+53+eF9WpU6d4lVd5Fd78zd8cgN/6rd/67t/6rd/6nn/4h3/4ba666qqrrrrqqquu+t8MPehBD+Kqq6666qqrrrrqqv+drrnmmge/4zu+42e9zuu8znufP3+eP/qjP+Lnf/7n+bc6deoUr/Iqr8Kbv/mbA/Bbv/Vb3/1bv/Vb3/MP//APv81VV1111VVXXXXVVf8boQc96EFcddVVV1111VVXXfW/yzXXXPPgd3zHd/ys13md13nv8+fP80d/9Ef8/M//PP9RTp06xau8yqvw5m/+5gD81m/91nf/1m/91vf8wz/8w29z1VVXXXXVVVddddX/JuhBD3oQV1111VVXXXXVVVf973DNNdc8+B3f8R0/63Ve53Xe+/z58/zRH/0Rv/ALv8B/llOnTvHKr/zKvPmbvzkAv/Vbv/Xdv/Vbv/U9//AP//DbXHXVVVddddVVV131vwF60IMexFVXXXXVVVddddVV/7Ndc801D/7wD//w73qxF3ux1z5//jx/9Ed/xC/8wi/wX+XUqVO88iu/Mm/+5m8OwH333Xfr13/917/PP/zDP/w2V1111VVXXXXVVVf9T4Ye9KAHcdVVV1111VVXXXXV/0zXXHPNgz/8wz/8u17sxV7stc+fP88f/dEf8Qu/8Av8dzl16hSv/MqvzJu/+ZsDcN9999369V//9e/zD//wD7/NVVddddVVV1111VX/E6EHPehBXHXVVVddddVVV131P8s111zz4A//8A//rhd7sRd77fPnz/NHf/RH/MIv/AL/ESTx73Xq1Cle+ZVfmTd7szcD4L777rv167/+69/nH/7hH36bq6666qqrrrrqqqv+J0EPetCDuOqqq6666qqrrrrqf4ZrrrnmwR/+4R/+XS/2Yi/22ufPn+eP//iP+YVf+AX+pzp16hSv/MqvzJu92ZsBcN9999369V//9e/zD//wD7/NVVddddVVV1111VX/E6AHPehBXHXVVVddddVVV1313+uaa6558Id/+Id/14u92Iu99vnz5/njP/5jfuEXfoH/LU6dOsUrv/Ir82Zv9mYA3Hfffbd+/dd//fv8wz/8w29z1VVXXXXVVVddddV/J/SgBz2Iq6666qqrrrrqqqv+e1xzzTUP/vAP//DverEXe7HXPn/+PH/8x3/ML/zCL/C/1alTp3jlV35l3uzN3gyA++6779av//qvf59/+Id/+G2uuuqqq6666qqrrvrvgB70oAdx1VVXXXXVVVddddV/rWuuuebBH/7hH/5dL/ZiL/ba58+f54//+I/5hV/4Bf69JPE/walTp3ilV3olXvmVX5lTp05x33333fr1X//17/MP//APv81VV1111VVXXXXVVf+V0IMe9CCuuuqqq6666qqrrvqvcc011zz4wz/8w7/rxV7sxV77/Pnz/PEf/zG/+Iu/yP9Vp06d4pVe6ZV45Vd+ZU6dOsV9991369d//de/zz/8wz/8NlddddVVV1111VVX/VdAD3rQg7jqqquuuuqqq6666j/XNddc8+AP//AP/64Xe7EXe+3z58/zx3/8x/ziL/4i/1+cOnWKV3qlV+KVX/mVOXXqFPfdd9+tX//1X/8+//AP//DbXHXVVVddddVVV131nwk96EEP4qqrrrrqqquuuuqq/xzXXHPNgz/8wz/8u17sxV7stc+fP88f//Ef84u/+Iv8byGJ/0gnT57klV/5lXmlV3olTp06xX333Xfr13/917/PP/zDP/w2V1111VVXXXXVVVf9Z0APetCDuOqqq6666qqrrrrqP9Y111zz4A//8A//rhd7sRd77fPnz/PHf/zH/OIv/iL/HpL4v+LkyZO88iu/Mq/0Sq/EqVOnuO+++279+q//+vf5h3/4h9/mqquuuuqqq6666qr/SOhBD3oQV1111VVXXXXVVVf9x7jmmmse/OEf/uHf9WIv9mKvff78ef7kT/6EX/zFX+Sq5+/kyZO88iu/Mq/0Sq/EqVOnuO+++279+q//+vf5h3/4h9/mqquuuuqqq6666qr/COhBD3oQV1111VVXXXXVVVf9+1xzzTUP/vAP//DverEXe7HXPn/+PH/yJ3/CL/7iL3LVCycJgJMnT/JKr/RKvPIrvzInT57kvvvuu/Xrv/7r3+cf/uEffpurrrrqqquuuuqqq/490IMe9CCuuuqqq6666qqrrvq3ueaaax784R/+4d/1Yi/2Yq99/vx5/uRP/oRf/MVf5H8iSfxPd/LkSV7plV6JV37lV+bkyZPcd999t37913/9+/zDP/zDb3PVVVddddVVV1111b8FetCDHsRVV1111VVXXXXVVf8611xzzYM//MM//Lte7MVe7LXPnz/Pn/zJn/CLv/iL/HtI4qorTp48ySu90ivxyq/8ypw8eZL77rvv1q//+q9/n3/4h3/4ba666qqrrrrqqquu+tdAD3rQg7jqqquuuuqqq6666kVzzTXXPPjDP/zDv+vFXuzFXvv8+fP8yZ/8Cb/0S7/EVf85Tp48ySu90ivxyq/8ypw8eZL77rvv1q//+q9/n3/4h3/4ba666qqrrrrqqquuelGgBz3oQVx11VVXXXXVVVdd9cJdc801D/7wD//w73qxF3ux175w4QJ//Md/zC/90i/x/5Ek/qudPHmSV3qlV+KVXumVOHnyJPfdd9+tX//1X/8+//AP//DbXHXVVVddddVVV131wqAHPehBXHXVVVddddVVV131/F1zzTUP/vAP//DverEXe7HXvnDhAn/8x3/ML/3SL/E/iST+vzh58iSv9EqvxCu90itx8uRJ7rvvvlu//uu//n3+4R/+4be56qqrrrrqqquuuur5QQ960IO46qqrrrrqqquuuuo5XXPNNQ/+8A//8O96sRd7sde+cOECf/zHf8wv/dIv8e8liav+/U6ePMkrvdIr8Uqv9EqcPHmS++6779av//qvf59/+Id/+G2uuuqqq6666qqrrnog9KAHPYirrrrqqquuuuqqq6645pprHvzhH/7h3/ViL/Zir33hwgX++I//mF/6pV9CElf955HEv8XJkyd5xVd8RV7plV6JkydPct9999369V//9e/zD//wD7/NVVddddVVV1111VUA6EEPehBXXXXVVVddddVV/99dc801D/7wD//w73qxF3ux175w4QJ/8id/wi/90i/xf5kk/q84efIkr/iKr8grvdIrcfLkSe67775bv/7rv/59/uEf/uG3ueqqq6666qqrrvr/DT3oQQ/iqquuuuqqq6666v+ra6655sEf/uEf/l0v9mIv9toXLlzgT/7kT/ilX/ol/qeQxFUvupMnT/KKr/iKvNIrvRInT57kvvvuu/Xrv/7r3+cf/uEffpurrrrqqquuuuqq/5/Qgx70IK666qqrrrrqqqv+v7nmmmse/OEf/uHf9WIv9mKvfeHCBf7kT/6EX/qlX+I/giSu+u918uRJXvEVX5FXeqVX4uTJk9x33323fv3Xf/37/MM//MNvc9VVV1111VVXXfX/C3rQgx7EVVddddVVV1111f8X11xzzYM//MM//Lte7MVe7LUvXLjAn/zJn/BLv/RLPJAkrnrhJPG/wcmTJ3nFV3xFXvEVX5GTJ09y33333fr1X//17/MP//APv81VV1111VVXXXXV/w/oQQ96EFddddVVV1111VX/111zzTUP/vAP//DverEXe7HXvnDhAn/yJ3/CL//yL/N/jSSuel4nT57kFV/xFXnFV3xFTp48yX333Xfr13/917/PP/zDP/w2V1111VVXXXXVVf+3oQc96EFcddVVV1111VVX/V91zTXXPPjDP/zDv+vFXuzFXvvChQv8yZ/8Cb/8y7/M/xSSuOq/zsmTJ3nFV3xFXvEVX5GTJ09y33333fr1X//17/MP//APv81VV1111VVXXXXV/03oQQ96EFddddVVV1111VX/11xzzTUP/vAP//DverEXe7HXvnDhAn/yJ3/CL//yL/MfSRJX/dtJ4r/LyZMneYVXeAVe8RVfkZMnT3Lffffd+vVf//Xv8w//8A+/zVVXXXXVVVddddX/LehBD3oQV1111VVXXXXVVf9XvNiLvdhrf/iHf/h3XXPNNQ++cOECf/Inf8Iv//Iv84JI4v8zSfx/dvLkSV7hFV6BV3zFV+TkyZPcd999t/7o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HsRVV1111VVX/Ud5x3d8x896p3d6p88GuO+++249e/bsrX//93//2//wD//w2//wD//wO1x11VVXXXXVf5BrrrnmwTyTbUvSmTNnHsyzGdA111zzYJ7NgM6cOfMgHuCaa655MM/lmmuueTDP5cyZMw/muVxzzTUP5j/Qb/3Wb33313/9178PV1111VVXXfUfAz3oQQ/iqquuuuqqq/4jvc7rvM573Xfffc/4h3/4h9/mqquuuuqqq/6fOXPmzIMkiQc4c+bMgwDxANdcc82DAPEAZ86cedCP/uiPfg5XXXXVVVdd9R8HPehBD+Kqq6666qqrrrrqqquuuuqqq6666qqrrvo/icpVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+EfbihybvpGFEAAAAABJRU5ErkJggg==) diff --git a/docs/kcl-std/profileStartX.md b/docs/kcl-std/functions/std-sketch-profileStartX.md similarity index 99% rename from docs/kcl-std/profileStartX.md rename to docs/kcl-std/functions/std-sketch-profileStartX.md index 26f4b1759..b0cb555e2 100644 --- a/docs/kcl-std/profileStartX.md +++ b/docs/kcl-std/functions/std-sketch-profileStartX.md @@ -8,7 +8,7 @@ layout: manual Extract the provided 2-dimensional sketch's profile's origin's 'x' value. ```kcl -profileStartX(@profile: Sketch): number +profileStartX(@profile: Sketch): number(Length) ``` @@ -17,21 +17,21 @@ profileStartX(@profile: Sketch): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `profile` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Profile whose start is being used | Yes | +| `profile` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Profile whose start is being used. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples ```kcl sketch001 = startSketchOn(XY) - |> startProfile(at = [5, 2]) - |> angledLine(angle = -26.6, length = 50) - |> angledLine(angle = 90, length = 50) - |> angledLine(angle = 30, endAbsoluteX = profileStartX(%)) + |> startProfile(at = [5, 2]) + |> angledLine(angle = -26.6, length = 50) + |> angledLine(angle = 90, length = 50) + |> angledLine(angle = 30, endAbsoluteX = profileStartX(%)) ``` ![Rendered example of profileStartX 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAACVBElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VX/Q/3wD//wpa7rdgC+8iu/8kF/8Ad/cBtXXXXVVVddddW/BsFVV1111VVXXXXVVVddddX/QD/xEz/hrut2eKaP/diPfcZDHvKQDa666qqrrrrqqn8Ngquuuuqqq6666qqrrrrqqv9hrrnmmgfzfHziJ37iP3DVVVddddVVV/1rULnqqquuuuqqq6666qqrrvpvdM011zz4tV/7td8L4MVf/MVf+8Ve7MVem6uuuuqqq6666j8Klauuuuqqq6666qqrrrrqqv8i11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bZ6P++6779ZrrrnmwTyXP/iDP/gUrrrqqquuuuqqfw0qV1111VVXXXXVVVddddVV/0muueaaB7/2a7/2ewG80zu902fzfNx33323/sM//MNv33fffbf+wz/8w+/8wz/8w2/zTD/xEz9hHuDVXu3Vvuiv/uqv7vmHf/iH3+aqq6666qqrrnpRoAc96EFcddVVV1111VVXXXXVVVf9e11zzTUPfrEXe7HXPnPmzINe/MVf/LVf7MVe7LV5Lvfdd9+tAL/1W7/13f/wD//wO//wD//w2/wLvumbvunp11xzzYN5prNnzz7jN3/zN7/rR3/0Rz+Hq6666qqrrrrqX0Llqquuuuqqq6666qqrrrrqX+maa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/N83Hffffd+lu/9VvfDfAP//APv/MP//APv82/0td//de/D8A7vdM7fdaLvdiLvfbf//3f/9Y//MM//A5XXXXVVVddddWLAj3oQQ/iqquuuuqqq6666qqrrrrqhbnmmmse/Nqv/drvBfDiL/7ir/1iL/Zir81zue+++249e/bsrX//93//2//wD//wO//wD//w2/wHerEXe7HX/tzP/dzfOnv27DM++IM/+MFcddVVV1111VUvCipXXXXVVVddddVVV1111VUPcM011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+b5uO+++279rd/6re8G+NEf/dHP4T/ZP/zDP/z2P/zDP/z2i73Yi732h3/4h3/X13/9178PV1111VVXXXXVv4TKVVddddVVV1111VVXXfX/2jXXXPPg137t136va6655sGv8zqv8948H/fdd9+t//AP//Db9913363/8A//8Dv/8A//8Nv8N/iRH/mRz/ncz/3c136xF3ux177mmmsefN99993KVVddddVVV131wlC56qqrrrrqqquuuuqqq/7fuOaaax78Yi/2Yq995syZB734i7/4a7/Yi73Ya/Nc7rvvvlvPnj1769///d//9j/8wz/8zj/8wz/8Nv9D/MM//MNv//3f//1vv/iLv/hrv+M7vuNnff3Xf/37cNVVV1111VVXvTDoQQ96EFddddVVV1111VVXXXXV/z3XXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttno/77rvv1t/6rd/6boB/+Id/+J1/+Id/+G3+Bztz5syDvvmbv/nW++6779av//qvf59/+Id/+G2uuuqqq6666qoXBD3oQQ/iqquuuuqqq6666qqrrvrf75prrnnwa7/2a78XwDu90zt9Ns/Hfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5n+hD//wD/+u13md13nvf/iHf/jtz/zMz3wdrrrqqquuuuqqFwQ96EEP4qqrrrrqqquuuuqqq6763+Waa6558Iu92Iu99pkzZx704i/+4q/9Yi/2Yq/Nc7nvvvtuBfit3/qt7/6Hf/iH3/mHf/iH3+b/iGuuuebB3/RN3/R0gM/8zM98nX/4h3/4ba666qqrrrrqqucHPehBD+Kqq6666qqrrrrqqquu+p/rmmuuefCZM2ce/GIv9mKv9eIv/uKv/WIv9mKvzfNx33333fpbv/Vb3w3wD//wD7/zD//wD7/N/2Hv+I7v+Fnv9E7v9Nn/8A//8Nuf+Zmf+TpcddVVV1111VXPD3rQgx7EVVddddVVV1111VVXXfU/xzXXXPPg137t134vgBd/8Rd/7Rd7sRd7bZ7Lfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5v+Za6655sHf9E3f9HSAz/qsz3qdv//7v/9trrrqqquuuuqq54Ye9KAHcdVVV1111VVXXXXVVVf997jmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzfNx33323/tZv/dZ3A/zoj/7o53DVZa/zOq/z3h/+4R/+XWfPnn3GB3/wBz+Yq6666qqrrrrquVG56qqrrrrqqquuuuqqq/7LXHPNNQ9+7dd+7fe65pprHvw6r/M6783zcd999936D//wD79933333foP//APv/MP//APv81Vz9c//MM//PY//MM//PaLvdiLvfbrvM7rvPdv/dZvfTdXXXXVVVddddUDoQc96EFcddVVV1111VVXXXXVVf/xrrnmmge/2Iu92GufOXPmQS/+4i/+2i/2Yi/22jyX++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVX/Kq/zOq/z3h/+4R/+Xffdd9+tH/IhH/IQrrrqqquuuuqqB0IPetCDuOqqq6666qqrrrrqqqv+fa655poHnzlz5sEv9mIv9lov/uIv/tov9mIv9to8H/fdd9+tv/Vbv/XdAP/wD//wO//wD//w21z17/Y5n/M5v/XiL/7ir/0jP/Ijn/2jP/qjn8NVV1111VVXXXU/9KAHPYirrrrqqquuuuqqq6666l/nmmuuefBrv/ZrvxfA67zO67z3Nddc82Cey3333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aq/xQv9mIv9lqf+7mf+9v33XffrR/yIR/yEK666qqrrrrqqvtRueqqq6666qqrrrrqqqteqGuuuebBL/ZiL/baZ86cedCLv/iLv/aLvdiLvTbP5b777rsV4Ld+67e+++zZs8/4rd/6re/mqv8y//AP//A7//AP//DbL/ZiL/baH/7hH/5dX//1X/8+XHXVVVddddVVAFSuuuqqq6666qqrrrrqqme55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr83zcd999t/7Wb/3WdwP8wz/8w+/8wz/8w29z1X+rr//6r3+fb/qmb3r6i73Yi732Nddc8+D77rvvVq666qqrrrrqKipXXXXVVVddddVVV131/9g111zz4Nd+7dd+L4AXf/EXf+0Xe7EXe22ey3333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aq/3Huu+++W3/rt37ru1/ndV7nvd/xHd/xs77+67/+fbjqqquuuuqqq9CDHvQgrrrqqquuuuqqq6666v+Da6655sFnzpx58Iu92Iu91ou/+Iu/9ou92Iu9Ns/Hfffdd+tv/dZvfTfAj/7oj34OV/2vcc011zz4m77pm55+33333foN3/AN7/P3f//3v81VV1111VVX/f9G5aqrrrrqqquuuuqqq/6Puuaaax782q/92u91zTXXPPh1Xud13pvn47777rv1H/7hH377vvvuu/Uf/uEffucf/uEffpur/te67777bv2t3/qt736d13md937Hd3zHz/77v//71+aqq6666qqr/n9DD3rQg7jqqquuuuqqq6666qr/7a655poHv9iLvdhrnzlz5kEv/uIv/tov9mIv9to8l/vuu+/Ws2fP3vr3f//3v/0P//APv/MP//APv81V/+dcc801D/6mb/qmpwN85md+5uv8wz/8w29z1VVXXXXVVf9/oQc96EFcddVVV1111VVXXXXV/ybXXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttno/77rvv1t/6rd/6boB/+Id/+J1/+Id/+G2u+n/hdV7ndd77wz/8w7/rvvvuu/VDPuRDHsJVV1111VVX/f9F5aqrrrrqqquuuuqqq/6Hu+aaax782q/92u8F8Dqv8zrvfc011zyY53Lffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56v+tf/iHf/jt++6779ZrrrnmwS/2Yi/22v/wD//w21x11VVXXXXV/0/oQQ96EFddddVVV1111VVXXfU/xTXXXPPgF3uxF3vtM2fOPOjFX/zFX/vFXuzFXpvn47777rv1t37rt7777Nmzz/it3/qt7+aqq57L67zO67z3h3/4h3/Xfffdd+uHfMiHPISrrrrqqquu+v+JylVXXXXVVVddddVVV/03ueaaax4M8Nqv/drv9eIv/uKv/WIv9mKvzfNx33333fpbv/Vb3w3wD//wD7/zD//wD7/NVVf9C/7+7//+t/7hH/7ht1/sxV7stV/ndV7nvX/rt37ru7nqqquuuuqq/3/Qgx70IK666qqrrrrqqquuuuq/wjXXXPPg137t134vgBd/8Rd/7Rd7sRd7bZ7Lfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqr/o1e7MVe7LU/93M/97fuu+++Wz/kQz7kIVx11VVXXXXV/z9Urrrqqquuuuqqq6666j/BNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vhvgR3/0Rz+Hq676D/QP//APv/0P//APv/1iL/Zir/3hH/7h3/X1X//178NVV1111VVX/f9C5aqrrrrqqquuuuqqq/4DXHPNNQ9+7dd+7fe65pprHvw6r/M6783zcd999936D//wD79933333foP//APv/MP//APv81VV/0n+5Ef+ZHP+dzP/dzXfrEXe7HXvuaaax5833333cpVV1111VVX/f9B5aqrrrrqqquuuuqqq/6Vrrnmmge/2Iu92GufOXPmQS/+4i/+2i/2Yi/22jyX++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVX/Tf4h3/4h9/+h3/4h99+sRd7sdd+x3d8x8/6+q//+vfhqquuuuqqq/7/QA960IO46qqrrrrqqquuuuqqF+Saa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/N83Hffffd+lu/9VvfDfAP//APv/MP//APv81VV/0Pcc011zz4m77pm55+9uzZZ3zd133de//DP/zDb3PVVVddddVV/z9Queqqq6666qqrrrrqqge45pprHvzar/3a7wXwOq/zOu99zTXXPJjnct9999169uzZW//+7//+t//hH/7hd/7hH/7ht7nqqv/B7rvvvlt/67d+67tf53Ve571f53Ve573+4R/+4be56qqrrrrqqv8f0IMe9CCuuuqqq6666qqrrvr/6Zprrnnwi73Yi732mTNnHvTiL/7ir/1iL/Zir83zcd999936W7/1W9999uzZZ/zWb/3Wd3PVVf8LXXPNNQ/+pm/6pqcDfOZnfubr/MM//MNvc9VVV1111VX/96EHPehBXHXVVVddddVVV131f98111zzYIDXfu3Xfq8Xf/EXf+0Xe7EXe22ej/vuu+/Wf/iHf/jt++6779Z/+Id/+J1/+Id/+G2uuur/iHd8x3f8rHd6p3f67H/4h3/47c/8zM98Ha666qqrrrrq/z70oAc9iKuuuuqqq6666qqr/u+55pprHvzar/3a7wXw4i/+4q/9Yi/2Yq/Nc7nvvvtuPXv27K1///d//9v/8A//8Dv/8A//8NtcddX/YWfOnHnQN3/zN98K8Jmf+Zmv8w//8A+/zVVXXXXVVVf934Ye9KAHcdVVV1111VVXXXXV/27XXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttno/77rvv1t/6rd/6boAf/dEf/Ryuuur/odd5ndd57w//8A//rvvuu+/WD/mQD3kIV1111VVXXfV/G5Wrrrrqqquuuuqqq/7Xueaaax782q/92u8F8E7v9E6fzfNx33333foP//APv33ffffd+g//8A+/8w//8A+/zVVXXcU//MM//PZ999136zXXXPPg13md13nv3/qt3/purrrqqquuuur/LvSgBz2Iq6666qqrrrrqqqv+57rmmmse/GIv9mKvfebMmQe9+Iu/+Gu/2Iu92GvzXO67775bz549e+vf//3f//Y//MM//M4//MM//DZXXXXVC/Q6r/M67/3hH/7h33Xffffd+iEf8iEP4aqrrrrqqqv+76Jy1VVXXXXVVVddddX/GNdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ej/vuu+/W3/qt3/pugH/4h3/4nX/4h3/4ba666qoX2T/8wz/89j/8wz/89ou92Iu99uu8zuu892/91m99N1ddddVVV131fxN60IMexFVXXXXVVVddddVV/z2uueaaB7/2a7/2ewG8zuu8zntfc801D+a53HfffbeePXv21r//+7//7X/4h3/4nX/4h3/4ba666qp/txd7sRd77c/93M/9rbNnzz7jgz/4gx/MVVddddVVV/3fROWqq6666qqrrrrqqv8S11xzzYNf7MVe7LXPnDnzoBd/8Rd/7Rd7sRd7bZ6P++6779bf+q3f+u6zZ88+47d+67e+m6uuuuo/xT/8wz/89j/8wz/89ou92Iu99od/+Id/19d//de/D1ddddVVV131fw+Vq6666qqrrrrqqqv+w11zzTUPBnjt137t93rxF3/x136xF3ux1+b5uO+++279h3/4h9++7777bv2Hf/iH3/mHf/iH3+aqq676L/P1X//17/NN3/RNT3+xF3ux177mmmsefN99993KVVddddVVV/3fQuWqq6666qqrrrrqqn+3a6655sGv/dqv/V4AL/7iL/7aL/ZiL/baPJf77rvv1rNnz97693//97/9D//wD7/zD//wD7/NVVdd9d/qvvvuu/Xv//7vf/vFX/zFX/sd3/EdP+vrv/7r34errrrqqquu+r8FPehBD+Kqq6666qqrrrrqqhfdNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vhvgt3/7t7/nvvvuu5Wrrrrqf5wzZ8486Ju/+Ztvve+++279+q//+vf5h3/4h9/mqquuuuqqq/7vQA960IO46qqrrrrqqquuuuoFu+aaax782q/92u8F8E7v9E6fzfNx33333foP//APv33ffffd+g//8A+/8w//8A+/zVVXXfW/xod/+Id/1+u8zuu89z/8wz/89md+5me+DlddddVVV131fwd60IMexFVXXXXVVVddddVVV1xzzTUPfrEXe7HXPnPmzINe/MVf/LVf7MVe7LV5Lvfdd9+tZ8+evfXv//7vf/sf/uEffucf/uEffpurrrrqf7Vrrrnmwd/0Td/0dIDP/MzPfJ1/+Id/+G2uuuqqq6666v8G9KAHPYirrrrqqquuuuqq/4+uueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPB/33Xffrb/1W7/13QD/8A//8Dv/8A//8NtcddVV/+e8zuu8znt/+Id/+Hf9wz/8w29/5md+5utw1VVXXXXVVf83ULnqqquuuuqqq676f+Kaa6558Gu/9mu/F8CLv/iLv/aLvdiLvTbP5b777rv17Nmzt/793//9b//DP/zD7/zDP/zDb3PVVVf9v/AP//APv33ffffd+mIv9mKv/eIv/uKv/fd///e/zVVXXXXVVVf974ce9KAHcdVVV1111VVXXfV/zTXXXPPgF3uxF3vtM2fOPOjFX/zFX/vFXuzFXpvn47777rv1t37rt7777Nmzz/it3/qt7+aqq676f+11Xud13vvDP/zDv+vs2bPP+OAP/uAHc9VVV1111VX/+1G56qqrrrrqqquu+l/ummuueTDAa7/2a7/Xi7/4i7/2i73Yi702z8d999136z/8wz/89n333XfrP/zDP/zOP/zDP/w2V1111VUP8A//8A+//Q//8A+//WIv9mKv/Tqv8zrv/Vu/9VvfzVVXXXXVVVf974Ye9KAHcdVVV1111VVXXfW/yTXXXPPg137t134vgBd/8Rd/7Rd7sRd7bZ7Lfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqRfA6r/M67/3hH/7h33Xffffd+iEf8iEP4aqrrrrqqqv+d0MPetCDuOqqq6666qqrrvqf6pprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir83zcd999936W7/1W98N8Nu//dvfc999993KVVddddW/0ed8zuf81ou/+Iu/9o/8yI989o/+6I9+DlddddVVV131vxeVq6666qqrrrrqqv9Brrnmmge/9mu/9nsBvNM7vdNn83zcd999t/7DP/zDb9933323/sM//MPv/MM//MNvc9VVV131H+hHf/RHP/vFX/zFf/t1Xud13vu3f/u3v+e+++67lauuuuqqq67634nKVVddddVVV1111X+Ta6655sEv9mIv9tpnzpx50Iu/+Iu/9ou92Iu9Ns/lvvvuuxXgt37rt777H/7hH37nH/7hH36bq6666qr/ZP/wD//wO//wD//w2y/2Yi/22u/4ju/4WV//9V//Plx11VVXXXXV/07oQQ96EFddddVVV1111VX/2a655poHnzlz5sEv9mIv9lov/uIv/tov9mIv9to8H/fdd9+tv/Vbv/XdAP/wD//wO//wD//w21x11VVX/Te45pprHvxN3/RNT7/vvvtu/fqv//r3+Yd/+Iff5qqrrrrqqqv+96Fy1VVXXXXVVVdd9Z/gmmuuefBrv/ZrvxfAi7/4i7/2i73Yi702z+W+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXfU/xH333Xfrb/3Wb33367zO67z367zO67zXP/zDP/w2V1111VVXXfW/D3rQgx7EVVddddVVV1111b/HNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vvvs2bPP+K3f+q3v5qqrrrrqf7hrrrnmwd/0Td/0dIDP+qzPep2///u//22uuuqqq6666n8XKlddddVVV1111VX/Ctdcc82DAV77tV/7vV78xV/8tV/sxV7stXk+7rvvvlv/4R/+4bfvu+++W//hH/7hd/7hH/7ht7nqqquu+l/mvvvuu/VHfuRHPvud3umdPvsd3/EdP/vv//7vX5urrrrqqquu+t8FPehBD+Kqq6666qqrrrrqBbnmmmse/Nqv/drvBfDiL/7ir/1iL/Zir81zue+++249e/bsrX//93//2//wD//wO//wD//w21x11VVX/R9xzTXXPPibvumbng7wmZ/5ma/zD//wD7/NVVddddVVV/3vgR70oAdx1VVXXXXVVVddBXDNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfm+bjvvvtu/a3f+q3vBvjt3/7t77nvvvtu5aqrrrrq/7DXeZ3Xee8P//AP/6777rvv1g/5kA95CFddddVVV131vweVq6666qqrrrrq/61rrrnmwa/92q/9XgDv9E7v9Nk8H/fdd9+t//AP//Db9913363/8A//8Dv/8A//8NtcddVVV/0/8w//8A+/fd999916zTXXPPh1Xud13vu3fuu3vpurrrrqqquu+t8BPehBD+Kqq6666qqrrvq/75prrnnwi73Yi732mTNnHvTiL/7ir/1iL/Zir81zue+++24F+K3f+q3v/od/+Iff+Yd/+Iff5qqrrrrqqste53Ve570//MM//Lvuu+++Wz/kQz7kIVx11VVXXXXV/w5Urrrqqquuuuqq/3OuueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPB/33Xffrb/1W7/13QD/8A//8Dv/8A//8NtcddVVV131fP393//9b/3DP/zDb7/Yi73Ya7/O67zOe//Wb/3Wd3PVVVddddVV//OhBz3oQVx11VVXXXXVVf+7XXPNNQ9+7dd+7fcCePEXf/HXfrEXe7HX5rncd999t549e/bWv//7v//tf/iHf/idf/iHf/htrrrqqquu+ld5sRd7sdf+3M/93N+67777bv2QD/mQh3DVVVddddVV//NRueqqq6666qqr/le55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr83zcd999t/7Wb/3WdwP86I/+6Odw1VVXXXXVv9s//MM//PY//MM//PaLvdiLvfaHf/iHf9fXf/3Xvw9XXXXVVVdd9T8blauuuuqqq6666n+sa6655sEAr/3ar/1e11xzzYNf53Ve5715Pu67775b/+Ef/uG377vvvlv/4R/+4Xf+4R/+4be56qqrrrrqP8XXf/3Xv883fdM3Pf3FXuzFXvuaa6558H333XcrV1111VVXXfU/F5Wrrrrqqquuuup/jGuuuebBr/3ar/1eAC/+4i/+2i/2Yi/22jyX++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVf9l7rvvvlv/4R/+4bdf7MVe7LXf8R3f8bO+/uu//n246qqrrrrqqv+50IMe9CCuuuqqq6666qr/etdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ej/vuu+/W3/qt3/pugN/+7d/+nvvuu+9Wrrrqqquu+m91zTXXPPibvumbnn727NlnfN3Xfd17/8M//MNvc9VVV1111VX/M6EHPehBXHXVVVddddVV//muueaaB7/2a7/2ewG80zu902fzfNx33323/sM//MNv33fffbf+wz/8w+/8wz/8w29z1VVXXXXV/0gf/uEf/l2v8zqv897/8A//8Nuf+Zmf+TpcddVVV1111f9M6EEPehBXXXXVVVddddV/rGuuuebBL/ZiL/baZ86cedCLv/iLv/aLvdiLvTbP5b777rsV4Ld+67e++x/+4R9+5x/+4R9+m6uuuuqqq/7XuOaaax78Td/0TU8H+MzP/MzX+Yd/+Iff5qqrrrrqqqv+50EPetCDuOqqq6666qqr/u2uueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPB/33Xffrb/1W7/13QD/8A//8Dv/8A//8NtcddVVV131v9rrvM7rvPeHf/iHf9c//MM//PZnfuZnvg5XXXXVVVdd9T8Plauuuuqqq6666l/lmmuuefBrv/ZrvxfAi7/4i7/2i73Yi702z+W+++679ezZs7f+/d///W//wz/8w+/8wz/8w29z1VVXXXXV/zl///d//1v33XffrS/2Yi/22i/2Yi/22v/wD//w21x11VVXXXXV/yzoQQ96EFddddVVV1111fN3zTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5vm47777bv2t3/qt7wb40R/90c/hqquuuuqq/zde53Ve570//MM//Lvuu+++Wz/kQz7kIVx11VVXXXXV/yxUrrrqqquuuuqqZ7nmmmse/Nqv/drvdc011zz4dV7ndd6b5+O+++679R/+4R9++7777rv1H/7hH37nH/7hH36bq6666qqr/t/6h3/4h9/+h3/4h99+sRd7sdd+ndd5nff+rd/6re/mqquuuuqqq/7nQA960IO46qqrrrrqqv+Prrnmmge/9mu/9nsBvPiLv/hrv9iLvdhr81zuu+++W8+ePXvr3//93//2P/zDP/zOP/zDP/w2V1111VVXXfVcXud1Xue9P/zDP/y77rvvvls/5EM+5CFcddVVV1111f8c6EEPehBXXXXVVVdd9X/dNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+fjvvvuu/W3fuu3vhvgH/7hH37nH/7hH36bq6666qqrrnoRfO7nfu5vvdiLvdhr/+iP/ujn/MiP/Mhnc9VVV1111VX/M6AHPehBXHXVVVddddX/Nddcc82DX/u1X/u9AN7pnd7ps3k+7rvvvlv/4R/+4bfvu+++W//hH/7hd/7hH/7ht7nqqquuuuqqf6MXe7EXe+3P/dzP/a2zZ88+44M/+IMfzFVXXXXVVVf9z0Dlqquuuuqqq/6Xu+aaax78Yi/2Yq995syZB734i7/4a7/Yi73Ya/Nc7rvvvlsBfuu3fuu7/+Ef/uF3/uEf/uG3ueqqq6666qr/QP/wD//w2//wD//w2y/2Yi/22h/+4R/+XV//9V//Plx11VVXXXXVfz8qV1111VVXXfW/yDXXXPPgM2fOPPjFXuzFXuvFX/zFX/vFXuzFXpvn47777rv1t37rt74b4B/+4R9+5x/+4R9+m6uuuuqqq676T/b1X//17/NN3/RNT3+xF3ux177mmmsefN99993KVVddddVVV/33onLVVVddddVV/00+93M/97d4Pj7zMz/zdXima6655sGv/dqv/V4AL/7iL/7aL/ZiL/baPJf77rvv1rNnz97693//97/9D//wD7/zD//wD7/NVVddddVVV/03uO+++279rd/6re9+ndd5nfd+x3d8x8/6+q//+vfhqquuuuqqq/57Ubnqqquuuuqq/yYv9mIv9to8H+/4ju/4WS/+4i/+2i/2Yi/22jwf9913362/9Vu/9d0AP/qjP/o5XHXVVVddddX/ID/yIz/y2a/zOq/z3i/2Yi/22i/2Yi/22v/wD//w21x11VVXXXXVfx/0oAc9iKuuuuqqq6767/ATP/ET5l9w33333foP//APv33ffffd+g//8A+/8w//8A+/zVVXXXXVVVf9D/fhH/7h3/U6r/M67/0P//APv/2Zn/mZr8NVV1111VVX/fehctVVV1111VX/w/zIj/zIZ//DP/zD7/zDP/zDb3PVVVddddVV/wv96I/+6Oe8zuu8znu/2Iu92Gu/2Iu92Gv/wz/8w29z1VVXXXXVVf89CK666qqrrrrqf5gf/dEf/Zx/+Id/+G2uuuqqq6666n+p++6779av//qvfx+AD//wD/8urrrqqquuuuq/D8FVV1111VVXXXXVVVddddVV/+H+4R/+4bfvu+++W6+55poHv/iLv/hrc9VVV1111VX/PdCDHvQgrrrqqquuuuq/w4u92Iu9Ns/HP/zDP/w2V1111VVXXfV/wOu8zuu894d/+Id/19mzZ5/xwR/8wQ/mqquuuuqqq/7rUY4fP85VV1111VVX/Ve45pprHry5uXl8c3Pz+Obm5vGjo6Pdo6Oj3VtvvfWvz549e+vZs2dvPXv27K1cddVVV1111f8RR0dHuw95yENe+sEPfvBLnz179hm33nrrX3PVVVddddVV/7XQgx70IK666qqrrrrqP9s111zz4G/6pm96Os/lvvvuu/VDPuRDHsJVV1111VVX/R/1Yi/2Yq/9uZ/7ub9133333fohH/IhD+Gqq6666qqr/msRXHXVVVddddVVV1111VVXXfWf5h/+4R9+++///u9/+5prrnnwh3/4h38XV1111VVXXfVfi+Cqq6666qqr/pu92Iu92Gtz1VVXXXXVVf+H/eiP/uhnA7zYi73Ya19zzTUP5qqrrrrqqqv+61COHz/OVVddddVVV/1n29zcPP7mb/7mH81z2dzcPP46r/M67/06r/M67/1Kr/RKb33mzJkHAzp79uytXHXVVVddddX/EWfPnn3Gi7/4i7/2Qx7ykJfe3Nw8/qd/+qc/w1VXXXXVVVf916By1VVXXXXVVf/N/uEf/uG3X+zFXuy1r7nmmge/2Iu92GsD3HfffbcC/MM//MNv/9Zv/db3/MM//MNvc9VVV1111VX/i33913/9+3zTN33T01/sxV7stV/sxV7stf/hH/7ht7nqqquuuuqq/3yU48ePc9VVV1111VX/2TY3N4+/4iu+4lsfHh7uHh4e7h4eHu4eHh7u3nrrrX/9mZ/5ma/z27/9299z6623/s3h4eHu0dHR7kMe8pCX3tzcPP6QhzzkpV/ndV7nvV/ndV7nvd/8zd/8ox/ykIe89Obm5olbb731r7nqqquuuuqq/0UODw93r7nmmge/+Iu/+Gtfc801D/6t3/qt7+Gqq6666qqr/vOhBz3oQVx11VVXXXXV/zTXXHPNg8+cOfPgF3uxF3utF3/xF3/tF3uxF3ttnst999136z/8wz/89j/8wz/8zm/91m99N1ddddVVV131P9w111zz4G/6pm96OsBnfdZnvc7f//3f/zZXXXXVVVdd9Z8LPehBD+Kqq6666qqr/qe75pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr81zuu+++W//hH/7ht//hH/7hd37rt37ru7nqqquuuuqq/4He8R3f8bPe6Z3e6bP/4R/+4Xc+8zM/87W56qqrrrrqqv9c6EEPehBXXXXVVVdd9b/NNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+dy33333foP//APv/0P//APv/MP//APv33ffffdylVXXXXVVVf9N7vmmmse/E3f9E1PB/jMz/zM1/mHf/iH3+aqq6666qqr/vOgBz3oQVx11VVXXXXV/3bXXHPNgwFe7MVe7LVf53Ve571e7MVe7LV5Lvfdd9+t//AP//Db//AP//A79913363/8A//8NtcddVVV1111X+D13md13nvD//wD/+u++6779YP+ZAPeQhXXXXVVVdd9Z8HPehBD+Kqq6666qqr/q+55pprHgzwYi/2Yq/9Oq/zOu/1Yi/2Yq/Nc7nvvvtu/Yd/+Iff/od/+Iffue+++279h3/4h9/mqquuuuqqq/4LXHPNNQ/+nM/5nN+65pprHvz1X//17/Nbv/Vb381VV1111VVX/edAD3rQg7jqqquuuuqq/w+uueaaB7/Yi73Ya7/Yi73Ya73O67zOe/Nc7rvvvlv/4R/+4bf/4R/+4Xfuu+++W//hH/7ht7nqqquuuuqq/ySv8zqv894f/uEf/l333XffrR/yIR/yEK666qqrrrrqPwd60IMexFVXXXXVVVf9f3TNNdc8+MVe7MVe+8Ve7MVe63Ve53Xem+dy33333foP//APv/0P//APv3Pffffd+g//8A+/zVVXXXXVVVf9B/rcz/3c33qxF3ux1/6RH/mRz/7RH/3Rz+Gqq6666qqr/uOhBz3oQVx11VVXXXXVVXDNNdc8+MVe7MVe+8Ve7MVe63Ve53Xem+dy33333foP//APv/0P//APv3Pffffd+g//8A+/zVVXXXXVVVf9O7zYi73Ya3/u537ub9133323fsiHfMhDuOqqq6666qr/eOhBD3oQV1111VVXXXXV87rmmmse/GIv9mKv/WIv9mKvdc011zz4xV7sxV6bB7jvvvtuPXv27K1///d//9v/8A//8Dv/8A//8NtcddVVV1111b/S537u5/7Wi73Yi732b/3Wb33313/9178PV1111VVXXfUfCz3oQQ/iqquuuuqqq676l11zzTUPfrEXe7HXfrEXe7HXuuaaax78Yi/2Yq/NA9x33323nj179ta///u//+1/+Id/+J1/+Id/+G2uuuqqq6666l9wzTXXPPibvumbnn7ffffd+lmf9Vmvc999993KVVddddVVV/3HQQ960IO46qqrrrrqqqv+9a655poHv9iLvdhrv9iLvdhrXXPNNQ9+sRd7sdfmAe67775bz549e+vf//3f//Y//MM//M4//MM//DZXXXXVVVdd9Xx8+Id/+He9zuu8znv/1m/91nd//dd//ftw1VVXXXXVVf9x0IMe9CCuuuqqq6666qp/v2uuuebBL/ZiL/baL/ZiL/Za11xzzYNf7MVe7LV5gPvuu+9WgH/4h3/47d/6rd/6nn/4h3/4ba666qqrrroKuOaaax78Td/0TU8/e/bsM77u677uvf/hH/7ht7nqqquuuuqq/xjoQQ96EFddddVVV1111X+8a6655sEv9mIv9tov9mIv9lrXXHPNg1/sxV7stXmA++6771aAf/iHf/jtf/iHf/id3/qt3/purrrqqquu+n/rwz/8w7/rdV7ndd77H/7hH377Mz/zM1+Hq6666qqrrvqPgR70oAdx1VVXXXXVVVf957vmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzXO67775b/+Ef/uG3/+Ef/uF3fuu3fuu7ueqqq6666v+Na6655sHf9E3f9HSAz/zMz3ydf/iHf/htrrrqqquuuurfDz3oQQ/iqquuuuqqq676r3fNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfmudx33323/sM//MNv/8M//MPv/NZv/dZ3c9VVV1111f9pr/M6r/PeH/7hH/5d9913360f8iEf8hCuuuqqq6666t8PPehBD+Kqq6666qqrrvrvd8011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+a53Hfffbf+wz/8w2//wz/8w+/cd999t/7DP/zDb3PVVVddddX/GWfOnHnQ537u5/72Nddc8+DP/MzPfJ1/+Id/+G2uuuqqq6666t8HPehBD+Kqq6666qqrrvqf55prrnkwwIu92Iu99uu8zuu814u92Iu9Ns/lvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6uuuuqqq/5Xe53XeZ33/vAP//Dvuu+++279kA/5kIdw1VVXXXXVVf8+6EEPehBXXXXVVVddddX/fNdcc82DAV7sxV7stV/sxV7stV7ndV7nvXku9913363/8A//8Nv/8A//8Dv33Xffrf/wD//w21x11VVXXfW/yjXXXPPgD//wD/+uF3uxF3vtr//6r3+f3/qt3/purrrqqquuuurfDj3oQQ/iqquuuuqqq6763+maa6558Iu92Iu99ou92Iu91uu8zuu8N8/lvvvuu/Uf/uEffvsf/uEffue+++679R/+4R9+m6uuuuqqq/7He7EXe7HX/tzP/dzfuu+++279kA/5kIdw1VVXXXXVVf926EEPehBXXXXVVVddddX/Dddcc82DX+zFXuy1X+zFXuy1Xud1Xue9eS733Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXVVVdd9T/S537u5/7Wi73Yi732b/3Wb33313/9178PV1111VVXXfVvgx70oAdx1VVXXXXVVVf933TNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3Dffffd+g//8A+/fd999936D//wD7/zD//wD7/NVVddddVV/yO82Iu92Gt/7ud+7m+dPXv2GZ/5mZ/52vfdd9+tXHXVVVddddW/HnrQgx7EVVddddVVV131/8M111zz4Bd7sRd77Rd7sRd7rWuuuebBL/ZiL/baPMB9991369mzZ2/9+7//+9/+h3/4h9/5h3/4h9/mqquuuuqq/zaf+7mf+1sv9mIv9tq/9Vu/9d1f//Vf/z5cddVVV1111b8eetCDHsRVV1111VVXXfX/0zXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9to8wH333Xfr2bNnb/37v//73/6Hf/iH3/mHf/iH3+aqq6666qr/Mtdcc82Dv+mbvunp9913361f//Vf/z7/8A//8NtcddVVV1111b8OetCDHsRVV1111VVXXXUVwDXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9to8wH333Xfr2bNnb73vvvtu/a3f+q3v+Yd/+Iff5qqrrrrqqv9UH/7hH/5dr/M6r/Pev/Vbv/XdX//1X/8+XHXVVVddddW/DnrQgx7EVVddddVVV1111fNzzTXXPPjFXuzFXvvFXuzFXuuaa6558Iu92Iu9Ng9w33333QrwD//wD7/9W7/1W9/zD//wD7/NVVddddVV/6HOnDnzoG/+5m++FeAzP/MzX+cf/uEffpurrrrqqquuetGhBz3oQVx11VVXXXXVVVe9KK655poHv9iLvdhrv9iLvdhrXXPNNQ9+sRd7sdfmAe67775bAf7hH/7ht//hH/7hd37rt37ru7nqqquuuurf7R3f8R0/653e6Z0++x/+4R9++zM/8zNfh6uuuuqqq6560aEHPehBXHXVVVddddVVV/1bXHPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXku9913363/8A//8Nv/8A//8Du/9Vu/9d1cddVVV131r3bNNdc8+Ju+6ZueDvCZn/mZr/MP//APv81VV1111VVXvWjQgx70IK666qqrrrrqqqv+I1xzzTUPPnPmzINf7MVe7LVe/MVf/LVf7MVe7LV5Lvfdd9+t//AP//Db//AP//A7v/Vbv/XdXHXVVVdd9SJ5ndd5nff+8A//8O+67777bv2QD/mQh3DVVVddddVVLxr0oAc9iKuuuuqqq6666qr/DNdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ey3333XfrP/zDP/z2P/zDP/zOfffdd+s//MM//DZXXXXVVVc9j2uuuebBn/M5n/Nb11xzzYO//uu//n1+67d+67u56qqrrrrqqn8ZetCDHsRVV1111VVXXXXVf4VrrrnmwQAv9mIv9tqv8zqv814v9mIv9to8l/vuu+/Wf/iHf/jtf/iHf/id++6779Z/+Id/+G2uuuqqq6667HVe53Xe+8M//MO/6+zZs8/44A/+4Adz1VVXXXXVVf8y9KAHPYirrrrqqquuuuqq/w7XXHPNgwFe7MVe7LVf7MVe7LVe53Ve5715Lvfdd9+t//AP//Db//AP//A79913363/8A//8NtcddVVV/0/dc011zz4wz/8w7/rxV7sxV7767/+69/nt37rt76bq6666qqrrnrh0IMe9CCuuuqqq6666qqr/qe45pprHvxiL/Zir/1iL/Zir/U6r/M6781zue+++279h3/4h9/+h3/4h9+57777bv2Hf/iH3+aqq6666v+RF3uxF3vtz/3cz/2t++6779YP+ZAPeQhXXXXVVVdd9cKhBz3oQVx11VVXXXXVVVf9T3XNNdc8+MVe7MVe+8Ve7MVe63Ve53Xem+dy33333foP//APv/0P//APv3Pffffd+g//8A+/zVVXXXXV/3Gf8zmf81sv/uIv/tq/9Vu/9d1f//Vf/z5cddVVV1111QuGHvSgB3HVVVddddVVV131v8U111zz4Bd7sRd77Rd7sRd7rWuuuebBL/ZiL/baPMDZs2efcd999z397//+73/7H/7hH37nH/7hH36bq6666qr/Y86cOfOgb/7mb771vvvuu/WzPuuzXue+++67lauuuuqqq656/tCDHvQgrrrqqquuuuqqq/63uuaaax78Yi/2Yq/9Yi/2Yq91zTXXPPjFXuzFXpsHuO+++249e/bsM/7+7//+t/7hH/7hd/7hH/7ht7nqqquu+j/gcz/3c3/rxV7sxV77t37rt77767/+69+Hq6666qqrrnr+0IMe9CCuuuqqq6666qqr/q84c+bMg178xV/8dV7sxV7sta655poHv9iLvdhr8wD33XffrWfPnr31H/7hH37n7//+73/7H/7hH36bq6666qr/ha655poHf9M3fdPT77vvvlu//uu//n3+4R/+4be56qqrrrrqqueFHvSgB3HVVVddddVVV131f9U111zz4Bd7sRd7rRd7sRd77WuuuebBL/ZiL/baPMB9991369mzZ2+97777bv2t3/qt7/mHf/iH3+aqq6666n+JD//wD/+u13md13nvf/iHf/jtz/zMz3wdrrrqqquuuup5oQc96EFcddVVV1111VVX/X9xzTXXPPjFXuzFXvvFXuzFXuuaa6558Iu92Iu9Ng9w33333QrwD//wD7/9W7/1W9/zD//wD7/NVVddddX/UNdcc82Dv+mbvunpAJ/1WZ/1On//93//21x11VVXXXXVc0IPetCDuOqqq6666qqrrvr/6pprrnnwmTNnHvxiL/Zir/XiL/7ir/1iL/Zir81zue+++279h3/4h9/+h3/4h9/5rd/6re/mqquuuup/kNd5ndd57w//8A//rn/4h3/4nc/8zM98ba666qqrrrrqOaEHPehBXHXVVVddddVVV111xTXXXPPgM2fOPPjFXuzFXuvFX/zFX/vFXuzFXpvncvbs2Wf8/d///W/9wz/8w+/81m/91ndz1VVXXfXf6Jprrnnw53zO5/zWNddc8+DP/MzPfJ1/+Id/+G2uuuqqq6666tnQgx70IK666qqrrrrqqquuev7OnDnzoGuuueYhL/ZiL/ZaL/7iL/7aL/ZiL/baPJf77rvv1n/4h3/4nX/4h3/47d/6rd/6bq666qqr/ou9zuu8znt/+Id/+Hfdd999t37Ih3zIQ7jqqquuuuqqZ0MPetCDuOqqq6666qqrrrrqRXPNNdc8+MyZMw+65pprHvI6r/M67/ViL/Zir81zue+++279h3/4h9/+h3/4h9+57777bv2Hf/iH3+aqq6666j/RNddc8+AP+7AP+64Xf/EXf+2v//qvf5/f+q3f+m6uuuqqq6666gr0oAc9iKuuuuqqq6666qqr/m2uueaaBwO82Iu92Gu9zuu8znu/2Iu92GvzXO67775b/+Ef/uG3/+Ef/uF37rvvvlv/4R/+4be56qqrrvoP9jqv8zrv/eEf/uHfdd999936IR/yIQ/hqquuuuqqq65AD3rQg7jqqquuuuqqq6666j/ONddc8+AXe7EXe+0Xe7EXe63XeZ3XeW+ey3333XfrP/zDP/z2P/zDP/zOfffdd+s//MM//DZXXXXVVf8BPvdzP/e3XuzFXuy1f+RHfuSzf/RHf/RzuOqqq6666ipAD3rQg7jqqquuuuqqq6666j/PNddc8+AXe7EXe+0Xe7EXe63XeZ3XeW+ey9mzZ5/x93//97/1D//wD79z33333foP//APv81VV1111b/Bi73Yi732537u5/7Wfffdd+uHfMiHPISrrrrqqquuAvSgBz2Iq6666qqrrrrqqqv+61xzzTUPfrEXe7HXfrEXe7HXep3XeZ335rncd999t/7DP/zD7/zDP/zDb9933323/sM//MNvc9VVV131Ivrcz/3c33qxF3ux1/6t3/qt7/76r//69+Gqq6666qr/79CDHvQgrrrqqquuuuqqq67673PmzJkHvfiLv/jrvNiLvdhrXXPNNQ9+sRd7sdfmAe67775bz549e+s//MM//M7f//3f//Y//MM//DZXXXXVVS/ANddc8+Bv+qZvevp999136zd8wze8z9///d//NlddddVVV/1/hh70oAdx1VVXXXXVVVddddX/HNdcc82DX+zFXuy1XuzFXuy1r7nmmge/2Iu92GvzAPfdd9+tZ8+evfXv//7vf/sf/uEffucf/uEffpurrrrqqgf48A//8O96ndd5nff+rd/6re/++q//+vfhqquuuuqq/8/Qgx70IK666qqrrrrqqquu+p/rmmuuefCLvdiLvfaLvdiLvdY111zz4Bd7sRd7bR7gvvvuu/Xs2bO3/v3f//1v/8M//MPv/MM//MNvc9VVV/2/ds011zz4m77pm54O8Jmf+Zmv8w//8A+/zVVXXXXVVf9foQc96EFcddVVV1111VVXXfW/xzXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9to8wNmzZ59h2//wD//w27/1W7/1Pf/wD//w21x11VX/73z4h3/4d73O67zOe//DP/zDb3/mZ37m63DVVVddddX/V+hBD3oQV1111VVXXXXVVVf973XNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3DffffdKkl///d//1v/8A//8Du/9Vu/9d1cddVV/+ddc801D/6mb/qmpwN85md+5uv8wz/8w29z1VVXXXXV/0foQQ96EFddddVVV1111VVX/d9x5syZB11zzTUPebEXe7HXevEXf/HXfrEXe7HX5rncd999t/7DP/zD7/zDP/zDb//Wb/3Wd3PVVVf9n/Q6r/M67/3hH/7h33Xffffd+iEf8iEP4aqrrrrqqv+P0IMe9CCuuuqqq6666qqrrvq/65prrnnwmTNnHvRiL/Zir/3iL/7ir/1iL/Zir81zue+++279h3/4h9/+h3/4h9/5rd/6re/mqquu+j/hzJkzD/rcz/3c377mmmse/PVf//Xv81u/9VvfzVVXXXXVVf/foAc96EFcddVVV1111VVXXfX/xzXXXPPgM2fOPPjFXuzFXuvFX/zFX/vFXuzFXpvnct999936D//wD7/9D//wD79z33333foP//APv81VV131v9LrvM7rvPeHf/iHf9d9991364d8yIc8hKuuuuqqq/6/QQ960IO46qqrrrrqqquuuur/r2uuuebBAC/2Yi/22q/zOq/zXi/2Yi/22jyX++6779Z/+Id/+O1/+Id/+J377rvv1n/4h3/4ba666qr/Fa655poHf/iHf/h3vdiLvdhrf/3Xf/37/NZv/dZ3c9VVV1111f8n6EEPehBXXXXVVVddddVVV111v2uuuebBAC/2Yi/22i/2Yi/2Wq/zOq/z3jyXs2fPPuPv//7vf+sf/uEffue+++679R/+4R9+m6uuuup/rBd7sRd77c/93M/9rfvuu+/WD/mQD3kIV1111VVX/X+CHvSgB3HVVVddddVVV1111VUvzDXXXPPgF3uxF3vtF3uxF3ut13md13lvnst999136z/8wz/8zj/8wz/89n333XfrP/zDP/w2V1111f8on/u5n/tbL/ZiL/bav/Vbv/XdX//1X/8+XHXVVVdd9f8FetCDHsRVV1111VVXXXXVVVf9a5w5c+ZBL/7iL/46L/ZiL/Zar/M6r/PePJf77rvv1n/4h3/47X/4h3/4nfvuu+/Wf/iHf/htrrrqqv9WL/ZiL/ban/u5n/tbZ8+efcZnfuZnvvZ99913K1ddddVVV/1/gB70oAdx1VVXXXXVVVddddVV/x7XXHPNg1/sxV7stV7sxV7stV/sxV7sta+55poH8wD33Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXVVf/lPvdzP/e3XuzFXuy1f+u3fuu7v/7rv/59uOqqq6666v8D9KAHPYirrrrqqquuuuqqq676j3TNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3Dffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56qqr/tNdc801D/6mb/qmp9933323fv3Xf/37/MM//MNvc9VVV1111f916EEPehBXXXXVVVddddVVV131n+maa6558Iu92Iu99ou92Iu91jXXXPPgF3uxF3ttHuDs2bPPuO+++57+93//97/9D//wD7/zD//wD7/NVVdd9Z/iwz/8w7/rdV7ndd77H/7hH377Mz/zM1+Hq6666qqr/q9DD3rQg7jqqquuuuqqq6666qr/Stdcc82DX+zFXuy1X+zFXuy1rrnmmge/2Iu92GvzAPfdd9+tZ8+efcbf//3f/9Y//MM//M4//MM//DZXXXXVf4gzZ8486Ju/+ZtvBfjMz/zM1/mHf/iH3+aqq6666qr/y9CDHvQgrrrqqquuuuqqq6666r/TmTNnHvTiL/7ir/NiL/Zir3XNNdc8+MVe7MVemwe47777bgX4h3/4h9/5rd/6re/+h3/4h9/mqquu+jd7ndd5nff+8A//8O/6h3/4h9/+zM/8zNfhqquuuuqq/8vQgx70IK666qqrrrrqqquuuup/kmuuuebBL/ZiL/ZaL/ZiL/ba11xzzYNf7MVe7LV5gPvuu+9WgH/4h3/47X/4h3/4nd/6rd/6bq666qoX2TXXXPPgz/mcz/mta6655sGf+Zmf+Tr/8A//8NtcddVVV131fxV60IMexFVXXXXVVVddddVVV/1Pds011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+a53Hfffbf+wz/8w2//wz/8w+/81m/91ndz1VVXvVCv8zqv894f/uEf/l333XffrR/yIR/yEK666qqrrvq/Cj3oQQ/iqquuuuqqq6666qqr/je55pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhr81zuu+++W//hH/7ht//hH/7hd37rt37ru7nqqquewzXXXPPgD//wD/+uF3uxF3vtr//6r3+f3/qt3/purrrqqquu+r8IPehBD+Kqq6666qqrrrrqqqv+N7vmmmsefObMmQe/2Iu92Gu9+Iu/+Gu/2Iu92GvzXM6ePfuMv//7v/+tf/iHf/id++6779Z/+Id/+G2uuur/udd5ndd57w//8A//rrNnzz7jgz/4gx/MVVddddVV/xehBz3oQVx11VVXXXXVVVddddX/JWfOnHmQJL3Yi73Ya7/O67zOe73Yi73Ya/Nc7rvvvlv/4R/+4Xf+4R/+4bfvu+++W//hH/7ht7nqqv+HPvdzP/e3XuzFXuy1f+RHfuSzf/RHf/RzuOqqq6666v8a9KAHPYirrrrqqquuuuqqq676v+yaa655sG2/+Iu/+Ou82Iu92Gu9zuu8znvzXO67775b/+Ef/uG3/+Ef/uF37rvvvlv/4R/+4be56qr/B17sxV7stT/3cz/3t+67775bP+RDPuQhXHXVVVdd9X8NetCDHsRVV1111VVXXXXVVVf9f3PNNdc8+MVe7MVe68Ve7MVe+3Ve53Xem+dy33333foP//APv/0P//APv3Pffffd+g//8A+/zVVX/R/1OZ/zOb/14i/+4q/9W7/1W9/99V//9e/DVVddddVV/5egBz3oQVx11VVXXXXVVVddddX/d9dcc82DX+zFXuy1X+zFXuy1Xud1Xue9eS733Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXHXV/xFnzpx50Dd/8zffet999936WZ/1Wa9z33333cpVV1111VX/V6AHPehB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d/ysd3qnd/rsf/iHf/jtz/zMz3wdrrrqqquu+t8CPehBD+Kqq6666qqrrrrqqquuuuq5XXPNNQ9+sRd7sdd+sRd7sde65pprHvxiL/Zir80DnD179hn33Xff0++7775bf+u3fut7/uEf/uG3uer/rGuuuebB3/RN3/R0gM/8zM98nX/4h3/4ba666qqrrvrfAD3oQQ/iqquuuuqqq6666qqrrrrqX3LNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3DffffdKkl///d//1u/9Vu/9T3/8A//8Ntc9X/K67zO67z3h3/4h3/Xfffdd+uHfMiHPISrrrrqqqv+N0APetCDuOqqq6666qqrrrrqqquu+tc6c+bMg6655pqHvNiLvdhrvfiLv/hrv9iLvdhr81zuu+++W//hH/7hd/7hH/7ht3/rt37ru7nqf7UzZ8486HM/93N/+5prrnnw13/917/Pb/3Wb303V1111VVX/U+HHvSgB3HVVVddddVVV1111VVXXfXvdc011zz4zJkzD3qxF3ux137xF3/x136xF3ux1+a53Hfffbf+wz/8w2//wz/8w+/81m/91ndz1f86r/M6r/PeH/7hH/5d9913360f8iEf8hCuuuqqq676nw496EEP4qqrrrrqqquuuuqqq6666j/aNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+dy33333foP//APv/0P//APv/Nbv/Vb381V/yt87ud+7m+92Iu92Gt//dd//fv81m/91ndz1VVXXXXV/2ToQQ96EFddddVVV1111VVXXXXVVf/ZrrnmmgefOXPmwddcc82DX+d1Xue9XuzFXuy1eS733Xffrf/wD//w2//wD//wO/fdd9+t//AP//DbXPU/zou92Iu99ud+7uf+1n333Xfrh3zIhzyEq6666qqr/idDD3rQg7jqqquuuuqqq6666qqrrvqvds011zwY4MVe7MVe+3Ve53Xe68Ve7MVem+dy9uzZZ/z93//9b/3DP/zD79x33323/sM//MNvc9X/CJ/7uZ/7Wy/2Yi/22r/1W7/13V//9V//Plx11VVXXfU/FXrQgx7EVVddddVVV1111VVXXXXV/wTXXHPNg1/sxV7stV/sxV7stV7ndV7nvXku9913363/8A//8Dv/8A//8Nv33Xffrf/wD//w21z13+Kaa6558Dd90zc9/ezZs8/4zM/8zNe+7777buWqq6666qr/idCDHvQgrrrqqquuuuqqq6666qqr/ic6c+bMg178xV/8dV7sxV7stV7ndV7nvXku9913363/8A//8Nv/8A//8Dv33Xffrf/wD//w21z1X+bDP/zDv+t1Xud13vu3fuu3vvvrv/7r34errrrqqqv+J0IPetCDuOqqq6666qqrrrrqqquu+t/gmmuuefCLvdiLvdaLvdiLvfbrvM7rvDfP5b777rv1H/7hH377H/7hH37nvvvuu/Uf/uEffpur/tNcc801D/6mb/qmp9933323fv3Xf/37/MM//MNvc9VVV1111f806EEPehBXXXXVVVddddVVV1111VX/G11zzTUPfrEXe7HXfrEXe7HXuuaaax78Yi/2Yq/NA9x33323nj179ta///u//+1/+Id/+J1/+Id/+G2u+g/14R/+4d/1Oq/zOu/9D//wD7/9mZ/5ma/DVVddddVV/9OgBz3oQVx11VVXXXXVVVddddVVV/1fcM011zz4xV7sxV77xV7sxV7rmmuuefCLvdiLvTYPcPbs2Wfcd999T//7v//73/6Hf/iH3/mHf/iH3+aqf5czZ8486Ju/+ZtvBfjMz/zM1/mHf/iH3+aqq6666qr/SdCDHvQgrrrqqquuuuqqq6666qqr/i+65pprHvxiL/Zir/1iL/Zir3XNNdc8+MVe7MVemwe47777bj179uwz/v7v//63/uEf/uF3/uEf/uG3uepf7XVe53Xe+8M//MO/6x/+4R9++zM/8zNfh6uuuuqqq/4nQQ960IO46qqrrrrqqquuuuqqq676/+DMmTMPevEXf/HXebEXe7HXuuaaax78Yi/2Yq/NA9x33323AvzDP/zD7/zWb/3Wd//DP/zDb3PVv+iaa6558Od8zuf81jXXXPPgz/zMz3ydf/iHf/htrrrqqquu+p8CPehBD+Kqq6666qqrrrrqqquuuur/o2uuuebBL/ZiL/ZaL/ZiL/ba11xzzYNf7MVe7LV5gPvuu+9WgH/4h3/47X/4h3/4nd/6rd/6bq56vl7ndV7nvT/8wz/8u+67775bP+RDPuQhXHXVVVdd9T8FetCDHsRVV1111VVXXXXVVVddddVVcM011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+a53Hfffbf+wz/8w2//wz/8w+/81m/91ndz1WXXXHPNgz/8wz/8u17sxV7stb/+67/+fX7rt37ru7nqqquuuup/AvSgBz2Iq6666qqrrrrqqquuuuqqq57XNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVem+dy33333foP//APv/0P//APv/Nbv/Vb383/Yy/2Yi/22p/7uZ/7W2fPnn3GB3/wBz+Yq6666qqr/idAD3rQg7jqqquuuuqqq6666qqrrrrqX3bNNdc8+MyZMw9+sRd7sdd68Rd/8dd+sRd7sdfmuZw9e/YZf//3f/9b//AP//A79913363/8A//8Nv8P/K5n/u5v/ViL/Zir/1bv/Vb3/31X//178NVV1111VX/3dCDHvQgrrrqqquuuuqqq6666qqrrvrXO3PmzIMk6cVe7MVe+3Ve53Xe68Ve7MVem+dy33333foP//APv/MP//APv33ffffd+g//8A+/zf9hL/ZiL/ban/u5n/tb9913362f9Vmf9Tr33XffrVx11VVXXfXfCT3oQQ/iqquuuuqqq6666qqrrrrqqn+/a6655sG2/eIv/uKv82Iv9mKv9Tqv8zrvzXO57777bv2Hf/iH3/6Hf/iH37nvvvtu/Yd/+Iff5v+Yz/mcz/mtF3/xF3/t3/qt3/rur//6r38frrrqqquu+u+EHvSgB3HVVVddddVVV1111VVXXXXVf45rrrnmwS/2Yi/2Wi/2Yi/22q/zOq/z3jyX++6779Z/+Id/+O1/+Id/+J377rvv1n/4h3/4bf6XO3PmzIO++Zu/+db77rvv1q//+q9/n3/4h3/4ba666qqrrvrvgh70oAdx1VVXXXXVVVddddVVV1111X+Na6655sEv9mIv9tov9mIv9lqv8zqv8948l/vuu+/Wf/iHf/jtf/iHf/id++6779Z/+Id/+G3+F/rwD//w73qd13md9/6t3/qt7/76r//69+Gqq6666qr/LuhBD3oQV1111VVXXXXVVVddddVVV/33uOaaax78Yi/2Yq/9Yi/2Yq91zTXXPPjFXuzFXpsHOHv27DP+/u///rf+4R/+4Xfuu+++W//hH/7ht/lf4JprrnnwN33TNz0d4DM/8zNf5x/+4R9+m6uuuuqqq/47oAc96EFcddVVV1111VVXXXXVVVdd9T/DNddc8+AXe7EXe+0Xe7EXe61rrrnmwS/2Yi/22jzAfffdd+vZs2ef8fd///e/9Q//8A+/8w//8A+/zf9Q7/iO7/hZ7/RO7/TZ//AP//Dbn/mZn/k6XHXVVVdd9d8BPehBD+Kqq6666qqrrrrqqquuuuqq/5nOnDnzoBd/8Rd/nRd7sRd7rWuuuebBL/ZiL/baPMB9991369mzZ2/9h3/4h9/5+7//+9/+h3/4h9/mf4hrrrnmwd/0Td/0dIDP+qzPep2///u//22uuuqqq676r4Ye9KAHcdVVV1111VVXXXXVVVddddX/Dtdcc82DX+zFXuy1XuzFXuy1r7nmmge/2Iu92GvzAPfdd9+tZ8+evfXv//7vf/sf/uEffucf/uEffpv/Rq/zOq/z3h/+4R/+XWfPnn3GB3/wBz+Yq6666qqr/quhBz3oQVx11VVXXXXVVVddddVVV131v9M111zz4Bd7sRd77Rd7sRd7rWuuuebBL/ZiL/baPMB99913K8A//MM//PZv/dZvfc8//MM//Db/ha655poHf87nfM5vXXPNNQ/++q//+vf5rd/6re/mqquuuuqq/0roQQ96EFddddVVV1111VVXXXXVVVf933DNNdc8+MVe7MVe+8Ve7MVe65prrnnwi73Yi702D3D27Nln2PY//MM//PY//MM//M5v/dZvfTf/yV7ndV7nvT/8wz/8u+67775bP+RDPuQhXHXVVVdd9V8JPehBD+Kqq6666qqrrrrqqquuuuqq/5uuueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPJezZ88+4+///u9/6x/+4R9+57d+67e+mxfgmmuuefB99913K/9K11xzzYM/7MM+7Lte/MVf/LW//uu//n1+67d+67u56qqrrrrqvwp60IMexFVXXXXVVVddddVVV1111VX/P5w5c+ZB11xzzUNe7MVe7LVe/MVf/LVf7MVe7LV5Lvfdd9+t//AP//A7//AP//Dbv/Vbv/XdPNM3fdM3PR3gt37rt777t3/7t7/nvvvuu5UX0Yu92Iu91ud+7uf+9n333Xfrh3zIhzyEq6666qqr/qugBz3oQVx11VVXXXXVVVddddVVV131/9M111zz4DNnzjzoxV7sxV77xV/8xV/7xV7sxV6b53Lffffdevbs2Vtf7MVe7LV5pvvuu+/Ws2fP3vpbv/Vb3/Nbv/Vb382L4HM/93N/68Ve7MVe+7d+67e+++u//uvfh6uuuuqqq/4roAc96EFcddVVV1111VVXXXXVVVdddRXANddc82CAF3uxF3ut13md13nvF3uxF3tt/gX33Xffrf/wD//w27/1W7/1Pf/wD//w27wA11xzzYO/6Zu+6en33XffrZ/1WZ/1Ovfdd9+tXHXVVVdd9Z8NPehBD+Kqq6666qqrrrrqqquuuuqqq56fa6655sEA3/RN3/R0XgT33Xffrb/927/9PT/yIz/y2Twfn/u5n/tbL/ZiL/bav/Vbv/XdX//1X/8+XHXVVVdd9Z+Ncvz4ca666qqrrrrqqquuuuqqq6666vk5PDzcfcVXfMW3fsVXfMW35kWwubl5/MVe7MVe+3Ve53Xe+yEPechLHx4eXjp79uytPNM//MM//M6bv/mbf/Tm5ubxZzzjGX9z33333cpVV1111VX/mdCDHvQgrrrqqquuuuqqq6666qqrrrrqX3LmzJkHXXPNNQ+55pprHgzwYi/2Yq91zTXXPBjgxV7sxV6bF+C+++679R/+4R9+5x/+4R9++7777rv1rd7qrd745V7u5T6JB3i7t3s7cdVVV1111X8G9KAHPYirrrrqqquuuuqqq6666qqrrvr3uuaaax4McObMmQddc801D3mxF3ux17rmmmse/GIv9mKvzb/gcz7nc27427/927u56qqrrrrqPxp60IMexFVXXXXVVVddddVVV1111VVX/We55pprHvxiL/Zir/ViL/Zir33NNdc8+MVe7MVem+fyD//wD7/9mZ/5ma/DVVddddVV/9GoXHXVVVddddVVV1111VVXXXXVf6L77rvv1vvuu+/W3/qt3/oegJ/4iZ8wz+Wee+75Pa666qqrrvrPQHDVVVddddVVV1111VVXXXXVVf+FbCfP5Ru/8Rs/k6uuuuqqq/4zoAc96EFcddVVV1111VVXXXXVVVddddV/tQ/7sA/7zr/6q7/66j/8wz/8W6666qqrrvrPgh70oAdx1VVXXXXVVVddddVVV1111VVXXXXVVVf9n0Tlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxX/CO5tbZ4Z83tJAAAAAElFTkSuQmCC) diff --git a/docs/kcl-std/profileStartY.md b/docs/kcl-std/functions/std-sketch-profileStartY.md similarity index 99% rename from docs/kcl-std/profileStartY.md rename to docs/kcl-std/functions/std-sketch-profileStartY.md index fd2575325..db3ab6836 100644 --- a/docs/kcl-std/profileStartY.md +++ b/docs/kcl-std/functions/std-sketch-profileStartY.md @@ -8,7 +8,7 @@ layout: manual Extract the provided 2-dimensional sketch's profile's origin's 'y' value. ```kcl -profileStartY(@profile: Sketch): number +profileStartY(@profile: Sketch): number(Length) ``` @@ -17,20 +17,20 @@ profileStartY(@profile: Sketch): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| `profile` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Profile whose start is being used | Yes | +| `profile` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Profile whose start is being used. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples ```kcl sketch001 = startSketchOn(XY) - |> startProfile(at = [5, 2]) - |> angledLine(angle = -60, length = 14) - |> angledLine(angle = 30, endAbsoluteY = profileStartY(%)) + |> startProfile(at = [5, 2]) + |> angledLine(angle = -60, length = 14 ) + |> angledLine(angle = 30, endAbsoluteY = profileStartY(%)) ``` ![Rendered example of profileStartY 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAABwwUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquu+j/hmmuuefCLvdiLvTbP5b777rv1H/7hH36bq6666qqrrrrqqufjmmuuefCLvdiLvTbP5b777rv1H/7hH36bq6666qqr/rejctVVV1111f8Jr/3ar/1e7/RO7/TZPJcf+ZEf+ex/+Id/+G2uuuqqq6666qqrno/Xfu3Xfq93eqd3+myey4/8yI989j/8wz/8NlddddVVV/1vR+Wqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVV/+9cc801D36xF3ux137xF3/x1+aqq6666qr/y6hcddVVV1111VVXXXXVVVdd9X/eNddc8+AXe7EXe+0zZ8486HVe53Xe+5prrnkwV1111VVX/X9A5aqrrrrqqquuuuqqq6666qr/c6655poHnzlz5sEv9mIv9lov/uIv/tov9mIv9to8wH333Xfr2bNnbwV4sRd7sdfmqquuuuqq/6uoXHXVVVdd9X/C2bNnn/Fbv/Vb380DvM7rvM57v87rvM57/8M//MPv/MM//MNvc9VVV1111VVX/Z91zTXXPPjMmTMPfrEXe7HXevEXf/HXfrEXe7HX5rncd999t/7Wb/3Wd//DP/zD7/zDP/zDbwO8zuu8znvfd999t/Jc/uEf/uF3uOqqq6666v8C9KAHPYirrrrqqqv+b3rHd3zHz3qnd3qnz77vvvtu/azP+qzXue+++27lqquuuuqqq676P+Gaa6558JkzZx78Yi/2Yq/14i/+4q/9Yi/2Yq/Nc7nvvvtu/a3f+q3v/od/+Iff+Yd/+Iff5qqrrrrqqv+P0IMe9CCuuuqqq676v+maa6558Id/+Id/14u92Iu99j/8wz/89md+5me+DlddddVVV1111f9a11xzzYNf+7Vf+71e/MVf/HVe7MVe7LV4Lvfdd9+tv/Vbv/Xd//AP//A7//AP//DbXHXVVVdddRWgBz3oQVx11VVXXfV/1zXXXPPgz/mcz/mta6655sG/9Vu/9d1f//Vf/z5cddVVV1111VX/K1xzzTUPfu3Xfu33evEXf/HXfrEXe7HX5rncd999t/7Wb/3Wd//DP/zD7/zDP/zDb3PVVVddddVVzws96EEP4qqrrrrqqv/brrnmmgd/0zd909MBfuRHfuSzf/RHf/RzuOqqq6666qqr/se55pprHvzar/3a7/XiL/7ir/1iL/Zir81zue+++279rd/6re/+h3/4h9/+h3/4h9/hqquuuuqqq/5l6EEPehBXXXXVVVf93/c6r/M67/3hH/7h33Xffffd+vVf//Xv8w//8A+/zVVXXXXVVVdd9d/qmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrvrXQw960IO46qqrrrrq/4d3fMd3/Kx3eqd3+uz77rvv1s/6rM96nfvuu+9Wrrrqqquuuuqq/zLXXHPNg1/7tV/7vV78xV/8tV/sxV7stXku9913362/9Vu/9d0AP/qjP/o5XHXVVVddddW/H3rQgx7EVVddddVV/z9cc801D/7wD//w73qxF3ux177vvvtu/ZAP+ZCHcNVVV1111VVX/ae55pprHvzar/3a7/XiL/7ir/NiL/Zir8Vzue+++279rd/6re8G+NEf/dHP4aqrrrrqqqv+46EHPehBXHXVVVdd9f/HNddc8+DP+ZzP+a1rrrnmwb/1W7/13V//9V//Plx11VVXXXXVVf8hrrnmmge/9mu/9nsBvNM7vdNn81zuu+++W3/rt37ruwF+9Ed/9HO46qqrrrrqqv986EEPehBXXXXVVVf9/3LNNdc8+Ju+6ZueDvAjP/Ijn/2jP/qjn8NVV1111VVXXfWvds011zz4tV/7td8L4J3e6Z0+m+dy33333fpbv/Vb3w3woz/6o5/DVVddddVVV/3XQw960IO46qqrrrrq/5/XeZ3Xee8P//AP/6777rvv1q//+q9/n3/4h3/4ba666qqrrrrqqhfqmmuuefBrv/ZrvxfAO73TO302z+W+++679R/+4R9++7777rv1t3/7t7/nvvvuu5Wrrrrqqquu+u+FHvSgB3HVVVddddX/T+/4ju/4We/0Tu/02ffdd9+tn/VZn/U69913361cddVVV1111VXPcs011zz4xV7sxV77zJkzD3qnd3qnz+a53HfffbeePXv21r//+7//7d/+7d/+nvvuu+9Wrrrqqquuuup/FvSgBz2Iq6666qqr/v/68A//8O96ndd5nfe+7777bv2QD/mQh3DVVVddddVV/49dc801D36xF3ux1z5z5syDXud1Xue9r7nmmgfzAPfdd9+tZ8+evfXv//7vf/sf/uEffucf/uEffpurrrrqqquu+p8NPehBD+Kqq6666qr/v6655poHf/iHf/h3vdiLvdhr/9Zv/dZ3f/3Xf/37cNVVV1111VX/T1xzzTUPPnPmzINf7MVe7LVe/MVf/LVf7MVe7LV5gPvuu+/Ws2fP3vr3f//3v/0P//APv/0P//APv8NVV1111VVX/e+CHvSgB3HVVVddddX/b9dcc82DP+dzPue3rrnmmgf/yI/8yGf/6I/+6Odw1VVXXXXVVf8HXXPNNQ8+c+bMg1/sxV7stV78xV/8tV/sxV7stXmA++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVf974Ye9KAHcdVVV1111VUv9mIv9tqf+7mf+1sAX//1X/8+v/Vbv/XdXHXVVVddddX/ctdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ey3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXfV/C3rQgx7EVVddddVVVwG84zu+42e90zu902ffd999t37913/9+/zDP/zDb3PVVVddddVV/8tcc801D37t137t93rxF3/x13mxF3ux1+K53Hfffbf+1m/91nf/wz/8w+/8wz/8w29z1VVXXXXVVf+3oQc96EFcddVVV1111f3e8R3f8bPe6Z3e6bPvu+++Wz/rsz7rde67775bueqqq6666qr/wa655poHv/Zrv/Z7vfiLv/hrv9iLvdhr81zuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqq/1/Qgx70IK666qqrrrrqftdcc82DP/zDP/y7XuzFXuy177vvvls/5EM+5CFcddVVV1111f8g11xzzYNf+7Vf+71e/MVf/LVf7MVe7LV5Lvfdd9+tv/Vbv/Xd//AP//Db//AP//A7XHXVVVddddX/b+hBD3oQV1111VVXXfVA11xzzYM/53M+57euueaaB//Wb/3Wd3/913/9+3DVVVddddVV/02uueaaB7/2a7/2e734i7/4a7/Yi73Ya/Nc7rvvvlt/67d+67v/4R/+4Xf+4R/+4be56qqrrrrqqqseCD3oQQ/iqquuuuqqq57bNddc8+Bv+qZvejrAj/zIj3z2j/7oj34OV1111VVXXfVf4Jprrnnwa7/2a7/Xi7/4i7/2i73Yi702z+W+++679bd+67e+++zZs8/4rd/6re/mqquuuuqqq656YdCDHvQgrrrqqquuuur5eZ3XeZ33/vAP//Dvuu+++279+q//+vf5h3/4h9/mqquuuuqqq/6DXXPNNQ9+7dd+7fd68Rd/8dd5sRd7sdfiudx33323/tZv/dZ3A/zoj/7o53DVVVddddVVV/1roAc96EFcddVVV1111Qvyju/4jp/1Tu/0Tp9933333fpZn/VZr3PffffdylVXXXXVVVf9O1xzzTUPfu3Xfu33Anind3qnz+a53Hfffbf+1m/91ncD/OiP/ujncNVVV1111VVX/XugBz3oQVx11VVXXXXVC3LNNdc8+MM//MO/68Ve7MVe+7777rv1Qz7kQx7CVVddddVVV/0rXHPNNQ9+7dd+7fcCeKd3eqfP5rncd999t/7Wb/3WdwP86I/+6Odw1VVXXXXVVVf9R0IPetCDuOqqq6666qoX5pprrnnw53zO5/zWNddc8+Df+q3f+u6v//qvfx+uuuqqq6666gW45pprHvzar/3a7wXwTu/0Tp/Nc7nvvvtu/Yd/+Iffvu+++2797d/+7e+57777buWqq6666qqrrvrPgh70oAdx1VVXXXXVVf+Sa6655sHf9E3f9HSAH/mRH/nsH/3RH/0crrrqqquuugq45pprHvzar/3a7wXwTu/0Tp/Nc7nvvvtu/Yd/+Iffvu+++2797d/+7e+57777buWqq6666qqrrvqvgh70oAdx1VVXXXXVVS+K13md13nvD//wD/+u++6779av//qvf59/+Id/+G2uuuqqq676f+eaa6558Iu92Iu99pkzZx70Oq/zOu99zTXXPJgHuO+++249e/bsrX//93//2//wD//wO//wD//w21x11VVXXXXVVf9d0IMe9CCuuuqqq6666kX1ju/4jp/1Tu/0Tp9933333fpZn/VZr3PffffdylVXXXXVVf+nXXPNNQ8+c+bMg1/sxV7stV7ndV7nva+55poH8wD33XffrWfPnr317//+73/7H/7hH377H/7hH36Hq6666qqrrrrqfwr0oAc9iKuuuuqqq6761/jwD//w73qd13md977vvvtu/ZAP+ZCHcNVVV1111f8p11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bR7gvvvuu/Xs2bO3/v3f//1v/8M//MPv/MM//MNvc9VVV1111VVX/U+FHvSgB3HVVVddddVV/xrXXHPNgz/8wz/8u17sxV7stf/hH/7htz/zMz/zdbjqqquuuup/rWuuuebBZ86cefCLvdiLvdaLv/iLv/aLvdiLvTbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrrrqfwv0oAc9iKuuuuqqq67617rmmmse/Dmf8zm/dc011zz4R37kRz77R3/0Rz+Hq6666qqr/le45pprHnzmzJkHv9iLvdhrvfiLv/jrvNiLvdhr8Vzuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqqq/63Qg960IO46qqrrrrqqn+La6655sHf9E3f9HSAH/mRH/nsH/3RH/0crrrqqquu+h/pmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrrrq/wr0oAc9iKuuuuqqq676t3qd13md9/7wD//w77rvvvtu/fqv//r3+Yd/+Iff5qqrrrrqqv9211xzzYNf+7Vf+71e/MVf/LVf7MVe7LV5Lvfdd9+tv/Vbv/Xd//AP//Db//AP//A7XHXVVVddddVV/1ehBz3oQVx11VVXXXXVv8c7vuM7ftY7vdM7ffZ9991362d91me9zn333XcrV1111VVX/Ze65pprHvzar/3a7/XiL/7ir/1iL/Zir81zue+++279rd/6re/+h3/4h9/5h3/4h9/mqquuuuqqq676/wI96EEP4qqrrrrqqqv+Pa655poHf/iHf/h3vdiLvdhr33fffbd+yId8yEO46qqrrrrqP9U111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ7Lfffdd+tv/dZvffc//MM//M4//MM//DZXXXXVVVddddX/V+hBD3oQV1111VVXXfXvdc011zz4cz7nc37rmmuuefBv/dZvfffXf/3Xvw9XXXXVVVf9h7nmmmse/Nqv/drv9eIv/uKv82Iv9mKvxXO57777bv2t3/qt7wb40R/90c/hqquuuuqqq6666gr0oAc9iKuuuuqqq676j3DNNdc8+Ju+6ZueDvAjP/Ijn/2jP/qjn8NVV1111VX/Jtdcc82DX/u1X/u9rrnmmge/zuu8znvzXO67775bf+u3fuu7AX70R3/0c7jqqquuuuqqq656/tCDHvQgrrrqqquuuuo/yuu8zuu894d/+Id/13333Xfr13/917/PP/zDP/w2V1111VVX/YuuueaaB7/2a7/2ewG80zu902fzXO67775bf+u3fuu7AX70R3/0c7jqqquuuuqqq6560aAHPehBXHXVVVddddV/pHd8x3f8rHd6p3f67Pvuu+/Wz/qsz3qd++6771auuuqqq656Dtdcc82DX/u1X/u9AN7pnd7ps3ku9913363/8A//8Nv33XffrT/6oz/6OVx11VVXXXXVVVf926AHPehBXHXVVVddddV/pGuuuebBH/7hH/5dL/ZiL/ba9913360f8iEf8hCuuuqqq/6fu+aaax782q/92u8F8E7v9E6fzXO57777bv2Hf/iH377vvvtu/e3f/u3vue+++27lqquuuuqqq6666t8PPehBD+Kqq6666qqr/qNdc801D/6cz/mc37rmmmse/Fu/9Vvf/fVf//Xvw1VXXXXV/yPXXHPNg1/sxV7stc+cOfOg13md13nva6655sE8wH333Xfr2bNnb/37v//73/7t3/7t77nvvvtu5aqrrrrqqquuuuo/HnrQgx7EVVddddVVV/1nuOaaax78Td/0TU8H+JEf+ZHP/tEf/dHP4aqrrrrq/6hrrrnmwS/2Yi/22mfOnHnQ67zO67z3Nddc82Ae4L777rv17Nmzt/793//9b//DP/zDb//DP/zD73DVVVddddVVV131nw896EEP4qqrrrrqqqv+s7zO67zOe3/4h3/4d9133323/uiP/ujn/NZv/dZ3c9VVV131f8A111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6bB7jvvvtuPXv27K1///d//9v/8A//8Dv/8A//8NtcddVVV1111VVX/dejctVVV1111VX/iX7rt37ru8+cOfOgd3qnd/rsd3zHd/ysf/iHf/jt++6771auuuqqq/6Xueaaax585syZB7/Yi73Ya734i7/4a7/Yi73Ya/Nc7rvvvlt/67d+67v/4R/+4Xf+4R/+4be56qqrrrrqqquu+u+HHvSgB3HVVVddddVV/9ne8R3f8bPe6Z3e6bPvu+++Wz/kQz7kIVx11VVX/Q93zTXXPPjMmTMPfrEXe7HXevEXf/HXebEXe7HX4rncd999t/7Wb/3Wd//DP/zD7/zDP/zDb3PVVVddddVVV131Pw960IMexFVXXXXVVVf9Z7vmmmse/OEf/uHf9WIv9mKv/Q//8A+//Zmf+Zmvw1VXXXXV/zDXXHPNg1/7tV/7vV78xV/8tV/sxV7stXku9913362/9Vu/9d3/8A//8Dv/8A//8NtcddVVV1111VVX/c+HHvSgB3HVVVddddVV/xWuueaaB3/O53zOb11zzTUP/pEf+ZHP/tEf/dHP4aqrrrrqv9E111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ7Lfffdd+tv/dZvffc//MM//PY//MM//A5XXXXVVVddddVV//ugBz3oQVx11VVXXXXVf5Vrrrnmwd/0Td/0dIAf+ZEf+ewf/dEf/Ryuuuqqq/6LXHPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmudx33323/tZv/dZ3/8M//MPv/MM//MNvc9VVV1111VVXXfW/H3rQgx7EVVddddVVV/1Xep3XeZ33/vAP//Dvuu+++279+q//+vf5h3/4h9/mqquuuuo/wTXXXPPg137t136vF3/xF3/tF3uxF3ttnst9991362/91m999z/8wz/8zj/8wz/8NlddddVVV1111VX/96AHPehBXHXVVVddddV/tXd8x3f8rHd6p3f67Pvuu+/Wz/qsz3qd++6771auuuqqq/6drrnmmge/9mu/9nu9+Iu/+Ou82Iu92GvxXO67775bf+u3fuu7AX70R3/0c7jqqquuuuqqq676vw896EEP4qqrrrrqqqv+q11zzTUP/vAP//DverEXe7HXvu+++279kA/5kIdw1VVXXfWvdM011zz4tV/7td/rxV/8xV/7xV7sxV6b53Lffffd+lu/9VvfDfCjP/qjn8NVV1111VVXXXXV/z/oQQ96EFddddVVV1313+Gaa6558Od8zuf81jXXXPPg3/qt3/rur//6r38frrrqqqteiGuuuebBr/3ar/1eAO/0Tu/02TyX++6779bf+q3f+m6AH/3RH/0crrrqqquuuuqqq65CD3rQg7jqqquuuuqq/y7XXHPNg7/pm77p6QA/8iM/8tk/+qM/+jlcddVVVz3TNddc8+DXfu3Xfi+Ad3qnd/psnst9991362/91m99N8CP/uiPfg5XXXXVVVddddVVVz039KAHPYirrrrqqquu+u/0Oq/zOu/94R/+4d9133333fr1X//17/MP//APv81VV131/9I111zz4Nd+7dd+L4B3eqd3+myey3333XfrP/zDP/z2fffdd+tv//Zvf8999913K1ddddVVV1111VVXvTDoQQ96EFddddVVV1313+0d3/EdP+ud3umdPvu+++679bM+67Ne57777ruVq6666v+8a6655sEv9mIv9tpnzpx50Du90zt9Ns/lvvvuu/Xs2bO3/v3f//1v//Zv//b33Hfffbdy1VVXXXXVVVddddW/BnrQgx7EVVddddVVV/13u+aaax78ju/4jp/1Oq/zOu9933333fohH/IhD+Gqq676P+eaa6558Iu92Iu99pkzZx70Oq/zOu99zTXXPJgHuO+++249e/bsrX//93//2//wD//w2//wD//wO1x11VVXXXXVVVdd9e+BHvSgB3HVVVddddVV/xNcc801D/6cz/mc37rmmmse/Fu/9Vvf/fVf//Xvw1VXXfW/2jXXXPPgM2fOPPjFXuzFXut1Xud13vuaa655MA9w33333Xr27Nlb//7v//63/+Ef/uF3/uEf/uG3ueqqq6666qqrrrrqPxJ60IMexFVXXXXVVVf9T3HNNdc8+Ju+6ZueDvAjP/Ijn/2jP/qjn8NVV131v8Y111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6bB7jvvvtuPXv27K1///d//9v/8A//8Dv/8A//8NtcddVVV1111VVXXfWfCT3oQQ/iqquuuuqqq/4nebEXe7HX/tzP/dzfAvj6r//69/mt3/qt7+aqq676H+maa6558JkzZx78Yi/2Yq/14i/+4q/zYi/2Yq/Fc7nvvvtu/a3f+q3v/od/+Iff+Yd/+Iff5qqrrrrqqquuuuqq/0roQQ96EFddddVVV131P807vuM7ftY7vdM7ffZ9991369d//de/zz/8wz/8NlddddX/CNdcc82DX/u1X/u9XvzFX/y1X+zFXuy1eS733Xffrb/1W7/13f/wD//wO//wD//w21x11VVXXXXVVVdd9d8JPehBD+Kqq6666qqr/id6x3d8x896p3d6p8++7777bv2sz/qs17nvvvtu5aqrrvovd8011zz4tV/7td/rxV/8xV/7xV7sxV6b53Lffffd+lu/9Vvf/Q//8A+//Q//8A+/w1VXXXXVVVddddVV/5OgBz3oQVx11VVXXXXV/0TXXHPNgz/8wz/8u17sxV7stf/hH/7htz/zMz/zdbjqqqv+011zzTUPfu3Xfu33evEXf/HXfrEXe7HX5rncd999t/7Wb/3Wd//DP/zD7/zDP/zDb3PVVVddddVVV1111f9k6EEPehBXXXXVVVdd9T/VNddc8+DP+ZzP+a1rrrnmwT/yIz/y2T/6oz/6OVx11VX/oa655poHv/Zrv/Z7vfiLv/hrv9iLvdhr81zuu+++W3/rt37ru//hH/7hd/7hH/7ht7nqqquuuuqqq6666n8T9KAHPYirrrrqqquu+p/smmuuefA3fdM3PR3gR37kRz77R3/0Rz+Hq6666t/smmuuefBrv/Zrv9eLv/iLv86LvdiLvRbP5b777rv1t37rt777H/7hH37nH/7hH36bq6666qqrrrrqqqv+N0MPetCDuOqqq6666qr/6V7ndV7nvT/8wz/8u+67775bv/7rv/59/uEf/uG3ueqqq14k11xzzYNf+7Vf+71e/MVf/LVf7MVe7LV5Lvfdd9+tv/Vbv/XdAD/6oz/6OVx11VVXXXXVVVdd9X8JetCDHsRVV1111VVX/W/wju/4jp/1Tu/0Tp9933333fpZn/VZr3PffffdylVXXfU8rrnmmge/9mu/9nsBvNM7vdNn81zuu+++W3/rt37ruwF+9Ed/9HO46qqrrrrqqquuuur/MvSgBz2Iq6666qqrrvrf4Jprrnnwh3/4h3/Xi73Yi732fffdd+uHfMiHPISrrrqKa6655sGv/dqv/V4A7/RO7/TZPJf77rvv1t/6rd/6boAf/dEf/Ryuuuqqq6666qqrrvr/BD3oQQ/iqquuuuqqq/63uOaaax78OZ/zOb91zTXXPPi3fuu3vvvrv/7r34errvp/5pprrnnwa7/2a78XwDu90zt9Ns/lvvvuu/Uf/uEffvu+++679bd/+7e/57777ruVq6666qqrrrrqqqv+v0IPetCDuOqqq6666qr/Ta655poHf9M3fdPTAX7kR37ks3/0R3/0c7jqqv/Drrnmmge/9mu/9nsBvNM7vdNn81zuu+++W//hH/7ht++7775bf/u3f/t77rvvvlu56qqrrrrqqquuuuqqK9CDHvQgrrrqqquuuup/m9d5ndd57w//8A//rvvuu+/Wr//6r3+ff/iHf/htrrrq/4hrrrnmwS/2Yi/22mfOnHnQ67zO67z3Nddc82Ae4L777rv17Nmzt/793//9b//DP/zDb//DP/zD73DVVVddddVVV1111VXPH3rQgx7EVVddddVVV/1v9I7v+I6f9U7v9E6ffd999936WZ/1Wa9z33333cpVV/0vdM011zz4zJkzD36xF3ux13qd13md977mmmsezAPcd999t549e/bWv//7v//tf/iHf/idf/iHf/htrrrqqquuuuqqq6666kWDHvSgB3HVVVddddVV/1t9+Id/+He9zuu8znvfd999t37Ih3zIQ7jqqv8FrrnmmgefOXPmwS/2Yi/2Wi/+4i/+2i/2Yi/22jzAfffdd+vZs2dv/fu///vf/od/+Iff+Yd/+Iff5qqrrrrqqquuuuqqq/5t0IMe9CCuuuqqq6666n+ra6655sEf/uEf/l0v9mIv9tq/9Vu/9d1f//Vf/z5cddX/MNdcc82Dz5w58+AXe7EXe60Xf/EXf50Xe7EXey2ey3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXXXVVVdd9R8DPehBD+Kqq6666qqr/je75pprHvxN3/RNTwf4kR/5kc/+0R/90c/hqqv+G11zzTUPPnPmzINf7MVe7LVe/MVf/LVf7MVe7LV5Lvfdd9+tv/Vbv/Xd//AP//A7//AP//DbXHXVVVddddVVV1111X8O9KAHPYirrrrqqquu+t/uxV7sxV77cz/3c38L4Ou//uvf57d+67e+m6uu+i90zTXXPPi1X/u13+vFX/zFX/vFXuzFXpvnct999936W7/1W9/9D//wD7/9D//wD7/DVVddddVVV1111VVX/ddAD3rQg7jqqquuuuqq/wve8R3f8bPe6Z3e6bPvu+++W7/+67/+ff7hH/7ht7nqqv8k11xzzYNf+7Vf+71e/MVf/LVf7MVe7LV5Lvfdd9+tv/Vbv/Xd//AP//A7//AP//DbXHXVVVddddVVV1111X8P9KAHPYirrrrqqquu+r/iHd/xHT/rnd7pnT77vvvuu/WzPuuzXue+++67lauu+g9wzTXXPPi1X/u13+vFX/zFX/vFXuzFXpvnct999936W7/1W9/9D//wD7/zD//wD7/NVVddddVVV1111VVX/c+AHvSgB3HVVVddddVV/1dcc801D/7wD//w73qxF3ux177vvvtu/ZAP+ZCHcNVV/wbXXHPNg1/7tV/7vV78xV/8dV7sxV7stXgu9913362/9Vu/9d3/8A//8Dv/8A//8NtcddVVV1111VVXXXXV/0zoQQ96EFddddVVV131f8k111zz4M/5nM/5rWuuuebBv/Vbv/XdX//1X/8+XHXVv+Caa6558Gu/9mu/14u/+Iu/9ou92Iu9Ns/lvvvuu/W3fuu3vhvgR3/0Rz+Hq6666qqrrrrqqquu+t8BPehBD+Kqq6666qqr/q+55pprHvxN3/RNTwf4kR/5kc/+0R/90c/hqqse4Jprrnnwa7/2a7/XNddc8+DXeZ3XeW+ey3333Xfrb/3Wb303wI/+6I9+DlddddVVV1111VVXXfW/E3rQgx7EVVddddVVV/1f9Dqv8zrv/eEf/uHfdd9999369V//9e/zD//wD7/NVf9vXXPNNQ9+7dd+7fcCeKd3eqfP5rncd999t/7Wb/3WdwP86I/+6Odw1VVXXXXVVVddddVV/zegBz3oQVx11VVXXXXV/1Xv+I7v+Fnv9E7v9Nn33XffrZ/1WZ/1Ovfdd9+tXPX/wjXXXPPg137t134vgHd6p3f6bJ7Lfffdd+s//MM//PZ9991364/+6I9+DlddddVVV1111VVXXfV/E3rQgx7EVVddddVVV/1fdc011zz4wz/8w7/rxV7sxV77vvvuu/VDPuRDHsJV/yddc801D37t137t9wJ4p3d6p8/mudx33323/sM//MNv33fffbf+9m//9vfcd999t3LVVVddddVVV1111VX/96EHPehBXHXVVVddddX/Zddcc82DP+dzPue3rrnmmgf/1m/91nd//dd//ftw1f9611xzzYNf7MVe7LXPnDnzoNd5ndd572uuuebBPMB9991369mzZ2/9+7//+9/+7d/+7e+57777buWqq6666qqrrrrqqqv+/0EPetCDuOqqq6666qr/66655poHf9M3fdPTAX7kR37ks3/0R3/0c7jqf5VrrrnmwS/2Yi/22mfOnHnQ67zO67z3Nddc82Ae4L777rv17Nmzt/793//9b//DP/zD7/zDP/zDb3PVVVddddVVV1111VVXoQc96EFcddVVV1111f8Hr/M6r/PeH/7hH/5d9913361f//Vf/z7/8A//8Ntc9T/WNddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVemwe47777bj179uytf//3f//b//AP//A7//AP//DbXHXVVVddddVVV1111VXPDT3oQQ/iqquuuuqqq/6/eMd3fMfPeqd3eqfPvu+++279rM/6rNe57777buWq/xGuueaaB585c+bBL/ZiL/ZaL/7iL/7aL/ZiL/baPJf77rvv1t/6rd/67n/4h3/4nX/4h3/4ba666qqrrrrqqquuuuqqfwl60IMexFVXXXXVVVf9f/LhH/7h3/U6r/M6733ffffd+iEf8iEP4ar/Ftdcc82Dz5w58+AXe7EXe60Xf/EXf+0Xe7EXe22ey3333Xfrb/3Wb333P/zDP/zOP/zDP/w2V1111VVXXXXVVVddddW/FnrQgx7EVVddddVVV/1/cs011zz4wz/8w7/rxV7sxV77t37rt77767/+69+Hq/5LXHPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmudx33323/tZv/dZ3/8M//MPv/MM//MNvc9VVV1111VVXXXXVVVf9e6EHPehBXHXVVVddddX/N9dcc82DP+dzPue3rrnmmgf/yI/8yGf/6I/+6Odw1X+4a6655sGv/dqv/V4v/uIv/tov9mIv9to8l/vuu+/W3/qt3/ruf/iHf/idf/iHf/htrrrqqquuuuqqq6666qr/aOhBD3oQV1111VVXXfX/0Yu92Iu99ud+7uf+FsCP/MiPfPaP/uiPfg5X/btcc801D37t137t93rxF3/x136xF3ux1+a53Hfffbf+1m/91nf/wz/8w+/8wz/8w29z1VVXXXXVVVddddVVV/1nQw960IO46qqrrrrqqv+vXud1Xue9P/zDP/y77rvvvlu//uu//n3+4R/+4be56kV2zTXXPPi1X/u13+vFX/zFX/vFXuzFXpvnct999936W7/1W9/9D//wD7/zD//wD7/NVVddddVVV1111VVXXfVfDT3oQQ/iqquuuuqqq/4/e8d3fMfPeqd3eqfPvu+++279rM/6rNe57777buWq5+uaa6558Gu/9mu/14u/+Iu/9ou92Iu9Ns/lvvvuu/W3fuu3vhvgR3/0Rz+Hq6666qqrrrrqqquuuuq/G3rQgx7EVVddddVVV/1/ds011zz4wz/8w7/rxV7sxV77vvvuu/VDPuRDHsJVl11zzTUPfu3Xfu33evEXf/HXfrEXe7HX5rncd999t/7Wb/3WdwP86I/+6Odw1VVXXXXVVVddddVVV/1Pgx70oAdx1VVXXXXVVf/fXXPNNQ/+nM/5nN+65pprHvxbv/Vb3/31X//178P/Q9dcc82DX/u1X/u9AN7pnd7ps3ku9913362/9Vu/9d0AP/qjP/o5XHXVVVddddVVV1111VX/06EHPehBXHXVVVddddVVcM011zz4m77pm54O8CM/8iOf/aM/+qOfw/9x11xzzYNf+7Vf+70A3umd3umzeS733Xffrb/1W7/13QA/+qM/+jlcddVVV1111VVXXXXVVf/boAc96EFcddVVV1111VVXvM7rvM57f/iHf/h33Xfffbd+/dd//fv8wz/8w2/zf8g111zz4Nd+7dd+L4B3eqd3+myey3333XfrP/zDP/z2fffdd+tv//Zvf8999913K1ddddVVV1111VVXXXXV/2boQQ96EFddddVVV1111bO94zu+42e90zu902ffd999t37WZ33W69x333238r/UNddc8+AXe7EXe+0zZ8486J3e6Z0+m+dy33333Xr27Nlb//7v//63f/u3f/t77rvvvlu56qqrrrrqqquuuuqqq/4vQQ960IO46qqrrrrqqque7Zprrnnwh3/4h3/Xi73Yi732fffdd+uHfMiHPIT/Ja655poHv9iLvdhrnzlz5kGv8zqv897XXHPNg3mA++6779azZ8/e+vd///e//Q//8A+/8w//8A+/zVVXXXXVVVddddVVV131fxl60IMexFVXXXXVVVdd9ZyuueaaB3/O53zOb11zzTUP/q3f+q3v/tEf/dHPOXPmzINf7MVe7LVe/MVf/LV/5Ed+5HP+4R/+4bf5b3bNNdc8+MyZMw9+sRd7sdd6ndd5nfe+5pprHswD3HfffbeePXv21r//+7//7X/4h3/4nX/4h3/4ba666qqrrrrqqquuuuqq/0/Qgx70IK666qqrrrrqqud0zTXXPPi1X/u13+ud3umdPpvn40d+5Ec++0d/9Ec/h/9i11xzzYPPnDnz4Bd7sRd7rRd/8Rd/7Rd7sRd7bR7gvvvuu/Xs2bO3/v3f//1v/8M//MPv/MM//MNvc9VVV1111VVXXXXVVVf9f0blqquuuuqqq656lmuuuebBn/M5n/Nb11xzzYN5IV78xV/8tX/0R3/0c/hPds011zz4zJkzD36xF3ux13rxF3/x136xF3ux1+a53Hfffbf+1m/91nf/wz/8w+/8wz/8w29z1VVXXXXVVVddddVVV131bFSuuuqqq6666qpnue+++2790R/90c95x3d8x8+65pprHswLcObMmQfzn+Saa6558Gu/9mu/14u/+Iu/9ou92Iu9Ns/lvvvuu/W3fuu3vvsf/uEffucf/uEffpurrrrqqquuuuqqq6666qoXDD3oQQ/iqquuuuqqq656Ttdcc82DX/u1X/u93umd3umzeQHe7u3eTvwHuOaaax782q/92u/14i/+4q/9Yi/2Yq/Nc7nvvvtu/a3f+q3v/od/+Iff+Yd/+Iff5qqrrrrqqquuuuqqq6666kWHHvSgB3HVVVddddVVVz1/11xzzYM//MM//Lte7MVe7LV5Lp/5mZ/5Ov/wD//w2/wrXXPNNQ9+7dd+7fd68Rd/8dd+sRd7sdfmudx33323/tZv/dZ3/8M//MPv/MM//MNvc9VVV1111VVXXXXVVVdd9W9H5aqrrrrqqquueoHuu+++W7/+67/+fV77tV/7vd7pnd7ps3mAF3uxF3utf/iHf/ht/gXXXHPNg1/7tV/7vV78xV/8tV/sxV7stXku9913362/9Vu/9d3/8A//8Dv/8A//8NtcddVVV1111VVXXXXVVVf9x0EPetCDuOqqq6666qqr/mXXXHPNg1/7tV/7vd7pnd7pswHuu+++WwGe/OQnf+dXfuVXfh7PdM011zz4tV/7td/rxV/8xV/7xV7sxV6b53Lffffd+lu/9Vvf/Q//8A+/8w//8A+/zVVXXXXVVVddddVVV1111X8e9KAHPYirrrrqqquuuupF9zqv8zrv/eEf/uHfxXP5h3/4h99+sRd7sdfmudx33323/tZv/dZ3A/zoj/7o53DVVVddddVVV1111VVXXfVfh8pVV1111VVXXfWv8jqv8zrvxfPxYi/2Yq8NcN999936W7/1W98N8KM/+qOfw1VXXXXVVVddddVVV1111X8fKlddddVVV1111X+IH/mRH/nsH/3RH/0crrrqqquuuuqqq6666qqr/ucguOqqq6666qqr/lW+8zu/8y14Pn70R3/0c7jqqquuuuqqq6666qqrrvqfheCqq6666qqrrvpXufXWWw+maTrgAd7u7d5OXHXVVVddddVVV1111VVX/c+DHvSgB3HVVVddddVVV1111VVXXXXVVVddddVVV/2fROWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q/hHEypp2vdiV4sAAAAASUVORK5CYII=) diff --git a/docs/kcl-std/segAng.md b/docs/kcl-std/functions/std-sketch-segAng.md similarity index 99% rename from docs/kcl-std/segAng.md rename to docs/kcl-std/functions/std-sketch-segAng.md index 1000add88..e908d3cfb 100644 --- a/docs/kcl-std/segAng.md +++ b/docs/kcl-std/functions/std-sketch-segAng.md @@ -8,7 +8,7 @@ layout: manual Compute the angle (in degrees) of the provided line segment. ```kcl -segAng(@tag: TagIdentifier): number +segAng(@tag: tag): number(Angle) ``` @@ -17,11 +17,11 @@ segAng(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Angle)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples diff --git a/docs/kcl-std/segEnd.md b/docs/kcl-std/functions/std-sketch-segEnd.md similarity index 99% rename from docs/kcl-std/segEnd.md rename to docs/kcl-std/functions/std-sketch-segEnd.md index 9d57aed73..6c77ecd9b 100644 --- a/docs/kcl-std/segEnd.md +++ b/docs/kcl-std/functions/std-sketch-segEnd.md @@ -8,7 +8,7 @@ layout: manual Compute the ending point of the provided line segment. ```kcl -segEnd(@tag: TagIdentifier): Point2d +segEnd(@tag: tag): Point2d ``` @@ -17,7 +17,7 @@ segEnd(@tag: TagIdentifier): Point2d | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns @@ -39,9 +39,9 @@ cube = startSketchOn(XY) fn cylinder(radius, tag) { return startSketchOn(XY) - |> startProfile(at = [0, 0]) - |> circle(radius = radius, center = segEnd(tag)) - |> extrude(length = radius) + |> startProfile(at = [0, 0]) + |> circle(radius = radius, center = segEnd(tag) ) + |> extrude(length = radius) } cylinder(radius = 1, tag = line1) diff --git a/docs/kcl-std/segEndX.md b/docs/kcl-std/functions/std-sketch-segEndX.md similarity index 99% rename from docs/kcl-std/segEndX.md rename to docs/kcl-std/functions/std-sketch-segEndX.md index 118ca6681..eded5f51c 100644 --- a/docs/kcl-std/segEndX.md +++ b/docs/kcl-std/functions/std-sketch-segEndX.md @@ -8,7 +8,7 @@ layout: manual Compute the ending point of the provided line segment along the 'x' axis. ```kcl -segEndX(@tag: TagIdentifier): number +segEndX(@tag: tag): number(Length) ``` @@ -17,11 +17,11 @@ segEndX(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples diff --git a/docs/kcl-std/segEndY.md b/docs/kcl-std/functions/std-sketch-segEndY.md similarity index 99% rename from docs/kcl-std/segEndY.md rename to docs/kcl-std/functions/std-sketch-segEndY.md index a082d679a..fd02aa1f1 100644 --- a/docs/kcl-std/segEndY.md +++ b/docs/kcl-std/functions/std-sketch-segEndY.md @@ -8,7 +8,7 @@ layout: manual Compute the ending point of the provided line segment along the 'y' axis. ```kcl -segEndY(@tag: TagIdentifier): number +segEndY(@tag: tag): number(Length) ``` @@ -17,11 +17,11 @@ segEndY(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples diff --git a/docs/kcl-std/segLen.md b/docs/kcl-std/functions/std-sketch-segLen.md similarity index 99% rename from docs/kcl-std/segLen.md rename to docs/kcl-std/functions/std-sketch-segLen.md index eca51db2a..20bb1d4d9 100644 --- a/docs/kcl-std/segLen.md +++ b/docs/kcl-std/functions/std-sketch-segLen.md @@ -8,7 +8,7 @@ layout: manual Compute the length of the provided line segment. ```kcl -segLen(@tag: TagIdentifier): number +segLen(@tag: tag): number(Length) ``` @@ -17,11 +17,11 @@ segLen(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples @@ -29,9 +29,16 @@ segLen(@tag: TagIdentifier): number ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) - |> angledLine(angle = 60, length = 10, tag = $thing) + |> angledLine( + angle = 60, + length = 10, + tag = $thing, + ) |> tangentialArc(angle = -120, radius = 5) - |> angledLine(angle = -60, length = segLen(thing)) + |> angledLine( + angle = -60, + length = segLen(thing), + ) |> close() example = extrude(exampleSketch, length = 5) diff --git a/docs/kcl-std/segStart.md b/docs/kcl-std/functions/std-sketch-segStart.md similarity index 99% rename from docs/kcl-std/segStart.md rename to docs/kcl-std/functions/std-sketch-segStart.md index 280656dfe..d59b5705e 100644 --- a/docs/kcl-std/segStart.md +++ b/docs/kcl-std/functions/std-sketch-segStart.md @@ -8,7 +8,7 @@ layout: manual Compute the starting point of the provided line segment. ```kcl -segStart(@tag: TagIdentifier): Point2d +segStart(@tag: tag): Point2d ``` @@ -17,7 +17,7 @@ segStart(@tag: TagIdentifier): Point2d | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns @@ -39,9 +39,9 @@ cube = startSketchOn(XY) fn cylinder(radius, tag) { return startSketchOn(XY) - |> startProfile(at = [0, 0]) - |> circle(radius = radius, center = segStart(tag)) - |> extrude(length = radius) + |> startProfile(at = [0, 0]) + |> circle( radius = radius, center = segStart(tag) ) + |> extrude(length = radius) } cylinder(radius = 1, tag = line1) diff --git a/docs/kcl-std/segStartX.md b/docs/kcl-std/functions/std-sketch-segStartX.md similarity index 99% rename from docs/kcl-std/segStartX.md rename to docs/kcl-std/functions/std-sketch-segStartX.md index e9966c722..c993f8e13 100644 --- a/docs/kcl-std/segStartX.md +++ b/docs/kcl-std/functions/std-sketch-segStartX.md @@ -8,7 +8,7 @@ layout: manual Compute the starting point of the provided line segment along the 'x' axis. ```kcl -segStartX(@tag: TagIdentifier): number +segStartX(@tag: tag): number(Length) ``` @@ -17,11 +17,11 @@ segStartX(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples diff --git a/docs/kcl-std/segStartY.md b/docs/kcl-std/functions/std-sketch-segStartY.md similarity index 99% rename from docs/kcl-std/segStartY.md rename to docs/kcl-std/functions/std-sketch-segStartY.md index e64414af1..7e11bb130 100644 --- a/docs/kcl-std/segStartY.md +++ b/docs/kcl-std/functions/std-sketch-segStartY.md @@ -8,7 +8,7 @@ layout: manual Compute the starting point of the provided line segment along the 'y' axis. ```kcl -segStartY(@tag: TagIdentifier): number +segStartY(@tag: tag): number(Length) ``` @@ -17,11 +17,11 @@ segStartY(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Length)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples @@ -32,7 +32,7 @@ exampleSketch = startSketchOn(XZ) |> line(end = [20, 0]) |> line(end = [0, 3], tag = $thing) |> line(end = [-10, 0]) - |> line(end = [0, 20 - segStartY(thing)]) + |> line(end = [0, 20-segStartY(thing)]) |> line(end = [-10, 0]) |> close() diff --git a/docs/kcl-std/startProfile.md b/docs/kcl-std/functions/std-sketch-startProfile.md similarity index 99% rename from docs/kcl-std/startProfile.md rename to docs/kcl-std/functions/std-sketch-startProfile.md index 197ccd1af..74379fe32 100644 --- a/docs/kcl-std/startProfile.md +++ b/docs/kcl-std/functions/std-sketch-startProfile.md @@ -9,9 +9,9 @@ Start a new profile at a given point. ```kcl startProfile( - @sketchSurface: Plane | Face, + @startProfileOn: Plane | Face, at: Point2d, - tag?: TagDeclarator, + tag?: tag, ): Sketch ``` @@ -21,9 +21,9 @@ startProfile( | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketchSurface` | [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | What to start the profile on | Yes | +| `startProfileOn` | [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) | What to start the profile on. | Yes | | `at` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Where to start the profile. An absolute point. | Yes | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Tag this first starting point | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Tag this first starting point. | No | ### Returns diff --git a/docs/kcl-std/startSketchOn.md b/docs/kcl-std/functions/std-sketch-startSketchOn.md similarity index 99% rename from docs/kcl-std/startSketchOn.md rename to docs/kcl-std/functions/std-sketch-startSketchOn.md index 8faaca45d..f79773e1f 100644 --- a/docs/kcl-std/startSketchOn.md +++ b/docs/kcl-std/functions/std-sketch-startSketchOn.md @@ -9,8 +9,8 @@ Start a new 2-dimensional sketch on a specific plane or face. ```kcl startSketchOn( - @planeOrSolid: Plane | Solid, - face?: TagIdentifier | Start | End, + @planeOrSolid: Solid | Plane, + face?: tag, ): Plane | Face ``` @@ -18,22 +18,29 @@ startSketchOn( There are some important behaviors to understand when sketching on a face: -The resulting sketch will _include_ the face and thus Solid that was sketched on. So say you were to export the resulting Sketch / Solid from a sketch on a face, you would get both the artifact of the sketch on the face and the parent face / Solid itself. +The resulting sketch will _include_ the face and thus Solid +that was sketched on. So say you were to export the resulting Sketch / Solid +from a sketch on a face, you would get both the artifact of the sketch +on the face and the parent face / Solid itself. -This is important to understand because if you were to then sketch on the resulting Solid, it would again include the face and parent Solid that was sketched on. This could go on indefinitely. +This is important to understand because if you were to then sketch on the +resulting Solid, it would again include the face and parent Solid that was +sketched on. This could go on indefinitely. -The point is if you want to export the result of a sketch on a face, you only need to export the final Solid that was created from the sketch on the face, since it will include all the parent faces and Solids. +The point is if you want to export the result of a sketch on a face, you +only need to export the final Solid that was created from the sketch on the +face, since it will include all the parent faces and Solids. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `planeOrSolid` | [`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Solid`](/docs/kcl-std/types/std-types-Solid) | The plane or solid to sketch on | Yes | -| `face` | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) or [`Start`](/docs/kcl-lang/types#Start) or [`End`](/docs/kcl-lang/types#End) | Identify a face of a solid if a solid is specified as the input argument (`plane_or_solid`) | No | +| `planeOrSolid` | [`Solid`](/docs/kcl-std/types/std-types-Solid) or [`Plane`](/docs/kcl-std/types/std-types-Plane) | Profile whose start is being used. | Yes | +| `face` | [`tag`](/docs/kcl-std/types/std-types-tag) | Identify a face of a solid if a solid is specified as the input argument (`planeOrSolid`). | No | ### Returns -[`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) - A sketch type. +[`Plane`](/docs/kcl-std/types/std-types-Plane) or [`Face`](/docs/kcl-std/types/std-types-Face) ### Examples @@ -72,7 +79,6 @@ example003 = extrude(exampleSketch003, length = 5) ```kcl // Sketch on the end of an extruded face by tagging the end face. - exampleSketch = startSketchOn(XY) |> startProfile(at = [0, 0]) |> line(end = [10, 0]) @@ -163,7 +169,6 @@ example002 = extrude(exampleSketch002, length = 5) ```kcl // Sketch on the end of a revolved face by tagging the end face. - exampleSketch = startSketchOn(XY) |> startProfile(at = [4, 12]) |> line(end = [2, 0]) @@ -175,12 +180,7 @@ exampleSketch = startSketchOn(XY) |> line(end = [-2, 0]) |> close() -example = revolve( - exampleSketch, - axis = Y, - angle = 180, - tagEnd = $end01, -) +example = revolve(exampleSketch, axis = Y, angle = 180, tagEnd = $end01) exampleSketch002 = startSketchOn(example, face = end01) |> startProfile(at = [4.5, -5]) @@ -196,18 +196,18 @@ example002 = extrude(exampleSketch002, length = 5) ```kcl a1 = startSketchOn({ - origin = { x = 0, y = 0, z = 0 }, - xAxis = { x = 1, y = 0, z = 0 }, - yAxis = { x = 0, y = 1, z = 0 }, - zAxis = { x = 0, y = 0, z = 1 } - }) - |> startProfile(at = [0, 0]) - |> line(end = [100.0, 0]) - |> yLine(length = -100.0) - |> xLine(length = -100.0) - |> yLine(length = 100.0) - |> close() - |> extrude(length = 3.14) + origin = { x = 0, y = 0, z = 0 }, + xAxis = { x = 1, y = 0, z = 0 }, + yAxis = { x = 0, y = 1, z = 0 }, + zAxis = { x = 0, y = 0, z = 1 } + }) + |> startProfile(at = [0, 0]) + |> line(end = [100.0, 0]) + |> yLine(length = -100.0) + |> xLine(length = -100.0) + |> yLine(length = 100.0) + |> close() + |> extrude(length = 3.14) ``` ![Rendered example of startSketchOn 5](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEQwElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVdddRWv8zqv897v+I7v+FnXXHPNg7nqqquuuup/vfvuu+/Wz/qsz3qd++6771auuuqqq6666v83KlddddVVV131/9zrvM7rvPeHf/iHf9eP//iP8/SnP53/Krb597DNv4Vt/jVs86KyzYvKNv8ZbPOiss2LwjYvKtu8qGzzorLNv4Zt/ivY5t/CNv9Wtvn3sM2/l23+o9jmP5pt/rvYRhIPZBtJPJBtJPFAtpEEgG0AbCOJB7KNJB7INpJ4gAd/0zd909O//uu//n1+67d+67u56qqrrrrqqv+/qFx11VVXXXXV/3Pv+I7v+Fl/+Zd/yV/91V/x72Wb/yi2+beyzb+Gbf41bPOiss2LwjYvKtu8KGzzorLNi8I2LyrbvKhs86Kyzb+Gbf61bPOvZZt/C9v8W9nm38M2/xFs8x/FNv+RbPOfzTb/2Wzzr/X7v//7vOM7vuNn/dZv/dZ3c9VVV1111VX/fxFcddVVV1111f9j7/iO7/hZ11xzzYN/8id/Ekn8e0lCEpKQhCQkIQlJSEISLwpJSEISkpCEJCTxL5GEJCQhCUm8MJKQhCQkIYkXRhKSkIQkXhhJSEISL4wkJCEJSbwwkpCEJF4YSUhCEpJ4YSQhCUm8MJKQhCT+JZKQhCT+JZKQhCT+JZKQhCReFJKQhCReVJKQhCReVJKQhCT+NSQhCUn8a0lCEpL4t5CEJCTx7yEJSUji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uuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V/GP3CZQq332isoAAAAASUVORK5CYII=) diff --git a/docs/kcl-std/functions/std-sketch-subtract2d.md b/docs/kcl-std/functions/std-sketch-subtract2d.md new file mode 100644 index 000000000..509b71394 --- /dev/null +++ b/docs/kcl-std/functions/std-sketch-subtract2d.md @@ -0,0 +1,67 @@ +--- +title: "subtract2d" +subtitle: "Function in std::sketch" +excerpt: "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch." +layout: manual +--- + +Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch. + +```kcl +subtract2d( + @sketch: Sketch, + tool: [Sketch; 1+], +): Sketch +``` + + + +### Arguments + +| Name | Type | Description | Required | +|----------|------|-------------|----------| +| `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | +| `tool` | [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) | The shape(s) which should be cut out of the sketch. | Yes | + +### Returns + +[`Sketch`](/docs/kcl-std/types/std-types-Sketch) - A sketch is a collection of paths. + + +### Examples + +```kcl +exampleSketch = startSketchOn(XY) + |> startProfile(at = [0, 0]) + |> line(end = [0, 5]) + |> line(end = [5, 0]) + |> line(end = [0, -5]) + |> close() + |> subtract2d(tool =circle( center = [1, 1], radius = .25 )) + |> subtract2d(tool =circle( center = [1, 4], radius = .25 )) + +example = extrude(exampleSketch, length = 1) +``` + +![Rendered example of subtract2d 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFGDElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVbzO67zOe3PVVVddddX/Of/wD//w2/fdd9+tXHXVVVddddX/X1Suuuqqq6666v+xF3uxF3vtd3qnd/qsF3uxF3ttrrrqqquu+j/nt37rt777vvvuu/VHf/RHP4errrrqqquu+v+JylVXXXXVVVf9P3XNNdc8+HM/93N/C+C7vuu7OH/+PFddddX/HLa56l9mm//rbPNv8ehHP5q3equ3eu/77rvv1t/+7d/+nvvuu+9Wrrrqqquuuur/HypXXXXVVVdd9f/Uh3/4h38XwBOf+ET+6I/+iKuu+vewzVX/s9jmqudlm/+rbPNAT3ziEzl9+jSv9mqv9uAP//AP/67P/MzPfB2uuuqqq6666v8fgquuuuqqq676f+h1Xud13vvFXuzFXhvgK77iK7jqqn8vSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQxFUvnCQkIQlJSEISkpCEJCQhCUlIQhKS+L9MEpKQhCQkIQlJSEISkpDE/zaSkIQkJCGJn/3ZnwXgxV7sxV77dV7ndd6bq6666qqrrvr/h3L8+HGuuuqqq6666v+br/iKr/grgC//8i/n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yYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRAPcN999z397Nmzz+Cqq6666qr/TOhBD3oQV1111VVXXXXVVVddddVVV1111VVXXXXV/0lUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/in8EH5x+45Z90OkAAAAASUVORK5CYII=) + +```kcl +fn squareHoleSketch() { + squareSketch = startSketchOn(-XZ) + |> startProfile(at = [-1, -1]) + |> line(end = [2, 0]) + |> line(end = [0, 2]) + |> line(end = [-2, 0]) + |> close() + return squareSketch +} + +exampleSketch = startSketchOn(-XZ) + |> circle( center = [0, 0], radius = 3 ) + |> subtract2d(tool = squareHoleSketch()) +example = extrude(exampleSketch, length = 1) +``` + +![Rendered example of subtract2d 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAD0gUlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddX/atdcc82DAc6cOfNgnumaa655MP8G9913360809mzZ28FuO+++27lqquuuuqqq6666qr/rahcddVVV1111VVXXfU/yjXXXPNggDNnzjz4mmuuefCZM2ceBPDiL/7irw1w5syZB19zzTUP5gW4ePEiL8ju7i7P7fjx49zvxIkT3O++++679Zprrnkwz3TffffdCnD27Nlb77vvvlsB7rvvvlvPnj37jPvuu+9WgH/4h3/4ba666qqrrrrqqquu+p8EPehBD+Kqq6666qqrrrrqqv9a11xzzYPPnDnz4Bd7sRd7LYAXf/EXf22AF3uxF3ttnulJT3rSrWfOnHnw7u4uFy9e5OLFiwDs7u5y8eJF7re7u8vFixf5z3DixAkAjh07xokTJwA4ceIEJ06cAOD48eMAnDhxghMnTgBw33333Qpw9uzZW++7775b/+Ef/uF37rvvvlvPnj1763333XcrV1111VVXXXXVVVf9V0IPetCDuOqqq6666qqrrrrqP8c111zz4DNnzjz4xV7sxV7rmmuuefA111zz4Bd7sRd7bYCLFy8C8PSnP52LFy+yu7vLxYsX2d3d5eLFi/xPZpvnduLECQCOHz/OiRMneOhDHwrA8ePHeehDHwrAfffddyvAb/3Wb303wNmzZ5/xD//wD79933333cpVV1111VVXXXXVVf8Z0IMe9CCuuuqqq6666qqrrvr3u+aaax78Yi/2Yq995syZB734i7/4a7/Yi73YawNcvHiRixcv8vSnPx2Apz/96Tz96U/n/xLb/EtOnDjB8ePHOXHiBA996EM5fvw4D33oQwG47777bj179uyt9913363/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVVdd9e+FHvSgB3HVVVddddVVV1111b/ONddc8+AzZ848+MVe7MVe68Vf/MVf+8Ve7MVeG+DixYtcvHiRpz/96TztaU/j6U9/OpL4/8Q2/xonTpzg+PHjnDhxgoc85CGcOHGChz70odx33323nj179tb77rvv1t/6rd/6nn/4h3/4ba666qqrrrrqqquu+tdCD3rQg7jqqquuuuqqq6666oW75pprHnzmzJkHv9iLvdhrvfiLv/hrv9iLvdhrX7x4kYsXL/L0pz+dpz3taTz96U/nfpL4rySJF4Vt/ivZ5l/LNidOnOChD30ox48f56EPfSgPfehDAbjvvvtu/Yd/+Iff/od/+Iff+a3f+q3v5qqrrrrqqquuuuqqfwl60IMexFVXXXXVVVddddVVz+uaa6558Gu/9mu/14u/+Iu/9ou9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7/Iu7/LaAP/wD//wO1x11VVXXXXVVf+foAc96EFcddVVV1111VX/f3zu537ub11//fWv/UM/9EM89alPRRIAkrifJO4nifudPHmSl3u5l+MN3uANAFitVjzjGc/gnnvu4blJ4gWRxL9EEi+MJP4lkviXSOJFJYl/DUn8e0jiv4Ik/iexzX812/xHss2/l20Azpw5w80338xsNuPixYv82Z/9Gb/6q78KgG3uZxsA29zPNgC2OXnyJB/xER/B3/zN33z313/9178PV1111VVXXXXV/xfoQQ96EFddddVVV1111f9911xzzYM//MM//Luuv/761/78z/98ACQBIIn7SeJ+krjfwx72MD7ogz6I+916663ceuutSOKFkcQLIol/iSReGEn8SyTxopDEi0oS/1qS+PeSxFX/Prb5j2abfy/bvCCz2YwzZ85w8803A3DhwgX+/M//nF/91V/FNvezDYBtAGwDYBuAEydO8CZv8iY85CEPufVDPuRDHsJVV1111VVXXfX/AeX48eNcddVVV1111VX/t11zzTUP/vAP//Dvms1mr/0VX/EVAEjifpIAkMT9JAFw4sQJ3vu935s3eIM3AGB3d5e//uu/5ty5czyQJF4QSbwwkviXSOJfIol/iSReFJL415DEv4Uk/qNI4qorbPOfyTb/EWzzomitsbe3x9mzZ9nc3OT48eM87GEP42EPexhPfepTWS6XPJAkACQBIAmA1WrFHXfcQUQc/4AP+ID3/rM/+7OfOTw83OWqq6666qqrrvq/jHL8+HGuuuqqq6666qr/u6655poHf9M3fdPTb7311gd/53d+J5IAkASAJO4nCQBJALzBG7wB7/Ve78WJEydYrVbcfvvtPPGJT2SaJl4QSbwgknhhJPEvkcS/RBIvCkm8KCTxryWJfytJ/GeRxP8FtvmvYpv/SLb5t2qtcfbsWQCOHTvGyZMnefEXf3EWiwVPfepTkcRzkwSAJABWqxXnz59H0vF3e7d3e+s/+7M/+5nDw8Ndrrrqqquuuuqq/6sox48f56qrrrrqqquu+r/pmmuuefA3fdM3Pf2Xf/mX+emf/mkkASAJAEncTxL3O3nyJO/1Xu/Fy7/8ywOwu7vLn/3Zn7G7u8v9JPHCSOIFkcQLI4kXhST+JZJ4UUjiRSWJfw1J/HtJ4r+TJP4z2OZ/Etv8R7PNfxTbAOzt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s2c5PDzk7NmzvDCSeFFI4l8iiX+JJP4lknhhJPHCSOIFkcQLI4kXRBKLxYJTp06xWCw4deoUp06d4rndd999t549e/bWv//7v//t3/7t3/6e++6771auuuqqq6666qqrrnog9KAHPYirrrrqqquuuuqqq164a6655sEv9mIv9tov9mIv9lrXXHPNg1/sxV7stXkuh4eHHB0dcXh4yNmzZzk8POTs2bPcTxIvCkn8SyTxL5HEv0QSL4wkXhhJvCCSeGEkAbBYLAC4+eabATh16hSnTp3i+fmHf/iH3/77v//73wb47d/+7e+57777buWqq6666qqrrrrqqhcGPehBD+Kqq6666qqrrrrqqn+da6655sFnzpx58DXXXPPgF3uxF3utF3uxF3vta6655sE8H4eHhxwdHXF4eMjZs2c5Ojri8PCQo6Mjnh9JvCgk8cJI4l8iiRdGEi+MJF4QSTzQxsYGi8WCU6dOAXD69GlOnTrFC3Lffffdevbs2Vv//u///rf/4R/+4Xf+4R/+4be56qqrrrrqqquuuupfCz3oQQ/iqquuuuqqq6666qp/v2uuuebBZ86cefA111zz4Bd7sRd7rWuuuebBL/ZiL/bavACHh4cAHB0dcXh4yNHREYeHhyyXSw4PDzk6OuKFkcS/RBIvjCReGEm8MJK438bGBovFgo2NDTY2NgA4ffo0i8WCjY0NXpj77rvv1n/4h3/47fvuu+/Wf/iHf/idf/iHf/htrrrqqquuuuqqq676j4Ae9KAHcdVVV1111VVXXXXVf55rrrnmwWfOnHnwNddc8+AXe7EXe61rrrnmwWfOnHnwNddc82D+BUdHRwAcHh5ydHTE/Q4PD1kulwAcHh5yv6OjI+53dHSEJF4YSQBsbGzw3DY2NpDExsYGAIvFAoCNjQ02NzexzcbGBhsbG7wo7rvvvlvPnj1769///d//NsA//MM//M7Zs2dvve+++27lqquuuuqqq6666qr/LOhBD3oQV1111VVXXXXVVVf917vmmmseDHDmzJkHXXPNNQ95sRd7sdcCuOaaax585syZB19zzTUP5n+R++6779azZ8/eet99991633333QrwD//wD78N6B/+4R9+m6uuuuqqq6666qqr/jugBz3oQVx11VVXXXXVVVdd9T/TNddc82CAM2fOPPiaa655EKAzZ848COCaa655MMA111zzYJ7pzJkzD+aZrrnmmgfzIvqHf/iH3z5z5syDeYCzZ8/eCnDffffdCnDffffdCnD27NlnAL7vvvuecfbs2Vvvu+++W7nqqquuuuqqq6666n8q9KAHPYirrrrqqquuuuqqq6666qqrrrrqqquuuur/JCpXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V/FPwIVTzJ69BM+9gAAAABJRU5ErkJggg==) + + diff --git a/docs/kcl-std/sweep.md b/docs/kcl-std/functions/std-sketch-sweep.md similarity index 99% rename from docs/kcl-std/sweep.md rename to docs/kcl-std/functions/std-sketch-sweep.md index 5c3f1a214..134e4ef8a 100644 --- a/docs/kcl-std/sweep.md +++ b/docs/kcl-std/functions/std-sketch-sweep.md @@ -9,35 +9,40 @@ Extrude a sketch along a path. ```kcl sweep( - @sketches: [Sketch], + @sketches: [Sketch; 1+], path: Sketch | Helix, sectional?: bool, - tolerance?: number, + tolerance?: number(Length), relativeTo?: string, - tagStart?: TagDeclarator, - tagEnd?: TagDeclarator, -): [Solid] + tagStart?: tag, + tagEnd?: tag, +): [Solid; 1+] ``` -This, like extrude, is able to create a 3-dimensional solid from a 2-dimensional sketch. However, unlike extrude, this creates a solid by using the extent of the sketch as its path. This is useful for creating more complex shapes that can't be created with a simple extrusion. +This, like extrude, is able to create a 3-dimensional solid from a +2-dimensional sketch. However, unlike extrude, this creates a solid +by using the extent of the sketch as its path. This is useful for +creating more complex shapes that can't be created with a simple +extrusion. -You can provide more than one sketch to sweep, and they will all be swept along the same path. +You can provide more than one sketch to sweep, and they will all be +swept along the same path. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `sketches` | [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) | The sketch or set of sketches that should be swept in space | Yes | -| `path` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Helix`](/docs/kcl-std/types/std-types-Helix) | The path to sweep the sketch along | Yes | +| `sketches` | [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) | The sketch or set of sketches that should be swept in space. | Yes | +| `path` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) or [`Helix`](/docs/kcl-std/types/std-types-Helix) | The path to sweep the sketch along. | Yes | | `sectional` | [`bool`](/docs/kcl-std/types/std-types-bool) | If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. | No | -| `tolerance` | [`number`](/docs/kcl-std/types/std-types-number) | Tolerance for this operation | No | -| `relativeTo` | [`string`](/docs/kcl-std/types/std-types-string) | What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to trajectoryCurve. | No | -| `tagStart` | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | A named tag for the face at the start of the sweep, i.e. the original sketch | No | -| `tagEnd` | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | A named tag for the face at the end of the sweep | No | +| `tolerance` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Tolerance for this operation. | No | +| `relativeTo` | [`string`](/docs/kcl-std/types/std-types-string) | What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. | No | +| `tagStart` | [`tag`](/docs/kcl-std/types/std-types-tag) | A named tag for the face at the start of the sweep, i.e. the original sketch. | No | +| `tagEnd` | [`tag`](/docs/kcl-std/types/std-types-tag) | A named tag for the face at the end of the sweep. | No | ### Returns -[`[Solid]`](/docs/kcl-std/types/std-types-Solid) +[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) ### Examples @@ -47,21 +52,27 @@ You can provide more than one sketch to sweep, and they will all be swept along // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) ``` ![Rendered example of sweep 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEjUElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVS+Sa6655sE805kzZx4McM011zyYZzpz5syDeC7XXHPNg3k+rrnmmgfzAtx333238gLcd999t/JMZ8+efQbPdN99993KM509e/bW++6771auuuqqq6666qqrrrrqqqsAPehBD+Kqq6666qqr/r+55pprHgxw5syZB19zzTUPPnPmzIN4pmuuuebB11xzzYMBzpw58+BrrrnmwbyIbr31Vu63u7vL8ePHeX52d3d5QY4fPw7A7u4uz+348eM80IMf/GBemH/4h3/47TNnzjz47Nmzt9533323AvzDP/zD7wDcd999t549e/bW++6771auuuqqq6666qqrrrrqqv+r0IMe9CCuuuqqq6666v+aa6655sFnzpx58DXXXPNggDNnzjzoxV/8xV/7zJkzD77mmmsezPNx6623sru7C8Du7i7Hjx9nd3eX+z34wQ9md3eX3d1djh8/zvHjx7nf8ePHATh+/Dj/Xru7uxw/fpzd3V2OHz8OwO7uLg+0u7vL7u4u93vGM57B/XZ3d9nd3eX48eMcP34cgGPHjnH8+HEAjh8/zoMf/GDud999990K8A//8A+/DfAP//APv/MP//APv33ffffdylVXXXXVVVddddVVV131vx160IMexFVXXXXVVVf9b3XNNdc8+MyZMw9+sRd7sde65ppr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AGwDYBsA2wDYxjYAtgGwjW1sA2Ab29jGNjs7O7zkS74kL/VSLwXA7u4uT3/603nqU5/KU5/6VJbL5a333nvv+wzD8NtcddVVV1111VVX/cdDD3rQg7jqqquuuuqqq/59Wmvvvb29/V1d11FrpZRCKYVaK6UUIoKIICKICCICSUQEEUFEIAlJRASSkEREIAlJRASSkIQkJBERSEISEYEkIgJJRASSiAgigoggIogISilEBKUUIoJSCqUUSimUUogISimUUogIIoKIICKQhCQkIQkA2wDYxja2yUxsk5nYJjOxTWaSmdjGNraxjW1sYxvb2AbANgC2AbDN/WxjGwDbANjGNgC2sQ2AbWwDYBvb2AbANraxDYBtAGxjGwDbANjmfrYBsM0D2eaBbHPVc5IEgG2eH9s8N9s8kG3uZ5v72QbANgC2AbANgG0AbANgGwDbANgGwDYAtgGwDYBtbANgGwDb2AbANraxjW1sA7Czs8Mtt9zCS77kS/LgBz8YgL/6q7/iL/7iL3ja057Gcrl8xtmzZz97uVx+N1ddddVVV1111VX/cdCDHvQgrrrqqquuuuqqf7++73+r67rX7rqOWisRQa2VUgqlFCKCUgoRgSQigoggIpBERCCJiEASEYEkJCGJiEASkpCEJCICSUhCEhGBJCICSUQEEYEkIoKIICIopRARlFKICEoplFKICEoplFIopVBKISIopRARRAQRQUQgCQBJPJBtbGObzMQ2mYltMhPbZCa2yUxsYxvb2MY2tgGwDYBtAGxzP9sA2AbANgC2AbANgG1sYxsA29gGwDa2sY1tAGxjGwDb2AbANgC2AbANgG3uZ5v72ea52ebfQxL/F9nm+bHNA9nmfra5n20AbANgGwDbANgGwDYAtgGwDYBtAGxjGwDbANgGwDYAtgGwjW0AbANgG9sA2MY2trENgG1sY5udnR1e8iVfktd6rdcC4Ld+67f4i7/4C86fP89yubz13Llzn7NcLr+bq6666qqrrrrqqn8/9KAHPYirrrrqqquuuurfLzMfPJvNfms+nz+41kophVIKtVZKKZRSiAgigoggIogIJBERRASSiAgkERFIQhKSiAgkIQlJSCIikIQkJBERSCIikEREIImIICKICCKCiCAiiAhKKUQEpRRKKZRSKKVQSiEiKKVQSqGUQkQQEUQEEYEkJCGJ+9kGwDa2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CUlIQhKSeH4k8dxscz/b2Ob48eM87GEP47777rv1R3/0Rz+Hq6666qqrrrrqPwvBVVddddVVV1111VVXXfWf7rd+67e++zM/8zNf57777rv1Dd/wDfnUT/1UTpw4wfNjm/9MkpCEJO4niQeSBIAkJCEJSUhCEpKQhCSem23uZxsA29gG4JprruFlXuZlAPj6r//69+Gqq6666qqrrvrPRHDVVVddddVVV1111VVX/Zf4h3/4h9/+rM/6rNe57777bj158iQf8iEfwhu8wRvwH0ESz48k7ieJ5yYJSQBIQhKSkIQkJCEJSUhCEpIAkASAJAAk8UC2eW7b29s84hGPAOAzP/MzX+cf/uEffpurrrrqqquuuuo/E+X48eNcddVVV1111VVXXXXVVf81Dg8Pd//0T//0pw8PD3df/uVf/rUf9rCHceLECe6++25WqxWSAJCEJAAkASCJ+0kCQBIAkpBERCAJSUQEkpCEJCICSUQEEUFEEBFEBKUUSimUUqi10nUdXdfR9z193zObzej7nr7v6fueWiulFCICSUjCNplJa41pmhjHkWEYWK/XDMPAxsYGD3nIQwD4+q//+vf50z/905/mqquuuuqqq676z0Y5fvw4V1111VVXXXXVVVddddV/naOjo0v/8A//8DsAL/7iL/7aN9xwAy/2Yi/GYrHg6U9/OgCSkASAJAAkcT9J3E8SkpBERCAJSUQEkpBERCCJiEASEUEphYggIiilUEqh1kqtlVorfd/TdR2z2YzZbEbf9/R9T9d1dF1HKYWIQBIAtslMWmuM48g4jqzXa4ZhYGdnh9OnT3Pffffd+l3f9V0f81u/9VvfzVVXXXXVVVdd9V+Bcvz4ca666qqrrrrqqquuuuqq/3r/8A//8Du//du//T2Hh4e7L//yL//aD33oQ3m5l3s55vM5T3/605EEgCQAJHE/SdxPEpKQREQgCUlEBJKQREQgiYggIogIIoJSCqUUSimUUiil0HUdXdfR9z193zObzZjNZvR9T9/3dF1HrZVSChFBRABgm8yktcY0TQzDwDiOLBYLFosFAB//8R//Mv/wD//w21x11VVXXXXVVf9VKMePH+eqq6666qqrrrrqqquu+u9xeHi4+w//8A+/8w//8A+/82Iv9mKvffr06eMPfehDedmXfVnm8zlPf/rTkcT9JAEgiftJQhIRgSQkERFIQhIRgSQkERFEBBFBRBARRASlFEop1FqptdJ1HV3X0fc9s9mM2WxG3/f0fU/XddRaKaUQEUgCwDaZSWuNYRgYhoFSCqUU/uEf/uG3v/7rv/59br311r/mqquuuuqqq676r0Q5fvw4V1111VVXXXXVVVddddV/r7Nnz976Z3/2Zz9z6623/s2DH/zglz59+vTxhz70obzsy74s8/mc3d1dVqsVkgCQxP0kIYmIQBKSiAgkIYmIQBIRgSQigoiglEJEUEohIqi1Ukqh6zq6rqPrOvq+ZzabMZvN6Puevu/puo5aKxFBRCAJSdhmGAb29/c5ODjANgA/8iM/8tlf//Vf/z5nz569lauuuuqqq6666r8a5fjx41x11VVXXXXVVVddddVV//0ODw93b7311r/+sz/7s5+59dZb/2Zzc/P4Lbfc8uCHPvShvOqrvioPechDALjnnnuQxANFBBGBJCICSUgiIpCEJCKCiEASEUFEUEohIiilUEqh1krXddRa6fuevu+ZzWbMZjP6vqfve2qt1FoppSAJSYzjyMWLF7nvvvsYhgGA3/qt3/ruL/3SL32bP/3TP/0Zrrrqqquuuuqq/y7oQQ96EFddddVVV1111VVXXXXV/0zXXHPNg9/xHd/xs17ndV7nvXmm3d1dLl68yF//9V9z8eJFnvGMZxARlFKICEopRAQRQSmFiKCUQkRQSqGUQimFUgq1VmqtdF1H3/fMZjNmsxmLxYKNjQ02NzfZ2tpia2uLzc1NNjc3mc/nzGYzAA4ODtjb22McRwDuu+++WwG+/uu//n3+4R/+4be56qqrrrrqqqv+u6EHPehBXHXVVVddddVVV1111VX/s11zzTUPfrEXe7HXfp3XeZ33erEXe7HXvu+++2695pprHgywu7vLrbfeym233cbe3h533nknEUEphYggIiilEBGUUiilUEqhlEKtla7r6LqOruuYzWbM53MWiwUbGxtsbm6ytbXF1tYWGxsbdF1HRLBarZimifvdd999t/7Wb/3Wd//Wb/3Wd589e/YZXHXVVVddddVV/1OgBz3oQVx11VVXXXXVVVddddVV/3tcc801D36xF3ux136xF3ux13qd13md9+b52Nvb49KlS+zv73PXXXchiYODAyKCo6MjSimsVitqrdRaOXbsGF3X0fc9Ozs7bG9vs7m5Sd/3bGxsUGvlud133323/tZv/dZ3nz179hm/9Vu/9d1cddVVV1111VX/E6EHPehBXHXVVVddddVVV1111VX/e505c+ZBL/7iL/46L/ZiL/Za11xzzYNf7MVe7LX5dzo4OGBra4v73XfffbcCnD179ta///u//+1/+Id/+J1/+Id/+G2uuuqqq6666qr/6dCDHvQgrrrqqquuuuqqq6666qr/O6655poH2/Y111zzkGuuuebBL/ZiL/Za9913360v/uIv/toAZ86ceTDANddc82Ce6R/+4R9++8yZMw8GOHv27K333Xffrffdd9+tAP/wD//wO//wD//w21x11VVXXXXVVf8boQc96EFcddVVV1111VVXXXXVVVddddVVV1111VX/J1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q/hHs0afPIBuiu4AAAAASUVORK5CYII=) @@ -71,18 +82,19 @@ sweepSketch = startSketchOn(XY) // Create a helix around the Z axis. helixPath = helix( - angleStart = 0, - ccw = true, - revolutions = 4, - length = 10, - radius = 5, - axis = Z, -) + angleStart = 0, + ccw = true, + revolutions = 4, + length = 10, + radius = 5, + axis = Z, + ) + // Create a spring by sweeping around the helix path. springSketch = startSketchOn(XZ) - |> circle(center = [5, 0], radius = 1) - |> sweep(path = helixPath) + |> circle( center = [5, 0], radius = 1) + |> sweep(path = helixPath) ``` ![Rendered example of sweep 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAALk0UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV72IIuLBAJKIiAcDSKKU8mBJ1FofJAlJANRaHywJgK7rHsxz6fv+wTwfXdc9WBL/VrYppbBarW7lAWwDEBGs1+tbeSZJDMNwq23uN47jrbaZpukZALZprd1qG9tk5q2ZeStXXXXVVVddddVV/7OhBz3oQVx11VVXXXXVVVdd9f9HRDxYEhHxYEnUWh9ca32QJCTRdd2Du657MEDf9w+WRNd1D+aZJPFAkrifJJ4fSbwgkvjPYpsXxjbPj20eyDb3s80D2WYcx1ttI4lhGG61zTiOt9pmHMdbp2l6hm2mabo1M29trd3KVVddddVVV1111X8N9KAHPYirrrrqqquuuuqqq/73iogHSyIiHlxrfXCt9UERQURQa31w13UP7vv+wX3fP5hnkgSAJAAkcT9J3E8SDySJB5LE8yOJF5Uk/qPY5l/DNs+PbZ4f2zyQbR7INvezDYBt7mcbANsADMNwK8AwDLeO43jrOI63TtP0jNYarbVbW2u3ZuatXHXVVVddddVVV/3boQc96EFcddVVV1111VVXXfU/UynlwRHx4Frrg7uue1BE0HXdg7uue3Df9w/u+/7BAJIAkIQk7icJAEkASOJ+knggSTyQJJ6bJF4QSbyoJPEfxTb/WrZ5YWzz/NjmudnmgWzzQLZ5INsA2OZ+tgGwDYBtAGwDMAzDreM43joMw622WS6XvzNN063TNJGZv81VV1111VVXXXXVC4Ye9KAHcdVVV1111VVXXXXVf72IeLAkSikPns/nrxURdF334K7rHry1tfXaPJMkJCEJAEkASAJAEgCSuJ8k7ieJB5LEA0nigSTx/EjihZHE/zS2+ZfY5gWxzQtim+dmmweyzQPZ5oFscz/b3M8297MNgG0AbGMbANsADMNw6ziOtw7DcOswDLdO0/SMcRxvHcfxt7nqqquuuuqqq/6/Qw96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TDKTzCQzyUwyE9tkJrbJTGxjm8zENraxjW1sYxvb2MY2trENgG1sA2Ab2wDYBsA2ALYBsA2AbQBscz/bANjmfra5n20eyDb3s80D2eZ+tnkg2zyQbR7INg9km/vZ5oFs80C2eSDbABw/fpy3equ34sEPfjAAu7u7/NRP/RS33norD2QbgOPHj/MyL/MyvMzLvAzHjx8HYLVacc8997C7u8vu7i4AtrmfbR7INvezzf3m8znXX389J0+e5MSJE9zvt37rt777R3/0Rz/nvvvuu5WrrrrqqquuuupFgR70oAdx1VVXXXXVVVdd9W9RSnnw9vb2e50+ffqzI4KIQBKSkIQkJCEJSQBIQhIAkgCQBIAkACQBIAkASRw7dowXf/EX55ZbbuHmm2/mgfb29viHf/gHbr/9du68804kASAJAEkASEISAJKQBIAkJCEJSUhCEpKQhCQkERFIQhIRgSQigoggIogIIoKIICKICCKCUgqlFCKCUgqlFEoplFIopVBKoZRCKYVSCqUUSimUUiilUEqhlEIphYiglEJEEBFEBBGBJCICSUhCEgCSuJ9tAGwDYBvbZCa2yUxsk5lkJplJZtJaIzNprZGZtNbITFprZCatNVprZCatNTKT1hqZSWuNzCQzaa2RmWQmmUlmkplkJpmJbTKTzMQ2mYltMhPb2CYzsY1tbGMb29jGNraxjW0AbGMb2wDYxjYAtgGwDYBtAGwDYBsA29zPNvezzf1scz/b3M8297PNA9nmgWxzP9s8kG0eyDYPZJv72eaBbPNAtrmfbR7INgAv/dIvzWu/9mtz/Phxdnd3+au/+iv++q//mosXLwJw/PhxXuZlXobXeZ3X4X67u7vce++93HPPPdjmfrZ5INvczzYPZJsHsg3AYrHg+uuv52EPexgA9913362/9Vu/9d0/+qM/+jlcddVVV1111VX/EvSgBz2Iq6666qqrrrrqqhdVrfXB29vb73X69OnPlkREIImIQBKSAJCEJCQBIAkASQBIQhIAkrifJACOHz/OzTffzLFjx3i1V3s1Hmhvb49Lly5xxx138Ed/9EdIAkASkgCQBIAkACQhCQBJSEISkgCQhCQkIQlJRASSkIQkIgJJRASSiAgigoggIogIIoKIICKICEopRASlFEopRASlFEoplFIopVBKISIopVBKoZRCKYWIoJRCRFBKISKI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4oEk8W9lmweyzf1scz/bANjmfrYBsM39bANgm/vZBsA2ALa5n20AbANgm/vZBsA2ALYBsA2AbQBsA2AbANsA2MY2ALaxDYBtbGMb2wDYZmdnB9s86EEP4kEPehAAx48f5yEPeQjP7b777rsV4OzZs7fed999twL8wz/8w+8A3HfffbcCnD179tb77rvvVl6Ia6655sFnzpx58DXXXPPgM2fOPAjgmmuueTDA2bNnufbaax987tw5JHH+/HkArr322gdfuHABSQDUWh8MIAmACxcuIInntre3R2uNFyQisM3x48cBsM39Tp48iW3ud+LECQBaa7faxjaZeWtmcu+999565swZMvPWs2fPPoNnuu+++24FOHv27K0A99133638N7nmmmseDHDmzJkHX3PNNQ8+c+bMg178xV/8tV/sxV7stXmAixcvsru7y6233sqtt97KM57xDAAkIQlJAEgCQBIAkrifJO4niftJ4rlJ4l8iiRfGNi+MbR7INvezzf1sA2AbANsA2AbANrYBsI1tbGMb29gmM7FNZmKb1hqZSWuNiKDWyr333vs6y+Xyt7nqqquuuuqq/5/Qgx70IK666qqrrrrqqmfLzAfP5/Onb2xsMJvNqLVSayUiKKUQEUQEEUFEIAlJRASSkIQkJCEJSUhCEpIAkIQkJAEgCUkASEISAJIAkIQkACQBIAkASQBIAkASAJIAkASAJAAkASAJAEkASOJ+krifJO4niedHEs/NNs+PbR7INvezzf1sA2Cb+9kGwDb3sw2AbQBscz/bANjmfrYBsA2Abe5nGwDb3M82ALYBsA2AbQBsA2AbANsA2AbANrYBsI1tAGxjG9sA2ObYsWPs7Oxw7NgxbPPgBz8Y2xw/fpwTJ05w4sQJXpD77rvvVoCzZ8/eet999916zTXXPPjaa699bUlcuHCBixcv8md/9mcAXLx4kd3dXQAkcT9J3E8SDySJ5yaJfw/bPD+2eW62AbDN/WwDIIljx45hmxMnTnDy5Elsc+LECU6ePMm9995766lTp8hMTp06dSvAfffdd+t9991369mzZ58BcN999936D//wD7/Nv+Caa655MMCZM2cefM011zz4zJkzDwK45pprHnzNNdc8GODFXuzFXpvn4+LFi0jir/7qrwB4xjOewa233ookJAEgCUkASOJ+kgCQxP0kcT9JPJAknh9J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sI1tbGMb22QmtslMMpPMpLXGOI601m49f/78Q7jqqquuuuqqq14Q9KAHPYirrrrqqquuuur5a6191pkzZz57NptRa6XWSimFiCAiiAgiAklEBJKQhCQkIQlJSEISkpAEgCQkIQkASQBIAkASkrifJAAkcT9JPJAkXhS2eSDb3M8299ve3ubRj340j3nMY9jZ2WFvb4877riDO+64g8c97nHYxjYAtrENgG1sYxvb2MY2trFNZmKbzCQzaa1Ra+XMmTNcf/317OzsUEqhlEJEEBFIQhIAtrHNcrlktVqxt7fHwcEBh4eHSOKBJHE/STyQJB5IEg8kiQeSxANJ4oEkcT9J3E8S95PE/SQBIIn7SeJ+krifJO4nCQBJ3E8SAJK4nyQAJHE/SQBIAkASAJKQBIAkACQBIAlJSAJAEpKQBIAkJCEJSUhCEpKQhCQiAklIIiKQhCQigohAEhFBRBARSCIiiAhKKUQEEUFEUEohIogISimUUogISilEBKUUSilEBKUUSilEBKUUIoJSChFBKYWIICKICCKCiCAikEREIImIQBKSkIQkACQhiQeSBIBt7mcbANvYxja2yUxsk5lkJplJa43MpLVGa43WGtM00VpjmiamaWKaJqZpYpompmlimibGcWSaJqZpYpompmlimiamaaK1xt7eHvfddx/33Xcf586dQxIRgSQkIQlJAEhCEgCSuJ8k7ieJF+T48eO8xVu8BQ960IPY3d3l67/+67HNA9kGwDYAtrENgG1sYxvb2MY2mUlmYpvWGq01pmnCNgcHB69zdHT021x11VVXXXXVVc8PetCDHsRVV1111VVXXfX8ZeaDjx8//vT5fE7f99RaKaUQEUQEEUFEEBFIIiKQhCQkIQlJSEISkgCQhCQkASAJSQBIAkASAJIAkASAJO4niftJ4t/KNvezzf1sA7C9vc0rvuIr8pjHPIb77e3t8bjHPY7HPe5xXLp0CQDb2AbANraxjW0AbGObzMQ2tslMbJOZtNYAOHXqFNvb2zziEY9AEpK4n20yE9u01shMWmu01liv16zXa1arFev1mvV6jSQeSBL3k8QDSeKBJPFAknggSdxPEg8kiQeSxP0kcT9J3E8SAJK4nyQAJHE/SdxPEgCSAJDE/SQBIAkASQBIAkASAJIAkIQkACQhCQBJSAJAEpKQhCQkIQlJSEISkpCEJCQR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0msD2MY297MNgG3uZ5sHksTzY5vVasW9997L3//93/P3f//3rNdrbrnlFmazGQ9/+MN5sRd7MWazGZcuXWK9XvPcbPMvsY1tAGxjGwDb3M82trGNbWwDYBvb2MY2trGNbWxjG9vYxja2sY1tXhBJSEISkogIJCEJSUQEkogIIoKIICKICCKCiKCUQkQQEUQEEUFEUEqhlEJEUEohIiilEBFEBBFBRFBKISKICCICSUQEEUFEEBFIIiKQREQQEUgiIpBERCCJiEASkogIJBERSEISEYEkIgJJSEISkpCEJCQBIAkASQBIAkAS95PEC2KbB7LNv4dtbGMb29zPNraxDYBtbGMbANvYBsA2tgGwjW0AbCOJiCAiiAgigoggIiilUEohIogISilEBKUUaq2UUiilUGul1kqtlVorXddRa6XrOmqtdF1H13X0fc9DH/pQXuqlXorjx49Ta+Xee+/lGc94BsMw0HUdfd/TdR1d19F1HbVWSilEBJKQhG2maeJrv/ZrX+f222//ba666qqrrrrqqv+N0IMe9CCuuuqqq6666qqrHkjSg2utvzWbzR5ca6WUQq2VUgqlFCKCiCAiiAgkERFIIiKQhCQkIQlJSEISkpAEgCSOHz/OLbfcwku8xEtw8803A7C3t8ftt9/O4x73OO644w4kIQlJSAJAEpKQhCQkIQlJSEISkogIJCGJiEASEUFEIImIICKICCKCiKCUQkRQSiEiKKVQSqGUQimFUgqlFEoplFKotVJKoZRCKYVaK6UUSimUUiilUEohIiilUEohIogIIoKIICKQREQgCUlIQhKSAJDEC2MbANsA2MY2trGNbWxjG9vYJjOxjW0yE9tkJrbJTGyTmWQmtslMbJOZZCaZiW0yk8wkM7FNZpKZ2CYzyUwyE9tkJpmJbTKTzMQ2mYltMhPbZCa2yUxsk5nYJjOxTWZiG9vYJjOxjW1sY5vMxDa2sY1tbGMb29jGNraxjW1sYxsA29jGNrYBsI1tbANgG9sA2MY2ALaRBIAkJCEJSUhCEpKICCQREUhCEhFBRBARSCIiiAhKKUQEEUEphYiglEIphVIKpRSuu+46brrpJmazGQCHh4fcc889ZCalFCKCUgoRgSQiggfKTDKT1hpnz5699Xu/93vf58477/xtrrrqqquuuuqq/63Qgx70IK666qqrrrrqqqueW0Q8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x5FhGFiv19x11123fvu3f/v73HXXXb/NVVddddVVV131fxV60IMexFVXXXXVVVddddW/VSnlwbPZ7L26rvts25RSKKVQSqGUQimFiCAikEREIImIQBKSkEREIAlJSAJAEpKQhCQkASAJSUgC4Pjx47z4i784N998MzfffDMAe3t73HHHHTzucY/jzjvvBEASkpAEgCQkIQlJSAJAEpKICCQhCUlIQhIRgSQkERFEBJKICCICSUQEEUFEEBFEBKUUIoKIoJRCRBARlFKICEoplFKICCKCUgoRQSmFiCAiiAhKKUQEkogIIoKIQBKSkIQkJCEJSdxPEvezzf1sYxsA29gmM7GNbTIT22QmtslMMpPMJDOxTWaSmWQmrTUyk8wkM8lMMpPMJDPJTDKTzMQ2mUlmkplkJrbJTDIT22QmtslMbJOZ2MY2tslMbGMb29jGNraxjW1sYxvb2MY2ALaxjW0kASAJAElIAkASkpCEJCICSUgiIpBERBARRAQRQUQQEUQEpRRKKZRSKKVQSqHWSimFWisbGxucPHmSra0tFosFD5SZtNYAKKVQSqGUQimFiCAiiAgeyDatNVprTNPEOI4Mw8AwDKxWK/7u7/7ut7/pm77pdbjqqquuuuqqq/6vQw960IO46qqrrrrqqquu+vcqpTx4c3Pzu0opr52ZlFKICGqtRASlFCKCiEASEYEkIgJJSEISkpCEJCQhCUlIQhKSAJCEJCQBIAlJ7Ozs8Gqv9mq8+Iu/OPfb29sD4I477uDOO+9kb2+PO++8E0lIQhIAkpCEJCQhCUlIQhKSkIQkJCGJiEASkogIJBERSCIikEREEBFEBBFBRBARRAQRQUQQEUQEEUEphYggIogIIoKIICIopRARSCIiiAgiAklEBJKQhCQkIQlJAEjifpKwzQPZBsA2trGNbWxjm8zENpmJbTIT22QmmYltMpPMJDPJTGyTmWQmmUlmkpnYJjPJTDIT22QmmYltMhPbZCa2yUxsY5vMxDa2sY1tbJOZ2MY2trGNbQBsYxvb2MY2ALaRBIAkACQBIAlJSEISkpCEJCICSUQEkogIIoKIICKICEoplFKICEoplFKotVJKodZKrZVjx46xvb3N6dOneW6ZSWYCUGul1kophVIKpRQigohAEpIAsI1tMpPWGtM0MY4jwzCwXq9ZrVbceeedt/76r//6d//+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SQBI4n6SeCDbANgGwDa2sQ3A7u7urf/wD//w3bfddtvv3H333b/NVVddddVVV1111f9u6EEPehBXXXXVVVddddVVV/3HmM1mDz5+/Phrnzhx4rVms9mDjx8//tr8K0jigSTxQJK4nyQAJHE/SQBIAkAS95MEgCQAJAEgCQBJAEgCQBIAkpAEgCQAJCEJAElIAkASkpCEJAAkIQlJSEISAJKQhCQkIQlJSAJAEpKQhCQkIQkASUhCEgCSAJDEv8Q297t06dKtd9xxx29funTp1ttuu+137r333t/mqquuuuqqq6666v8W9KAHPYirrrrqqquuuuqqq/7zzOfzBx8/fvy1F4vFg+bz+YPn8/mDjx8//tq8AJJ4bpJ4IEncTxL3k8T9JAEgiftJAkASAJIAkASAJAAkASAJAElIAkASAJKQBIAkJAEgCUkASEISkgCQhCQAJCEJSUgCQBKSkASAJCQBIAlJAEgCQBL3k8QLs7e3d+udd97523t7e7fedtttv3Pffff9NlddddVVV1111VX/96EHPehBXHXVVVddddVVV131X2s+nz8Y4Pjx46996tSp17LNYrF48IkTJ16bF0ASDySJB5LE/SRxP0ncTxIAkrifJAAkASAJAEkASAJAEgCSkASAJAAkIQkASQBIQhIAkpCEJAAkIQkASUgCQBIAkpAEgCQAJHE/SdxPEveLCC5dunTr/v7+rXfddddvt9a46667fue+++77ba666qqrrrrqqqv+f0IPetCDuOqqq6666qqrrrrqf475fP7gxWLxoMVi8ZBTp069lm0Wi8WDF4vFgxeLxYN5AEk8kCQeSBL3k8T9JAEgCQBJ3E8SAJIAkASAJAAkASAJAEkASAJAEpIAkASAJCQBIAkASQBIAkASAJIAkASAJO4nCYCDg4Nb9/f3b7377rt/WxK3337770jivvvu+22uuuqqq6666qqrrnog9KAHPYirrrrqqquuuuqqq/53WCwWDwZYLBYPns/nD44Inzx58rUlsVgsHrxYLB68WCweLAkASTyQJO4niftJ4n6SAJAEgCTuJwkASQBIAkASAJIAkASAJAAkASAJAEkASAJAEgAHBwe3SuLg4ODWw8PDWw8ODm7NTPb29p5xeHh469mzZ3+bq6666qqrrrrqqqv+NdCDHvQgrrrqqquuuuqqq676v2exWDwYYGNj48G2vbGx8ZCIYD6fPygi2NjYeDDPtLGx8WBJ3G9jY+PBkrifJB5IEgCSuJ8kAI6Ojm4FkATA4eHhrQCHh4e3Atjm8PDwGYeHh7dmJkdHR7ceHR3dylVXXXXVVVddddVV/xnQgx70IK666qqrrrrqqquuuuqqq6666qqrrrrqqv+TqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+r+EewC/LkXYhmagAAAABJRU5ErkJggg==) @@ -90,22 +102,27 @@ springSketch = startSketchOn(XZ) ```kcl // Sweep two sketches along the same path. - sketch001 = startSketchOn(XY) rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) - |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) - |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61) - |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001)) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 50.61, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfile(sketch002, at = [0, 0]) - |> yLine(length = 231.81) - |> tangentialArc(radius = 80, angle = -90) - |> xLine(length = 384.93) + |> yLine(length = 231.81) + |> tangentialArc(radius = 80, angle = -90) + |> xLine(length = 384.93) sweep([rectangleSketch, circleSketch], path = sweepPath) ``` @@ -115,15 +132,14 @@ sweep([rectangleSketch, circleSketch], path = sweepPath) ```kcl // Sectionally sweep one sketch along the path - sketch001 = startSketchOn(XY) circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfile(sketch002, at = [0, 0]) - |> yLine(length = 231.81) - |> tangentialArc(radius = 80, angle = -90) - |> xLine(length = 384.93) + |> yLine(length = 231.81) + |> tangentialArc(radius = 80, angle = -90) + |> xLine(length = 384.93) sweep(circleSketch, path = sweepPath, sectional = true) ``` diff --git a/docs/kcl-std/tangentToEnd.md b/docs/kcl-std/functions/std-sketch-tangentToEnd.md similarity index 99% rename from docs/kcl-std/tangentToEnd.md rename to docs/kcl-std/functions/std-sketch-tangentToEnd.md index 452060dc3..3cca0a07d 100644 --- a/docs/kcl-std/tangentToEnd.md +++ b/docs/kcl-std/functions/std-sketch-tangentToEnd.md @@ -8,7 +8,7 @@ layout: manual Returns the angle coming out of the end of the segment in degrees. ```kcl -tangentToEnd(@tag: TagIdentifier): number +tangentToEnd(@tag: tag): number(Angle) ``` @@ -17,11 +17,11 @@ tangentToEnd(@tag: TagIdentifier): number | Name | Type | Description | Required | |----------|------|-------------|----------| -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) | The line segment being queried by its tag | Yes | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | The line segment being queried by its tag. | Yes | ### Returns -[`number`](/docs/kcl-std/types/std-types-number) - A number. +[`number(Angle)`](/docs/kcl-std/types/std-types-number) - A number. ### Examples @@ -32,7 +32,10 @@ pillSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [20, 0]) |> tangentialArc(end = [0, 10], tag = $arc1) - |> angledLine(angle = tangentToEnd(arc1), length = 20) + |> angledLine( + angle = tangentToEnd(arc1), + length = 20, + ) |> tangentialArc(end = [0, -10]) |> close() @@ -47,7 +50,10 @@ pillSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [0, 20]) |> tangentialArc(endAbsolute = [10, 20], tag = $arc1) - |> angledLine(angle = tangentToEnd(arc1), length = 20) + |> angledLine( + angle = tangentToEnd(arc1), + length = 20, + ) |> tangentialArc(end = [-10, 0]) |> close() @@ -60,7 +66,10 @@ pillExtrude = extrude(pillSketch, length = 10) rectangleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> line(end = [10, 0], tag = $seg1) - |> angledLine(angle = tangentToEnd(seg1), length = 10) + |> angledLine( + angle = tangentToEnd(seg1), + length = 10, + ) |> line(end = [0, 10]) |> line(end = [-20, 0]) |> close() @@ -73,7 +82,11 @@ rectangleExtrude = extrude(rectangleSketch, length = 10) ```kcl bottom = startSketchOn(XY) |> startProfile(at = [0, 0]) - |> arc(endAbsolute = [10, 10], interiorAbsolute = [5, 1], tag = $arc1) + |> arc( + endAbsolute = [10, 10], + interiorAbsolute = [5, 1], + tag = $arc1, + ) |> angledLine(angle = tangentToEnd(arc1), length = 20) |> close() ``` @@ -82,7 +95,7 @@ bottom = startSketchOn(XY) ```kcl circSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 3, tag = $circ) + |> circle(center = [0, 0], radius= 3, tag = $circ) triangleSketch = startSketchOn(XY) |> startProfile(at = [-5, 0]) diff --git a/docs/kcl-std/tangentialArc.md b/docs/kcl-std/functions/std-sketch-tangentialArc.md similarity index 99% rename from docs/kcl-std/tangentialArc.md rename to docs/kcl-std/functions/std-sketch-tangentialArc.md index 97f47489c..797786e03 100644 --- a/docs/kcl-std/tangentialArc.md +++ b/docs/kcl-std/functions/std-sketch-tangentialArc.md @@ -12,13 +12,18 @@ tangentialArc( @sketch: Sketch, endAbsolute?: Point2d, end?: Point2d, - radius?: number, - angle?: number, - tag?: TagDeclarator, + radius?: number(Length), + diameter?: number(Length), + angle?: number(Angle), + tag?: tag, ): Sketch ``` -When using radius and angle, draw a curved line segment along part of an imaginary circle. The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'angle' degrees along the imaginary circle. +When using radius and angle, draw a curved line segment along part of an +imaginary circle. The arc is constructed such that the last line segment is +placed tangent to the imaginary circle of the specified radius. The +resulting arc is the segment of the imaginary circle from that tangent point +for 'angle' degrees along the imaginary circle. ### Arguments @@ -27,9 +32,10 @@ When using radius and angle, draw a curved line segment along part of an imagina | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | | `endAbsolute` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`. | No | | `end` | [`Point2d`](/docs/kcl-std/types/std-types-Point2d) | How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`. | No | -| `radius` | [`number`](/docs/kcl-std/types/std-types-number) | Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`. | No | -| `angle` | [`number`](/docs/kcl-std/types/std-types-number) | Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this arc | No | +| `radius` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute` and `diameter`. | No | +| `diameter` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Diameter of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute` and `radius`. | No | +| `angle` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | Offset of the arc. `radius` must be given. Incompatible with `end` and `endAbsolute`. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this arc. | No | ### Returns @@ -41,7 +47,10 @@ When using radius and angle, draw a curved line segment along part of an imagina ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) - |> angledLine(angle = 45, length = 10) + |> angledLine( + angle = 45, + length = 10, + ) |> tangentialArc(end = [0, -10]) |> line(end = [-10, 0]) |> close() @@ -54,7 +63,10 @@ example = extrude(exampleSketch, length = 10) ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) - |> angledLine(angle = 60, length = 10) + |> angledLine( + angle = 60, + length = 10, + ) |> tangentialArc(endAbsolute = [15, 15]) |> line(end = [10, -15]) |> close() @@ -67,9 +79,15 @@ example = extrude(exampleSketch, length = 10) ```kcl exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) - |> angledLine(angle = 60, length = 10) + |> angledLine( + angle = 60, + length = 10, + ) |> tangentialArc(radius = 10, angle = -120) - |> angledLine(angle = -60, length = 10) + |> angledLine( + angle = -60, + length = 10, + ) |> close() example = extrude(exampleSketch, length = 10) diff --git a/docs/kcl-std/xLine.md b/docs/kcl-std/functions/std-sketch-xLine.md similarity index 99% rename from docs/kcl-std/xLine.md rename to docs/kcl-std/functions/std-sketch-xLine.md index 5ebfb3e68..9a6740981 100644 --- a/docs/kcl-std/xLine.md +++ b/docs/kcl-std/functions/std-sketch-xLine.md @@ -10,9 +10,9 @@ Draw a line relative to the current origin to a specified distance away from the ```kcl xLine( @sketch: Sketch, - length?: number, - endAbsolute?: number, - tag?: TagDeclarator, + length?: number(Length), + endAbsolute?: number(Length), + tag?: tag, ): Sketch ``` @@ -23,9 +23,9 @@ xLine( | Name | Type | Description | Required | |----------|------|-------------|----------| | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | -| `length` | [`number`](/docs/kcl-std/types/std-types-number) | How far away along the X axis should this line go? Incompatible with `endAbsolute`. | No | -| `endAbsolute` | [`number`](/docs/kcl-std/types/std-types-number) | Which absolute X value should this line go to? Incompatible with `length`. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `length` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | How far away along the X axis should this line go? Incompatible with `endAbsolute`. | No | +| `endAbsolute` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Which absolute X value should this line go to? Incompatible with `length`. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns @@ -38,10 +38,16 @@ xLine( exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> xLine(length = 15) - |> angledLine(angle = 80, length = 15) + |> angledLine( + angle = 80, + length = 15, + ) |> line(end = [8, -10]) |> xLine(length = 10) - |> angledLine(angle = 120, length = 30) + |> angledLine( + angle = 120, + length = 30, + ) |> xLine(length = -15) |> close() diff --git a/docs/kcl-std/yLine.md b/docs/kcl-std/functions/std-sketch-yLine.md similarity index 99% rename from docs/kcl-std/yLine.md rename to docs/kcl-std/functions/std-sketch-yLine.md index 534e5cacd..0a62ce6db 100644 --- a/docs/kcl-std/yLine.md +++ b/docs/kcl-std/functions/std-sketch-yLine.md @@ -10,9 +10,9 @@ Draw a line relative to the current origin to a specified distance away from the ```kcl yLine( @sketch: Sketch, - length?: number, - endAbsolute?: number, - tag?: TagDeclarator, + length?: number(Length), + endAbsolute?: number(Length), + tag?: tag, ): Sketch ``` @@ -23,9 +23,9 @@ yLine( | Name | Type | Description | Required | |----------|------|-------------|----------| | `sketch` | [`Sketch`](/docs/kcl-std/types/std-types-Sketch) | Which sketch should this path be added to? | Yes | -| `length` | [`number`](/docs/kcl-std/types/std-types-number) | How far away along the Y axis should this line go? Incompatible with `endAbsolute`. | No | -| `endAbsolute` | [`number`](/docs/kcl-std/types/std-types-number) | Which absolute Y value should this line go to? Incompatible with `length`. | No | -| [`tag`](/docs/kcl-std/types/std-types-tag) | [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) | Create a new tag which refers to this line | No | +| `length` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | How far away along the Y axis should this line go? Incompatible with `endAbsolute`. | No | +| `endAbsolute` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | Which absolute Y value should this line go to? Incompatible with `length`. | No | +| [`tag`](/docs/kcl-std/types/std-types-tag) | [`tag`](/docs/kcl-std/types/std-types-tag) | Create a new tag which refers to this line. | No | ### Returns @@ -38,7 +38,10 @@ yLine( exampleSketch = startSketchOn(XZ) |> startProfile(at = [0, 0]) |> yLine(length = 15) - |> angledLine(angle = 30, length = 15) + |> angledLine( + angle = 30, + length = 15, + ) |> line(end = [8, -10]) |> yLine(length = -5) |> close() diff --git a/docs/kcl-std/functions/std-solid-intersect.md b/docs/kcl-std/functions/std-solid-intersect.md index d697fbb93..6fa4d154f 100644 --- a/docs/kcl-std/functions/std-solid-intersect.md +++ b/docs/kcl-std/functions/std-solid-intersect.md @@ -1,11 +1,11 @@ --- title: "intersect" subtitle: "Function in std::solid" -excerpt: "" +excerpt: "Intersect returns the shared volume between multiple solids, preserving only overlapping regions." layout: manual --- - +Intersect returns the shared volume between multiple solids, preserving only overlapping regions. ```kcl intersect( @@ -14,8 +14,6 @@ intersect( ): [Solid; 1+] ``` -Intersect returns the shared volume between multiple solids, preserving only -overlapping regions. Intersect computes the geometric intersection of multiple solid bodies, returning a new solid representing the volume that is common to all input solids. This operation is useful for determining shared material regions, diff --git a/docs/kcl-std/functions/std-solid-patternCircular3d.md b/docs/kcl-std/functions/std-solid-patternCircular3d.md index ee92be76f..874a21350 100644 --- a/docs/kcl-std/functions/std-solid-patternCircular3d.md +++ b/docs/kcl-std/functions/std-solid-patternCircular3d.md @@ -1,11 +1,11 @@ --- title: "patternCircular3d" subtitle: "Function in std::solid" -excerpt: "" +excerpt: "Repeat a 3-dimensional solid some number of times along a partial or complete circle some specified number of times. Each object may additionally be rotated along the circle, ensuring orientation of the solid with respect to the center of the circle is maintained." layout: manual --- - +Repeat a 3-dimensional solid some number of times along a partial or complete circle some specified number of times. Each object may additionally be rotated along the circle, ensuring orientation of the solid with respect to the center of the circle is maintained. ```kcl patternCircular3d( @@ -19,9 +19,7 @@ patternCircular3d( ): [Solid; 1+] ``` -Repeat a 3-dimensional solid some number of times along a partial or -complete circle some specified number of times. Each object mayadditionally be rotated along the circle, ensuring orientation of the -solid with respect to the center of the circle is maintained. + ### Arguments diff --git a/docs/kcl-std/functions/std-solid-patternLinear3d.md b/docs/kcl-std/functions/std-solid-patternLinear3d.md index dcb76dea4..618bd065f 100644 --- a/docs/kcl-std/functions/std-solid-patternLinear3d.md +++ b/docs/kcl-std/functions/std-solid-patternLinear3d.md @@ -1,11 +1,11 @@ --- title: "patternLinear3d" subtitle: "Function in std::solid" -excerpt: "" +excerpt: "Repeat a 3-dimensional solid along a linear path, with a dynamic amount of distance between each repetition, some specified number of times." layout: manual --- - +Repeat a 3-dimensional solid along a linear path, with a dynamic amount of distance between each repetition, some specified number of times. ```kcl patternLinear3d( @@ -17,8 +17,7 @@ patternLinear3d( ): [Solid; 1+] ``` -Repeat a 3-dimensional solid along a linear path, with a dynamic amount -of distance between each repetition, some specified number of times. + ### Arguments diff --git a/docs/kcl-std/functions/std-solid-shell.md b/docs/kcl-std/functions/std-solid-shell.md index 8544986d6..953930fda 100644 --- a/docs/kcl-std/functions/std-solid-shell.md +++ b/docs/kcl-std/functions/std-solid-shell.md @@ -1,11 +1,11 @@ --- title: "shell" subtitle: "Function in std::solid" -excerpt: "" +excerpt: "Remove volume from a 3-dimensional shape such that a wall of the provided thickness remains, taking volume starting at the provided face, leaving it open in that direction." layout: manual --- - +Remove volume from a 3-dimensional shape such that a wall of the provided thickness remains, taking volume starting at the provided face, leaving it open in that direction. ```kcl shell( @@ -15,8 +15,7 @@ shell( ): [Solid] ``` -Remove volume from a 3-dimensional shape such that a wall of the -provided thickness remains, taking volume starting at the providedface, leaving it open in that direction. + ### Arguments diff --git a/docs/kcl-std/rotate.md b/docs/kcl-std/functions/std-transform-rotate.md similarity index 99% rename from docs/kcl-std/rotate.md rename to docs/kcl-std/functions/std-transform-rotate.md index a1951fb0d..809406217 100644 --- a/docs/kcl-std/rotate.md +++ b/docs/kcl-std/functions/std-transform-rotate.md @@ -9,23 +9,29 @@ Rotate a solid or a sketch. ```kcl rotate( - @objects: [Solid] | [Sketch] | ImportedGeometry, - roll?: number, - pitch?: number, - yaw?: number, - axis?: [number], - angle?: number, + @objects: [Solid; 1+] | [Sketch; 1+] | ImportedGeometry, + roll?: number(Angle), + pitch?: number(Angle), + yaw?: number(Angle), + axis?: Axis3d | Point3d, + angle?: number(Angle), global?: bool, -): [Solid] | [Sketch] | ImportedGeometry +): [Solid; 1+] | [Sketch; 1+] | ImportedGeometry ``` -This is really useful for assembling parts together. You can create a part and then rotate it to the correct orientation. +This is really useful for assembling parts together. You can create a part +and then rotate it to the correct orientation. For sketches, you can use this to rotate a sketch and then loft it with another sketch. ### Using Roll, Pitch, and Yaw -When rotating a part in 3D space, "roll," "pitch," and "yaw" refer to the three rotational axes used to describe its orientation: roll is rotation around the longitudinal axis (front-to-back), pitch is rotation around the lateral axis (wing-to-wing), and yaw is rotation around the vertical axis (up-down); essentially, it's like tilting the part on its side (roll), tipping the nose up or down (pitch), and turning it left or right (yaw). +When rotating a part in 3D space, "roll," "pitch," and "yaw" refer to the +three rotational axes used to describe its orientation: roll is rotation +around the longitudinal axis (front-to-back), pitch is rotation around the +lateral axis (wing-to-wing), and yaw is rotation around the vertical axis +(up-down); essentially, it's like tilting the part on its side (roll), +tipping the nose up or down (pitch), and turning it left or right (yaw). So, in the context of a 3D model: @@ -37,23 +43,24 @@ So, in the context of a 3D model: ### Using an Axis and Angle -When rotating a part around an axis, you specify the axis of rotation and the angle of rotation. +When rotating a part around an axis, you specify the axis of rotation and the angle of +rotation. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `objects` | [`[Solid]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) | The solid, sketch, or set of solids or sketches to rotate. | Yes | -| `roll` | [`number`](/docs/kcl-std/types/std-types-number) | The roll angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | -| `pitch` | [`number`](/docs/kcl-std/types/std-types-number) | The pitch angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | -| `yaw` | [`number`](/docs/kcl-std/types/std-types-number) | The yaw angle in degrees. Must be between -360 and 360. Default is 0 if not given. | No | -| `axis` | [`[number]`](/docs/kcl-std/types/std-types-number) | The axis to rotate around. Must be used with `angle`. | No | -| `angle` | [`number`](/docs/kcl-std/types/std-types-number) | The angle to rotate in degrees. Must be used with `axis`. Must be between -360 and 360. | No | +| `objects` | [`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) | The solid, sketch, or set of solids or sketches to rotate. | Yes | +| `roll` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | The roll angle. Must be between -360deg and 360deg. | No | +| `pitch` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | The pitch angle. Must be between -360deg and 360deg. | No | +| `yaw` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | The yaw angle. Must be between -360deg and 360deg. | No | +| `axis` | [`Axis3d`](/docs/kcl-std/types/std-types-Axis3d) or [`Point3d`](/docs/kcl-std/types/std-types-Point3d) | The axis to rotate around. Must be used with `angle`. | No | +| `angle` | [`number(Angle)`](/docs/kcl-std/types/std-types-number) | The angle to rotate. Must be used with `axis`. Must be between -360deg and 360deg. | No | | `global` | [`bool`](/docs/kcl-std/types/std-types-bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | ### Returns -[`[Solid]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) - Data for a solid, sketch, or an imported geometry. +[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) ### Examples @@ -63,22 +70,32 @@ When rotating a part around an axis, you specify the axis of rotation and the an // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) - |> rotate(roll = 10, pitch = 10, yaw = 90) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) + |> rotate( + roll = 10, + pitch = 10, + yaw = 90, + ) ``` ![Rendered example of rotate 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADtR0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrq/6Vrrrnmwe/4ju/4Wddcc82DAe67775bAf7hH/7hdwDuu+++W8+ePXvrfffddytXXXXVVVddddVVV/1vReWqq6666qqrrrrqqv+3Tp48+d6bm5sAnDx5EoAP//APf28e4L777rsV4OzZs7fed999t/7DP/zD79x33323AvzDP/zDb3PVVVddddVVV1111f9k6EEPehBXXXXVVVddddVVV/3/U0p57Vd/9Vf/rTNnzlBK4cSJE0jipptuQhLb29vccMMNAOzu7nLp0iV2d3d5qZd6KR7ovvvuu/Xs2bO33nfffbf+wz/8w+/cd999t549e/bW++6771auuuqqq6666qqrrvrvhh70oAdx1VVXXXXVVVddddX/PxsbG+/9qEc96rv6vqfWSimFUgoRQUQQEUQEOzs7SOKGG24A4LrrrmNra4utrS02NzfZ3d3l0qVL7O7u8lIv9VLc77777rsV4B/+4R9++x/+4R9+B+C+++679R/+4R9+m6uuuuqqq6666qqr/qugBz3oQVx11VVXXXXVVVdd9f/PyZMnP+vBD37wZ/d9T62VUgoRQSmFiCAikEREIImIQBKSiAgksbW1RURwzTXXIIlrrrmGjY0Nzpw5w+7uLgCXLl3iQQ96EPe77777bgX4h3/4h9/+h3/4h98BuO+++279h3/4h9/mqquuuuqqq6666qr/aOhBD3oQV1111VVXXXXVVVf9/3P99dd/1w033PDeXddRa6WUQimFiCAiiAgkERFEBJKQREQgCUlIIiKQhCQiAklEBJubm2xubrK5ucmpU6fY2NhgsViwWCzY3d3l0qVLPOhBD+J+9913360A//AP//Db//AP//A7AP/wD//w2/fdd9+tXHXVVVddddVVV131b4Ue9KAHcdVVV1111VVXXXXV/z+PfOQjn76zs/PgruuotVJKISKICCKCiCAikEREIAlJRASSkEREIAlJRASSkEREIImIICKICCKCiGBjY4NSCidOnODEiRPM53Nmsxmz2QyA3d1djh8/zv3uu+++W8+ePXvrfffdd+s//MM//M5999136z/8wz/8NlddddVVV1111VVXvSjQgx70IK666qqrrrrqqquu+v/nJV/yJT2bzei6jlIKpRQiglIKEYEkIgJJRASSiAgkIQlJRASSkEREIImIQBIRgSQigoggIogIIoJSCqUUIoJSCrVWFosFtVa2t7fZ2tqi73u6rqOUwvNz33333Xr27Nlb77vvvlv/4R/+4Xfuu+++W//hH/7ht7nqqquuuuqqq6666oHQgx70IK666qqrrrrqqquu+v+l1vraL/7iL/5bfd9Ta6XWSkRQSiEiiAgiAklEBJKQREQgCUlEBJKQREQgCUlEBJKICCICSUQEEUFEUEohIiilUEqhlEIphVortVZqrXRdR9d1dF3HfD5nNpvR9z21ViRhm+fnvvvuuxXgH/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/7+oXHXVVVddddVVV131/858Pn+wJCQhCQBJvDCSuJ8kXhhJ3E8SkpCEJAAk8UCSuJ8kACQhCdtkJraRRN/3dF1HKYXWGhHBOI601rjmmmseDHDNNde89+u8zuu8N89033333foP//APvw3wD//wD79z33333foP//APv81VV1111VVXXXXV/31Urrrqqquuuuqqq676f2dzc/O1JHE/STw/kviXSOJ+knhRSUISkgCQhCQAJCEJSUgiIpCEJCQhiVIKfd9TSkESkpimiWmaGMeRYRiYponWGtdcc82Dr7nmmvcGeJ3XeZ33BrjvvvtuPXv27K333Xffrf/wD//wO/fdd9+t//AP//DbXHXVVVddddVVV/3fQuWqq6666qqrrrrqqv93IgJJSEISAJKQhCQk8UCSuJ8kXhSSeH4k8dwkIQlJSEISAJKQhCQkIQlJSAJAEg9USiEiKKVQa2UcR8ZxZL1eM00TtrFN3/dcc801D77mmmse/GIv9mK8zuu8znsD3HfffbcC/MM//MNv/8M//MPv3Hfffbf+wz/8w29z1VVXXXXVVVdd9b8Xlauuuuqqq6666qqr/t/Z3t5+bUlIQhIvKkk8kCTuJwkASdxPEg8kCQBJ3E8SDyQJSUhCEhGBJCQhCUlIQhIAkpDE/WxjG9vYJjOxzTRNrFYr1us1q9WKzAQgItjY2KDve/q+f/Dx48e55ppr3vt1Xud13hvgvvvuuxXgH/7hH377H/7hH37nvvvuu/Uf/uEffpurrrrqqquuuuqq/x2oXHXVVVddddVVV131/85sNnuwJCQBIInnJgkASfx7SEISkgCQBIAkJAEgCUlIQhKSkIQkJCEJSUQEkpCEJCTxwtjGNrbJTGyTmdhmGAaGYWAYBoZhYJomSil0XcdsNuPEiRMsFgv6vn/w8ePH6fv+vV/ndV7nvQHuu+++W8+ePXvrfffdd+s//MM//M5999136z/8wz/8NlddddVVV1111VX/81C56qqrrrrqqquuuur/la7rXjsikASAJAAkIQlJPD+SeCBJ3E8SDySJF0YS95PE/SQhCUlEBBGBJCQREUhCEpKQxPNjG9vYxja2yUxsYxvb2MY2trGNbWyzXC7Z39+ntcYznvEMWmvM53Pm8zkbGxucOXOGjY0NZrPZg1/sxV7swZubm7zO67zOewPcd999t549e/bW++6779bf+q3f+p5/+Id/+G2uuuqqq6666qqr/vtRueqqq6666qqrrrrq/5XZbPbgiEASkgCQxANJAkASz48knh9JvDCSuJ8kJAEgCUlIAkASkpCEJCICSUhCEpIAkIQk7meb+9nGNraxjW0yE9vYxja2sY1tbHM/29gG4PDwkP39fTKTpz71qWQmGxsbbGxssLm5yTiOXH/99fR9/+DNzc0Hv87rvA6v8zqv894A9913363/8A//8Nv/8A//8Dv33Xffrf/wD//w21x11VVXXXXVVVf916Jy1VVXXXXVVVddddX/K5ubm68liX8NSbwgknh+JPFAkgCQxANJQhKSAJCEJCQhCUlIQhKSkIQkJPGC2MY2trGNbTIT22QmmYltMhPbANjGNra5n20AbGMb29jm4OCAvb09MpMnPelJZCZbW1tcd911rNdrtre3ueGGG+j7/sEnTpx47w//8A9/b4D77rvv1rNnz97693//97/9D//wD7/zD//wD7/NVVddddVVV1111X8uKlddddVVV1111VVX/b9SSkESkpCEJAAkIYn7SeL5kcTzIwkASdxPEpKQxANJQhKSeCBJSEISkpCEJCQhCUlIAkASknhutrGNbWxjG9vYxja2sU1mYhvb2MY2trGNbWwDYJvnZpvntr+/z97eHk94whOwzebmJra58cYbedzjHsfOzg5bW1sP3tzcfPA7vdM7vTbAfffdd+vZs2dv/a3f+q3vue+++279h3/4h9/mqquuuuqqq6666j8Wlauuuuqqq6666qqr/l/Z2tp6bUlI4n6SuJ8kHkgS95PEA0niX0MSz00SkpCEJCQhCUlIIiKQhCQkIQlJPDfb2MY2trGNbWyTmdgmM7GNbWxjG9vYxja2eSDbANjGNra5n20AbHM/29xvf38f2zzucY/jH/7hH8hMtra2uOmmm9jf3+fYsWPs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vyG46qqrrrrqqquu+n/ivvvuu/WzPuuzXue+++679cSJE3zgB34gr/d6r8e/liReGElI4n6SeCBJSEISkpCEJCQREUQEEUEphVIKEUEphYggIpCEJABsYxvbZCa2sY1tbGOb+508efLB11xzzYO56qqrrrrqqquuuur/E4Krrrrqqquuuuqq/0fuu+++Wz/rsz7rdX7kR37ks0+cOMHrvd7r8XZv93YcP36c/wySuJ8kHkgSkpCEJCKCiCAiiAgigoiglEJEEBFIQhIAkgCwTWZiG9vYxja2AbCNba655hruu+++W7nqqquuuuqqq6666v8TKlddddVVV1111VX/z9x33323/uiP/ujnALzO67zOe7/sy77sgx/ykIfw13/91/zWb/0Wz00SLypJSAJAEveTBIAkJCEJAElIQhKSiAgigoggIiilEBFEBBFBRCAJANvYxja2sY1tbGMbANsA3HzzzRwdHd3KVVddddVVV1111VX/31COHz/OVVddddVVV1111f9H//AP//A7f/Znf/Yzm5ubxx/zmMe89EMe8hBe5mVehtVqxb333oskJCEJAElIQhIAkpAEgCQkIYmIICKQhCQiAklEBJKICCKCUgqlFEop1Frpuo6u6+j7ntlsxmw2Yzab0fc9fd9Ta6WUgiRsk5m01hjHkWEYWK/XDMPAOI6M40hrjcyktcZjH/tY/v7v//6n//RP//RnuOqqq6666qqrrrrq/xPK8ePHueqqq6666qqrrvr/6vDwcPdP//RPf+bs2bPPePCDH/zSp06dOv6YxzyGl37pl2Y+n/OMZzwDSQBIQhKSAJCEJAAkIYmIQBIRgSQiAklEBJKICCKCiKCUQkRQa6XWStd1dF1H3/fMZjNmsxnz+ZzZbEbXddRaiQgkYZvMZJomxnFkGAaGYWAYBoZhoLXGNE201niFV3gFWmu3fsM3fMP7HB4e7nLVVVddddVVV1111f8nlOPHj3PVVVddddVVV131/92tt97613/6p3/604eHh7vXXHPNg0+dOnX8wQ9+MC/1Ui/FfD5nb2+P1WqFJCQBIAlJAEhCEhFBRCCJiEASEYEkIgJJRASlFEoplFKotVJrpes6+r6n73tmsxnz+ZzZbEbf93RdRymFiADANpnJOI6M48h6vWYYBoZhYBxHpmmi6zpe8iVfklOnTvELv/ALX/Onf/qnP81VV1111VVXXXXVVf/fUI4fP85VV1111VVXXXXVVXB0dHTpH/7hH37nz/7sz37m1ltv/ZvNzc3jt9xyy4Mf/OAH88hHPpJHPepRANx3330ASEISAJKICCQREUQEkogIJBERSCIiiAhKKZRSKKVQa6XrOrquo+97ZrMZs9mM2WzGbDaj73u6rqPWSkQgicyktcY0TQzDwDAMrNdrhmFgHEduuOEGXvzFX5zFYsGP/MiPfPaP/uiPfg5XXXXVVVddddVVV/1/hB70oAdx1VVXXXXVVVddddXzd+bMmQe90zu902e/zuu8znvzTJcuXeK2227jGc94Bn//938PgCQiglIKpRQiglIKEUFEUEqhlEJEUGullELXdXRdR9d1zGYzFosFi8WCzc1NNjc32draYnNzk8ViwWw2o+s6IgLbTNPEMAwsl0sODg44PDzk4OCAzc1Njh8/zmw2A+BHfuRHPvtHf/RHP4errrrqqquuuuqqq/6/Qg960IO46qqrrrrqqquuuuqFu+aaax78Yi/2Yq/9Oq/zOu/1Yi/2Yq/NA1y6dInbb7+d22+/ncc//vGUUiilEBFEBKUUIoJSCqUUSinUWqm10vc9fd8zm81YLBYsFgs2NzfZ2tpic3OTzc1NFosFs9mMWisRQWYyTRPr9Zrlcsnh4SG22dra4n7/8A//8Ns/8iM/8jn/8A//8NtcddVVV1111VVXXfX/GXrQgx7EVVddddVVV1111VUvujNnzjzoxV/8xV/nxV7sxV7rdV7ndd6b57K3t8edd97JwcEBh4eHHBwccN9991FKoZRCKYVaK7VW+r6n73vm8znz+ZyNjQ22trbY3Nxka2uLzc1N5vM5s9mMUgqSmKaJ1WrFMAxM08QD/cM//MNv//3f//1v/+iP/ujncNVVV1111VVXXXXVVYAe9KAHcdVVV1111VVXXXXVv80111zz4DNnzjz4xV7sxV7rxV/8xV/7xV7sxV6bF+Dg4IDDw0OOjo6QxGq1YhgGSil0XUff98xmM2azGbPZjPl8Ttd11FqxDcA4jjy3++6779bf+q3f+u5/+Id/+J1/+Id/+G2uuuqqq6666qqrrrrq2dCDHvQgrrrqqquuuuqqq676j3PNNdc8+MVe7MVe+8Ve7MVe65prrnnwmTNnHnzNNdc8mH+F/f19tre3eX7uu+++W8+ePXvr3//93//2P/zDP/z2P/zDP/wOV1111VVXXXXVVVdd9fyhBz3oQVx11VVXXXXVVVdd9Z/rmmuueTCAbb/4i7/46wCcOXPmQddcc82D77vvvluvueaaB/Nc7rvvvlt5pn/4h3/4HcD/8A//8DtcddVVV1111VVXXXXViw496EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/Kv4RLUa4di2laY8AAAAASUVORK5CYII=) @@ -88,22 +105,30 @@ sweepSketch = startSketchOn(XY) // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) - |> rotate(roll = 10) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) + |> rotate( + roll = 10, + ) ``` ![Rendered example of rotate 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEpGklEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVv9o111zzYIAzZ848+JprrnnwmTNnHsQzXXPNNQ++5pprHswznTlz5sE80zXXXPNgno/77rvvVh7g7NmztwLcd999t/JM9913361nz559xn333XcrwD/8wz/8NlddddVVV1111VVXXXXVVS8cetCDHsRVV1111VVXXfW8rrnmmgefOXPmwS/2Yi/2WgAv/uIv/toAL/ZiL/ba/Av29va4397eHvfb29vjBdnZ2eGBdnZ2ANjZ2eEFue+++24F+Id/+IffBviHf/iH37nvvvtu/Yd/+Iff5qqrrrrqqquuuuqqq666CtCDHvQgrrrqqquuuur/s2uuuebBZ86cefCLvdiLvRbAi7/4i7/2i73Yi702z2Vvbw+Avb09br/9dgD29vbY29sDYG9vj729Pf4z7OzsALCzs8POzg4AN998MwA7OzvcdNNNPNB99913K8A//MM//PY//MM//M5999136z/8wz/8NlddddVVV1111VVXXXXV/zfoQQ96EFddddVVV131/8k111zz4Nd+7dd+L4AXf/EXf+0Xe7EXe20eYG9vjzvuuINLly6xt7fH3t4ed9xxB/+dJPEv2dnZYWdnh52dHW666SZ2dna46aabuN9999136z/8wz/89j/8wz/8zm/91m99N1ddddVVV1111VVXXXXV/wfoQQ96EFddddVVV131f9k111zz4Nd+7dd+r2uuuebBr/M6r/PePMDe3h7/8A//AMAdd9zBHXfcwYtiZ2cHgJ2dHXZ2dtjZ2QHg2LFj7OzsALCzswPAzs4Oz8/e3h47OzsA7O3tsbe3x87ODnt7e+zt7QGwt7fH3t4ee3t77O3tsbe3x7/Gzs4ON910EzfddBM7OzvcdNNNANx33323/sM//MNv/8M//MPv/NZv/dZ3c9VVV1111VVXXXXVVVf9X4Ue9KAHcdVVV1111VX/11xzzTUPfu3Xfu33ep3XeZ33vuaaax7MM+3t7fEP//AP3HHHHdxxxx38S3Z2dtjZ2eGmm24C4Oabb+amm27iv8ve3h4Ad9xxB3fccQd7e3vccccdvKh2dna46aabeOxjH8tNN90EwH333Xfrj/7oj37OP/zDP/z2fffddytXXXXVVVddddVVV1111f8l6EEPehBXXXXVVVdd9X/BNddc8+DXfu3Xfq93eqd3+myeaW9vj3/4h3/gjjvu4I477uCF2dnZYWdnh5tuuombb76Zm266iRdmuVxydHTEarViuVwCsFqtWC6XABwdHWGbo6MjMpPMJDPJTDKT1hqZSWaysbFBZpKZbG5usrm5iW2uv/56bLO9vc2NN97I87O3t8fe3h533HEHd9xxB3fccQfPjyQeaGdnh5tuuonH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ddVVV1111VX/YSTxgkhCEpIAkASAJCRxP0lI4oFsYxtJANjGNpKwjSRsIwnbSALANpK4n20eyDa2sY1tAGxjG9s8kCQkERGUUpCEbSRhm8yklEIphYiglEJEEBFIQhKSAJCEJCTxQBcvXvxtrrrqqquuuuqq/0hUrrrqqquuuuqqq6666qr/MBHxYElIAkASkgCQhCQkASAJAEkASEIS95MEgG1sYxvb2EYSALaRhG0kYRtJANhGEgC2uZ9tbGOb+9nGNrZ5bpKQhCQigoggIpAEgCRsU2ultUYphVIKEUFEIImIQBKSkMQLslwub+Wqq6666qqrrvqPROWqq6666qqrrrrqqquu+g8TEQ/m+ZDEA0lCEgCSAJAEgCTuJ4nnxza2kYRtJPFAtpGEbWwjCdvY5oFsY5sHso1tHkgSkpBERBARRAQAkrBNZlJKISIopRARRAQRgSQkASAJSTyQJGyzXC5v5aqrrrrqqquu+o9E5aqrrrrqqquuuuqqq676LyMJSUgCQBIAkgCQBIAk7icJ29jGNraRBIBtJAFgG0nYRhIviG1sY5v72cY2tnlukpCEJCKCiCAiiAjuV0ohMymlUEohIogIIgJJSEISknhBJLFcLp/BVVddddVVV131H4nKVVddddVVV1111VVXXfUfppTyYEkASOKBJPFAkgCQhCTuJwkASbwwtpEEgG0kYRtJANhGEgC2sc1zs41t/iWSkIQkIoJSChEBgCQAWmuUUiilEBFEBBGBJCQhCUlIAkASkrifbS5evPjbXHXVVVddddVV/5GoXHXVVVddddVVV1111VX/YSTxryEJSQBIAkAS95MEgCRsYxvb2EYSALaRxAPZRhIAtpEEgG0AbGOb+9nmfra5nyQkIYmIICKICCKCiABAErYppRARRAQRQUQgiYhAEg8kiQeyzVVXXXXVVVdd9Z+CylVXXXXVVVddddVVV131HyIzHwQgCUn8a0gCQBIAkrifJAAk8dxsIwkA20jCNpIAsI0k/i0kASAJSUhCEpKICCICSWQmpRQyk1IKEUFEEBFEBJKQxItivV7fylVXXXXVVVdd9R+JylVXXXXVVVddddVVV131H0YSz00Sz00SknggSQBIAkAS95PEc7ONJABsI4kHso0knpttXhhJ3E8SAJKQREQQEUQEEYEkJGGbiCAiKKUQEUjigSQhiRfk/Pnzv8NVV1111VVXXfUfjcpVV1111VVXXXXVVVdd9R/C9oN5LpJ4bpK4nyT+JZIAkASAbWwjiedmG0m8qGxjGwDb2OaBJCEJSUQEEUFEEBGUUgCwTSmF1hoRgSQkIQlJSOIFsc39lsvlrVx11VVXXXXVVf/RqFx11VVXXXXVVVddddVV/yEy88H8O0kCQBIAkviX2EYSL4xtbPPCSEISAJKQhCQkIYmIICKICCKCiADANplJRCAJSUhCEpIAkMS/ZLlcPp2rrrrqqquuuuo/GpWrrrrqqquuuuqqq6666j9ERCAJSUjiRSWJf4kkACTxorCNJP6tJCEJSUQEEYEkJBERRASSkIRtIgJJRASSkIQkXlS2OTw8fAZXXXXVVVddddV/NIKrrrrqqquuuuqqq6666j/KgyVxP0n8e0gCQBIvCts8P7Z5YSTxQJJ4IElIIiKICCKCiCAiiAgkIQlJSEISknh+bANgm+e2u7v721x11VVXXXXVVf/RqFx11VVXXXXVVVddddVV/yEkPZgXQBL/E0kCQBIAkgCQhCQiAklEBJKICCQhiYgAQBIRQUQgCUk8N9s8N9sA2MY26/X6Vq666qqrrrrqqv9oVK666qqrrrrqqquuuuqq/xARgSQk8Z9BEv8WknhRSEISkpBERCCJiEASEUFEEBFEBJIAiAgyk3+JbZ6bba666qqrrrrqqv9UVK666qqrrrrqqquuuuqq/xCS+I8giX8LSbwwknhRSEISkpCEJCKCiEASEYEkJAFgGwBJvChs89wuXbr021x11VVXXXXVVf8ZqFx11VVXXXXVVVddddVV/yEi4sH8B7CNJP4jSeK5SQJAEpKQhCQkIQlJRAQRQUQgiYhAEpKQBIAkJAEgifvZxja2sQ2AbQBsYxsA2+zv79/KVVddddVVV131n4HKVVddddVVV1111VVXXfUfQtKDJQEgiReVbSTxH0kSL4gkJAEgCQBJSEISkpCEJCQhCUlEBJKQhCQkASAJAEm8MLYBsM1zu3Dhwu9w1VVXXXXVVVf9Z6By1VVXXXXVVVddddVVV/2HkASAJP43kcT9JCEJSUQEEUFEEBFIIiKICCQhiftJ4oFsYxvb2MY2trHNA9kGoLXGVVddddVVV131n4LKVVddddVVV1111VVXXfUfopTyYEm8MJL4jyaJ+0nifpJ4bpK4nyQkASAJSQBIQhKSkEREIImIQBKSiAgkASCJ+9nGNraxjW1sY5sHso1tAGyzu7v721x11VVXXXXVVf8ZCK666qqrrrrqqquuuuqq/xC2eW6S+I9im/8IkpDE/SQBIAlJSCIiiAgiAklEBBGBJCQhCUm8ILaxjW1sA2Ab29jmua3X61u56qqrrrrqqqv+MxBcddVVV1111VVXXXXVVf9umflgSTyQJP49bANgmweSxItKEpIAkMQDSUISAJKQhCQkIQlJSCIiiAgkERFIQhKSkMT9bGMb2wDYxja2sc0LsrW1xVVXXXXVVVdd9Z+GylVXXXXVVVddddVVV13175aZDwaQxH8FSTyQJO4niecmiRdEEpKQREQgiYggIogIIgJJRASSkMQLYhvb2MY2tgGwjW1sYxvbANjm8Y9//Hdz1VVXXXXVVVf9Z6Fy1VVXXXXVVVddddVVV/272X6wJAAk8V9BEv9akpCEJAAkIQlJSEISEYEkJBERSCIikIQkJCGJB7KNbQBsY5v72eaqq6666qqrrvpvQ3DVVVddddVVV1111VVX/btFBJK4nyTuJ4n/apJ4bpJ4IEk8kCQkIQlJRASSiAgkIQlJSAJAEg9kG9vYxja2sY1tbGObB7INwIULF36Hq6666qqrrrrqPwvBVVddddVVV1111VVXXfXvZvtB/Aewzb+VJB5IEi+IJAAkIQlJAEhCEhGBJCICSUQEkpCEJCTx/NjGNraxjW1sYxsA2zyQbVprXHXVVVddddVV/2kIrrrqqquuuuqqq6666qp/t4h4sCQk8Z/JNg8kiRdGEpKQBIAkJAEgCUlIQhKSkIQkJBERSCIikEREIInnxza2sY1tbGMb29zPNgC2sc39Ll68+NtcddVVV1111VX/WahcddVVV1111VVXXXXVVf9ukvi3sI0k/qNI4kUhiftJQhKSkEREEBFIIiKQhCQkIQlJSOIFsY1tbGMb29jmBVmv17dy1VVXXXXVVVf9Z6Fy1VVXXXXVVVddddVVV/27RQT3k8TzI4n/DJJ4UUjigSQhCQBJSEISkpBERCCJiCAikIQkJPH82MY2trGNbR7INra5n22Ojo5u5aqrrrrqqquu+s9EcNVVV1111VVXXXXVVVf9u0l6sCT+s9jmRSWJF0QSkgCQBIAkJCEJSUhCEpKICCQhCUlIAkASAJKwjW1sYxsA29jGNraxzf1sc79z5879NlddddVVV1111X8mgquuuuqqq6666qqrrrrq3y0iHgwgif8ItgGwzYtCEg8kiQeSxANJAkASkgCQhCQigoggIpCEJCQhCUlI4gWxjW1sYxvb2Oa52eaqq6666qqrrvovQeWqq6666qqrrrrqqquu+neThCQeSBL/0SQhCUn8SyQhCUkASAJAEgCSkASAJCQREUhCEpKICCICSUgCQBKSeCDb2MY2trENgG0AbGMb29zPNufPn/8drrrqqquuuuqq/0xUrrrqqquuuuqqq6666qp/t4h4MA8gif9sknggSfxLJAEgiftJQhKSkIQkIgJJSEISEYEkJPEvsQ2AbQBs84KsViuuuuqqq6666qr/VFSuuuqqq6666qqrrrrqqv8zJPH8SOK5SUISkpCEJCQhCUlEBBFBRCAJSUhCEs/NNraxjW1sYxvb2MY2tgGwzf0ODw9/m6uuuuqqq6666j8TwVVXXXXVVVddddVVV13175KZD5aEJJ6bJP4zSeJfSxKSAJCEJCQhCUlEBJKICCQhCUlIQhIAkgCwjW0AbGMb29jGNrZ5INsA2MY2q9XqVq666qqrrrrqqv9MBFddddVVV1111VVXXXXVv0tmPphnkoQk/jPY5vmRxANJQhL3kwSAJCRxP0kASEISkpCEJCICSUQEkpCEJAAk8dxsYxvb2MY297ONbZ5bRNzKVVddddVVV131n43gqquuuuqqq6666qqrrvp3sf1g/gPY5j+SJCTx3CQhCQBJAEgiIogIIgJJRASSiAgkIQlJvDC2sY1tbGOb+9nmgW699dbf5qqrrrrqqquu+s9G5aqrrrrqqquuuuqqq676d5GEJF4YSfxnksQLIwkASdxPEpKQhCQkIQlJRASSiAgkIQlJSEISD2Qb29jGNraxjW1sYxvbANjGNlddddVVV1111X8ZKlddddVVV1111VVXXXXVv9eDJCGJ/06SeGEkASAJSUgCQBKSkIQkJCGJiEASkpCEJB5IEvezjW1sYxvb2MY2z49tzp8//ztcddVVV1111VX/2Qiuuuqqq6666qqrrrrqqn+XiOA/k20eSBKSeH4k8dwk8YJIQhKSkIQkIoKIQBKSiAgkASCJF8Q2trGNbWwDYBvb2OaBDg4ObuWqq6666qqrrvrPRnDVVVddddVVV1111VVX/btIejDPJIkXlW3+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qn+Vs2fP3nr69OlbASTxn0kSL4gk7ieJ5yYJSQBIQhKSkIQkJCGJiEASkgCQBIAk7mcb29jGNrbJTGxjG9vYxjb3WywWXHPNNQ/mqquuuuqqq67670Rw1VVXXXXVVVddddVVV/2r/P3f//1vv9iLvdiDJfGvYZv72eaBbPOCSAJAEveTxP0kASCJ+0nifpK4nyQkIQlJSEISkpCEJCQhifvZBsA2trGNbWyTmdjGNgC2sY1tDg4Obj1z5syDueqqq6666qqr/jsRXHXVVVddddVVV1111VX/Kr/927/9PadPn+bRj340/162+deSxP0k8UCSkASAJCQBIAlJAEhCEhFBRCAJSUhCEi+MbWyTmdjGNraxjW0e6JZbbnnw2bNnb+Wqq6666qqrrvrvRHDVVVddddVVV1111VVX/avcd999t/793//9b7//+78//5kkcT9JAEjifpK4nyReEEkASEISkpCEJCQhCUlIQhKSeG62sY1tbGObzMQ2mYltbGMbANucOXOGq6666qqrrrrqvx3BVVddddVVV1111VVXXfWv9tu//dvfc/r0aR71qEfxH802kgCQxL9EEgCSuJ8kJCEJSUhCEpKQhCQkIQlJSEIS95PEc7ONbTIT29gmM7GNbe5nG4DDw0Ouuuqqq6666qr/dgRXXXXVVVddddVVV1111b/a3//93//Wfffdd+v7vu/7Ion7SeI/miQAJHE/STw/kpDEc5MEgCQkIQlJSEISkpCEJJ6bbWwDYBvbZCaZiW1sYxvb2OZ+586d++377rvvVq666qqrrrrqqv9OBFddddVVV1111VVXXXXVv9rZs2ef8Q//8A+/ffr0aV71VV8VSfxXkcT9JAEgiQeSBIAkJAEgCUlIQhKSkIQkJCEJAEk8P7axjW1sYxvb2MY2tgGwzU033cR99913K1ddddVVV1111X83gquuuuqqq6666qqrrrrq3+RHf/RHPwfgLd7iLTh16hT/mSQBIIn7SeKBJCEJSQBI4n6SkIQkJCEJSUgiIpCEJCTxQLYBsI1tbGObzMQ2trHN/WwDcPPNN3PffffdylVXXXXVVVdd9d+N4Kqrrrrqqquuuuqqq676N7nvvvtu/fqv//r3OXXqFB/7sR/LfyRJSEISz48k7ieJ5yYJAElIQhKSAJCEJCQhCUlIAkASkngg2wDYxjaZiW0yk8zE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qquuuuqqq6666qqrrrrqqquuuuqqq/5PonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q/hHVynZShloDO0AAAAASUVORK5CYII=) @@ -113,22 +138,31 @@ sweepSketch = startSketchOn(XY) // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) - |> rotate(axis = Z, angle = 90) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) + |> rotate( + axis = Z, + angle = 90, + ) ``` ![Rendered example of rotate 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAC6p0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVdd9d/ummuueTDAmTNnHgxwzTXXPBjgzJkzD+KZrrnmmgcDXHPNNQ++7777br3mmmsefObMmQfzANdcc82D+Xe67777buW5nD179lae6b777ruVZ7rvvvtuBTh79uwzAO67775bAc6ePXvrfffddytXXXXVVVddddVVV/13Qw960IO46qqrrrrqqquuuuo/xzXXXPNggBd7sRd77TNnzjwI4JprrnnwNddc82CAF3uxF3tt/gVPeMITuN/+/j7329/f5357e3u8IPv7+7ww29vbPD87Ozs8t+3tbQC2t7e536Mf/WhemPvuu+9WgLNnz95633333QrwD//wD78D8A//8A+/DXDffffdylVXXXXVVVddddVV/xnQgx70IK666qqrrrrqqquu+re75pprHnzmzJkHv9iLvdhrAbz4i7/4a585c+bB11xzzYN5Lk984hPZ29sDYH9/n/39fQD29/fZ39/nuW1vb2MbgO3tbXZ2dgDY3t7mftvb29xve3ub52dnZ4fnZ29vj+dnf3+fB9rf32d/f5/77e3tAbC/v8/+/j7PbXt7G4Dt7W0AdnZ22N7eZnt7G4BHP/rRPNB99913K8DZs2dvve+++279h3/4h9+57777bj179uyt9913361cddVVV1111VVXXfVvhR70oAdx1VVXXXXVVVddddWL5pprrnnwa7/2a78XwIu/+Iu/9ou92Iu9Ns+0v7/PXXfdxd7eHvv7++zv77O/v8/+/j7Pz/b2Ntvb22xvbwOwvb3NjTfeCMD29jbb29s80P7+Pvfb398H4IYbbuC/wl133YVtAHZ2dtje3uZ++/v73G9vb4/9/X0A9vf32d/fZ29vj/39ffb393l+tre32d7eZmdnh+3tbba3t9ne3ubGG28E4L777rv17Nmzt9533323/sM//MPv3Hfffbf+wz/8w29z1VVXXXXVVVddddWLAj3oQQ/iqquuuuqqq6666qrn75prrnnwa7/2a7/Xi7/4i7/2i73Yi702wP7+PnfddRf7+/vcdddd3HXXXbww29vbbG9vc8MNNwBwww03cMMNN3C//f199vf3ueGGG3h+Dg8PATg6OmK5XCKJ1WpFRBARjONIrZVSCraptdJ1HbVWuq6jlIIkIoL5fA7AarUiM7FNa41pmhjHkWmaGMeRiKC1RmuN1hpd1zGbzbCNbRaLBbbZ2Nhgc3OT5+euu+5ie3ub7e1tAPb39wG46667ALjzzjvZ39/nrrvu4oFsc7/t7W22t7fZ2dnhhhtuYHt7mxtvvJH77rvv1rNnz95633333fpbv/Vb3/MP//APv81VV1111VVXXXXVVc8PetCDHsRVV1111VVXXXXVVVdcc801D37t137t97rmmmse/Dqv8zrvfd999906TdOD77rrLu666y7uuusu/iXb29s86lGP4oYbbmB7e5vt7W329/fZ39/nhhtu4H77+/tI4u677+bw8BCAe++9F0kcHR1xdHRERBARRAQRQSmFUgqlFGqt1Frpuo6u6+j7nr7v6fuevu/p+56u6+i6jlIKpRQWiwUAy+WS1hqtNaZpYhgGxnFkGAaGYWAYBsZxZBgGpmlimiamaaK1RmuN1hqZSWaSmSwWC2yzsbHBxsYGANdeey222dra4rrrruOB7rrrLm644QYA9vf32d/f58477+Suu+7irrvu4oXZ3t5me3ub7e1tHv3oR3PDDTdw33333foP//APv/0P//APv/Nbv/Vb381VV1111VVXXXXVVfdDD3rQg7jqqquuuuqqq676/+6aa6558Gu/9mu/1zu90zt99v7+Pk984hO5++67ueuuu3h+bPNA29vb3HDDDbz8y78829vb7O/vs729DcDe3h77+/vcddddHB4esr+/zz333IMkJCGJiEASkpBERCCJiCAiiAgiglIKpRRKKdRaqbXSdR1d19H3PX3f0/c9fd/T9z1d11FrpdZKRLCxsQHA0dERmUlrjXEcGceRYRgYhoFxHBmGgWEYGMeRaZqYpolpmmit0VqjtUZmkplkJpmJbTIT29jGNrbJTGyzubmJba6//nquv/56tra2uOGGG7jfXXfdxQ033MD+/j533XUXf/Znf8b+/j7/ku3tbba3t3n0ox/NDTfcwHK5vPUf/uEffvtHf/RHP+e+++67lauuuuqqq6666qr/39CDHvQgrrrqqquuuuqqq/4/e8d3fMfPeqd3eqfP3t/f5y/+4i944hOfyIvq5V7u5XjUox7F9vY2f/7nf87Lv/zLs7e3x+Me9zgA/uzP/gxJRASSkEREIAlJSEISkogIJCGJiEASEUFEEBFEBKUUIoJaK7VWaq10XUfXdXRdR9/39H3PbDaj6zq6rqPrOkoplFLY2NgA4OjoiMxkmiamaWIcR4ZhYBgGhmFgHEeGYWAcR6ZpYhxHWmtM00Rm0lojM8lMMpPMxDaZiW1sY5vMxDa2sY1tbJOZ2MY2m5ub3HDDDdx4441sb29z00038cQnPpFHPepR7O/v8+d//uc88YlP5EWxtbXFDTfcwKMf/WhuuOEGfuu3fuu7f/RHf/Rz7rvvvlu56qqrrrrqqquu+v+JylVXXXXVVVddddX/U9dcc82DP+dzPue3pml68M/93M9x11138a/xFm/xFtxwww38+Z//OY94xCNYrVZ867d+K/v7+0QEEUFE8G9hG0kA2OZ+trmfbQBs89xs8y+xDYBtbPNAtrmfbR7INv+R9vf3ecITnsDjHvc4MpOtrS0e85jHcN111/HkJz+Z13md1+FRj3oUP/uzP8u/5ODggCc96Uk86UlPYnt7m7d8y7d8b4Af/dEf/Zz77rvvVq666qqrrrrqqqv+/6EcP36cq6666qqrrrrqqv+PPumTPumn9vb2jv/Wb/3W8YODAyQhCUlIQhKSkIQkJCEJSbz8y788j3rUo7h48SK33347P/ETP8Edd9zBMAxIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQREUgiIogIIoJSChFBRFBKoZRCKYVSChFBKYWIICKQRN/3AAzDgG0yk8wkM2mtkZm01mitkZlkJplJZpKZ2MY2trGNbWxjGwDb3M82L4ht7mcbANvYZrVacdttt/HEJz6RiODaa6/lzJkzANx11128qIZh4NZbb+XlX/7lX/r1Xu/13voXfuEXvoarrrrqqquuuuqq/38Irrrqqquuuuqqq/6fWiwWD14sFg/m32B7e5v9/X1+4zd+g9/+7d/mv5ptAGzzQLaxjW0AbANgm+dmm/vZBsA2tgGwjW1eENvY5n62+Y906dIl/uZv/oaf+qmfAuDg4ABJSEISkpCEJCQhCUlIQhKSODg4AOAf/uEffvuaa655MFddddVVV1111VX//xBcddVVV1111VVX/T90zTXXPHixWDz4+uuv54YbbkASkpCEJCQhCUlIQhKSkIQk/vIv/5KDgwNe7/Vejwc/+MH8R7DNc7PNi8o2z49tAGxzP9sA2MY2/5Vs86I6fvw4b/M2b8P+/j533XUX/1rb29vccMMNPOpRj3pvrrrqqquuuuqqq/5/ohw/fpyrrrrqqquuuuqq/28ODw93t7a2sP3aL/dyL0ff99x99928qIZh4O677yYieNM3fVNe6qVeivV6zdmzZ5GEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISEUFEEBFEBBFBKYVSCqUUSimUUiilEBFEBKUUJBER9H0PwDAMZCa2yUwyk9YamUlrjdYamUlmkplkJpmJbWxjG9vYxjYAtrmfbV4Q29zPNvezjW22t7d52Zd9Wd7szd6M13zN1+Qf/uEf+NVf/VWGYUASkpCEJCQhCUlIQhL3e7mXezne6I3eiLvuuouf/MmffJ9/+Id/+G2uuuqqq6666qqr/v+hctVVV1111VVXXfX/1G//9m9/z8mTJz+7tcbLvdzL8chHPpInPelJ/OVf/iUviv39ff7yL/+SJz/5yTziEY/gzd7szXj1V3919vb2eNzjHsfBwQF33XUXz802kviPYhvbPJBt7mcbANvczzb3s41tAGzz3Gxjmweyzb+FbZ6f7e1tHv3oR3PjjTdy0003sb+/z5Oe9CSe9KQnsb+/z4tqe3ubRz7ykTzykY8E4OLFi9x55538zu/8zm9z1VVXXXXVVVdd9f8Tlauuuuqqq6666qr/p+655x5+9Vd/lf39fV72ZV+WBz/4wTzykY/kkY98JAcHBzzpSU/i4OCAu+++mxfm4OCAv/qrv+LJT34y29vbXH/99bzkS74k119/PXt7e+zv77O/v89dd93FwcEBd999N/9ZbGOb52ab58c2z802/1m2t7exzSMe8QgArr/+em688UYA9vf3edKTnsRf//Vfc/fdd3M/SdjmBdne3uaRj3wk119/PTfccAP7+/tsb29z8eJFfvRHf5QnPvGJXHXVVVddddVVV/0/RuWqq6666qqrrrrq/6mIuNU2f/mXf8nf//3f87Iv+7I86EEP4iVe4iV48pOfzCMf+Uiuv/569vf3ufvuu7n77rs5ODjg7rvv5vk5ODjg4OCAu+++G4CtrS22t7fZ2tri+uuv53Vf93W53/7+PgcHBxwcHABwzz33cHh4iCSOjo44PDzkX2Ib29zPNg9kG9vczzb3s41tHsg2D2Qb2zyQbV6Yzc1NbLOxscG1114LwNbWFpubm1x//fU80JOe9CTuuece/uqv/oq7776bF0YS99ve3uYRj3gEAI985CPZ3t5mf3+fJz3pSdxwww201vipn/op/vzP/5xpmgDIzFu56qqrrrrqqquu+v8JPehBD+Kqq6666qqrrrrq/6uHPOQhns/n9H1PKYVaKydOnOBBD3oQN998M4997GMBePKTn8zW1hbXX389BwcH7O/vc3BwwF133cXBwQF33303L4qtrS0Atre32dra4vrrrwdge3ub66+/ngc6PDwE4PDwkKOjIySxXC6RxHq9JiKICMZxpNZKrRXbdF1HrZW+76m1IolaKxHBzs4OAHt7e2Qm0zRhm2maGMeRcRyZpolhGCilME0TrTX6vqe1xnw+xzaLxQLbbGxsYJtrrrmG57a/v8/BwQF33303AHfffTf7+/vs7+/zotje3gbgEY94BAA33HAD119/PQD7+/s86UlP4uVe7uW4dOkSly5d4hnPeAa/8zu/Q2uN1hqtNaZpYhgGbrvtNnHVVVddddVVV131/xN60IMexFVXXXXVVVddddX/Vw95yEM8n8/puo5aK7VWIoJSChFBRHDs2DFuuukmbrzxRm688Ua2t7cBePKTn8zW1hbXX389AAcHB+zv73NwcMD+/j4HBwccHBywv7/PwcEBL4qtrS0Atre32dra4n7XX38999va2gLg+uuv57/S3XffDcD+/j4ABwcHAOzv73NwcADA/v4+BwcHvKi2trbY3t5ma2uL7e1tAK6//nquv/567re/v8/dd9/NIx/5SAD29vbY29vj9ttv5/bbb+cZz3gGmUlm0lqjtcY0TWQm0zQxDAO33XabuOqqq6666qqrrvr/CT3oQQ/iqquuuuqqq6666v+rhz3sYe77nq7rqLVSSqGUQkRQSiEikEREIImIYGdnh+3tbXZ2dtje3ub666/n+uuv54Huvvtutre32dra4n4HBwfs7+9zcHAAwP7+PgcHBwAcHBwAsL+/z8HBAf8eW1tb/FsdHBzworDNC7K1tQXA9vY2W1tbbG9vc7/rr78egOuvv54H2t/f5+DggOuvv5777e/vA3DXXXext7fHnXfeye23345tMhPb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q6666qqrrrrqqv8zCK666qqrrrrqqquuusw2z802/xLbvKhs88LY5oFs80C2eW62sc2/xDa2sQ2AbQBs89xsYxvb2MY2tnlutgGwzb+Gbf61bHPVVVddddVVV1111b8awVVXXXXVVVddddVVl0nCNi+Mbf6tbPOisM2Lwja2eW62AbCNbQBs8/zY5n62+ZfYxjYviG2uuuqqq6666qqrrvofheCqq6666qqrrrrqqsumabqVB7DNC2KbB7LNC2Ob/0i2eX5s89xsA2Cb+9nmgWwDYJv/Krb5t7DNC2IbgGmabuWqq6666qqrrrrqKgCCq6666qqrrrrqqqsusw2AbR7INi8K2zw329jmX8s297MNgG1eGNvczzbPj21sA2AbANs8kG1s88LY5l9iG9v8d7DNVVddddVVV1111VWXEVx11VVXXXXVVVdddZltXhjb/EtsA2Ab2/xnsM0D2cY297MNgG1sYxvbPD+2uZ9tHsg2trGNbV4Q2wDY5vmxzVVXXXXVVVddddVV/20Irrrqqquuuuqqq656Fts8P7Z5UdnmP4Jt/iW2eVHZ5n62+deyzQPZ5gWxzYvCNv8ZbHPVVVddddVVV1111WUEV1111VVXXXXVVVddlpnczzb/Etv8V7HNc7PNc7MNgG2eH9vYBsA2ALaxDYBtbPOC2Obfwjb/Hrb512itPYOrrrrqqquuuuqqqwAIrrrqqquuuuqqq666zPYz+B/ONi+IbR7INgC2sc3zY5vnxzb/VWzz72GbB7LNVVddddVVV1111VXPQnDVVVddddVVV1111XOwzf1s89xs8x/JNraxzXOzzfNjmweyzf1scz/b3M8297PNc7PNA9nGNs/NNvezDYBt7meb58c2/1Vsc9VVV1111VVXXXXVZQRXXXXVVVddddVVV102TRO2uZ9t/jPZxjYPZJsXxDbPj23uZxsA2zw/trENgG0AbGMbANs8N9vY5oFs89/JNlddddVVV1111VVXvUgIrrrqqquuuuqqq666LCJu5V/JNv8WtnlBbPNAtnkg29zPNi+IbQBsY5vnxzbPzTb/VrZ5YWzz/Njm38M2V1111VVXXXXVVVc9XwRXXXXVVVddddVVV/2Xss1/BNs8kG0AbHM/29zPNgC2sc1zs839bPPcbPPfwTYviG2en9barVx11VVXXXXVVVddBUBw1VVXXXXV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qquuuuqqqx6I4Kqrrrrqqquuuuqq58s297PNi8I297PNC2Ob/yy2eSDb/HvZ5qqrrrrqqquuuuqq/3UIrrrqqquuuuqqq656DpmJbe5nm38N2/x72OY/m20eyDYvjG3+u9jmRWWbq6666qqrrrrqqqueA8FVV1111VVXXXXVVc/tVv4FtgGwzfNjm/8utrmfbf6nsM1/NklcddVVV1111VVXXfUcCK666qqrrrrqqquueh62sY1t7mcb29jm38s2z49t/rPYBsA2/xq2eVHZxja2+beyzQtimxdmmqZbueqqq6666qqrrrrqgQiuuuqqq6666qqrrvo/wzYvjG0eyDb3s82/h22eH9v8W9nmqquuuuqqq6666qp/F4Krrrrqqquuuuqqq14o29jmudkGwDb/E9jm38s297ONbV4UtvnXsM39bPPcbGObq6666qqrrrrqqqv+3Qiuuuqqq6666qqrrnoOrTVsYxvb/EezzfNjm38r2/xHsY1tXlS2eX5s819tmqZbueqqq6666qqrrrrqgQiuuuqqq6666qqrrnoOEXGrbZ6bbe5nmweyzX8V29jGNraxzfNjGwDb/GexzX83SVx11VVXXXXVVVdd9QIRXHXVVVddddVVV131IrONbe5nm/vZ5l9im38r29jmfwrb/GvZ5j+Sba666qqrrrrqqquueqGoXHXVVVddddVVV131fNkGwDa2eVHY5n6SsM0DSeL5sY0kXhDbSOI/km0AbHPVVVddddVVV1111f9ZBFddddVVV1111VVXPYfM5H62eUFsA2Cb58c2/xLb2OaFsc3/JLaxzb+Gbf4rtNZu5aqrrrrqqquuuuqqByK46qqrrrrqqquuuuo5RMSttnlutrmfbR7INv8atrHN82Mb29jGNv8Wtnkg2/x72cY2/xq2+Y9mm6uuuuqqq6666qqrXmRUrrrqqquuuuqqq656HraxjW1scz/b2EYSALaRBIBtJPHC2AZAEs/NNgCSeEFs86KQhG3uJwnbPDfbANjGNraxjW1sYxvb2Ob5sY1tbGMb29jGNv/RbPPcJGGbq6666qqrrrrqqqteICpXXXXVVVddddVVVz2PWisPZJsXhW0k8UC2uZ8knpttACTx3GzzQJJ4YWxzP0nYRhK2eX5sA2Ab29jm+bGNbWxjG9vY5qqrrrrqqquuuuqq//EIrrrqqquu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mQmAbVprlFKICCKCiEASEYEkJCEJAEm8MOfOnfturrrqqquuuuqqq656URBcddVVV1111VVXXfUisf3btrGNbWxjG9vYxjYAtrHNc7PN/WxjG9vYBsA2trGNbWxjG9vYxja2uZ9tHsg297PNv5YkJCEJSUgiIpBERFBKoZRCKYVSCqUUaq3UWqm1Umul6zpqrdRaqbVSSqGUQimFUgqlFEopRAQRgSQkIQkASTyQJJ6f5XJ5K1ddddVVV1111VVXvSioXHXVVVddddVVV131IpH0O5lJZhIRANjGNgC2sQ2AJGzzgkgCwDbPTRK2kYRtJGEbSdzPNpK4n20k8aKSBIAkJCEJSQBIQhKSkEREEBFEBKUUSinUWqm1Umul1kqtlVortVYiAknYRhIAmUkphYggIogIJBERSEISkgCQxHOTxAOtVqtncNVVV1111VVXXXXVi4LKVVddddVVV1111VUvEkm32sY2trGNbQBsIwnbSMI2knhBbAMgCQDbSALANpKwjSRsI4n72UYS/xkkIQlJSCIiiAgigoiglEIphVIKtVZqrdRaqbVSa6XWSkQAYBsA25RSKKVQSiEiiAgiAklIAkASkgCQhCQAJPFAtjk8PPxtrrrqqquuuuqqq656URBcddVVV1111VVXXfUiiYhbp2n67czENrYBsI1tbANgGwDb2MY2trGNbWxzP9vYBsA2tgGwDYBt/iW2+deQBIAkJCEJSUhCEpKQREQgiYggIiilEBGUUiilUGul1kqtlVortVZqrZRSqLVSSqHWSimFUgqlFCKCiCAikIQkJCGJ+0nihRmG4dZxHG/lqquuuuqqq6666qoXBcFVV1111VVXXXXVVS+yzPxt29jGNraxjW1sYxsA29jmBbGNbe5nm/vZBsA2z802/x6SeH4kASAJSUhCEhFBRBARRASlFEop1FoppVBrpZRCrZVaK6UUaq2UUqi1UkqhlEIphYiglEJEIImIQBKSkIQkXhSXLl36ba666qqrrrrqqquuelFRueqqq6666qqrrrrqRSbpdzIT29jGNrYBsI1tbAMgCds8P5IAsA2AJGwDIAnbSOLfShLPTRL3k8T9JAEgCUlIQhIRQUQgiYiglEIphVIKpRRKKZRSqLVSSqGUQimFiAAgM7FNKYWIICKICCKCiEASknggSfxLLl68+DtcddVVV1111VVXXfWionLVVVddddVVV1111YtM0q2ZSWaSmUQEtrGNJABsIwnb3E8S97PN/SQBYBtJ2AZAEv/ZJCEJAElIAkASkpCEJCKCiCAiiAhKKZRSKKVQSqGUQimFUgqlFCICAEkAZCYRQUQgCUlIQhKSkIQkJHE/STw/trl48eJ3c9VVV1111VVXXXXVi4rgqquuuuqqq6666qoXWUTcOk3Tb2cmtrENgG1sYxvb2MY297ONbWzzQLaxDYBtXhjb/FtJ4n6SeCBJAEhCEgCSkEREEBFEBBFBKYVSCqUUSimUUiilUEqhlEIphYggIogIIoKIICKICCKCiEASkpCEJB5IEi/Ifffd9z1cddVVV1111VVXXfWvQXDVVVddddVVV1111b+K7e/JTGyTmWQmtrGNbQBsA2Ab29jGNraxjW1sA2Ab2wDY5vmxzb+WJCQhiecmCQBJAEgCQBKSkIQkJBERRAQRQUQQEZRSKKVQSqGUQimFiCAiiAgigoggIogIIoKIQBKSkIQk7ieJF8WlS5d+m6uuuuqqq6666qqr/jUIrrrqqquuuuqqq676V4mI38pMMhPb2MY2trGNbWxjG9vY5rnZxja2uZ9tAGxjm/vZ5gWxzb+GJO4niQeShCQkERFEBBGBJCKCiKCUQimFiKCUQimFiCAiiAgigohAEhGBJCQhCUlIQhKSAJDEA0niBbHNpUuXfpurrrrqqquuuuqqq/41CK666qqrrrrqqquu+leJiGdM0/TbmYltbGMb29jGNgC2uZ9tbGMb29zPNraxzXOzjW3+s0lCEpKQhCQkIQlJRAQRQUQQEUQEEUFEEBFEBBFBRCAJSUQEkpCEJCQhCUn8W917773fPQzDrVx11VVXXXXVVVdd9a9BcNVVV1111VVXXXXVv8XnZCaZiW1sYxvb2MY2trGNbWxjG9vYxja2+e8giftJAkAS95OEJCQhCUlIIiKICCKCiCAiiAgiAklIIiKICCQhCUlIQhKSkIQkJCEJAEnczzbPj20uXrz4O1x11VVXXXXVVVdd9a9F5aqrrrrqqquuuuqqfzVJt07TRCmFzEQSkrCNbWwDYJv7SeKBbHM/Sfxnk8T9JCEJAEkASEISkpCEJCQREUQEEYEkIoKIICKQhCQiAklIQhIAkpCEJCTxgtjmgWzz/Jw9e/a7ueqqq6666qqrrrrqX4vgqquuuuqqq6666qp/tYi4tbX22ZlJZmIb29jGNrYBsI1tAGxjG9vY5oFs899JEgCSkASAJCICSUhCEhFBRBARSCIiiAgkIYkXlW1scz/bPJBt7mebe+6557u56qqrrrrqqquuuurfguCqq6666qqrrrrqqn+TiPie1hqZSWZiG9vYxja2sQ2AbWxjG9vYxjb/VSTx/EhCEgCSuJ8kJCEJSUQEEYEkJCGJiEAS95OEJAAk8UC2AbCNbe5nm/vZ5gV52tOe9jlcddVVV1111VVXXfVvQXDVVVddddVVV1111b9JRNw6juNvZya2yUxsYxvb2MY2trGNbWxjG9sA2OZ+tvnPJon7SeJ+kgCQhCQkIQlJSEISkpCEJCQBIAlJSOJ+kngg2wDYBsA2trENgG1sA2Cb+9kG4O677/7uYRhu5aqrrrrqqquuuuqqfwuCq6666qqrrrrqqqv+zSLifVprtNbITDIT29jGNraxjW1s8x/JNv8WkpAEgCQkASAJAElIQhIAkpCEJCQhCUlI4vmxjW0AbANgG9tkJraxjW1sYxsA2wDYxjYAtrn99tu/h6uuuuqqq6666qqr/q0Irrrqqquuuuqqq676N4uIW8dx/O7MJDOxjW1sYxvb2MY2ALaxzQtim/9oknhRSeKBJCGJ+0niRWUbANvYxja2sY1tbGMb29gGwDYPdOedd373/v7+b3PVVVddddVVV1111b8VwVVXXXXVVVddddVV/y4R8TmtNTKTzCQzyUwyE9vYxja2sc39bANgmweyzX8GSbwgkpAEgCQkIQlJAEhCEi+IbWxjG9vYxjaZSWaSmWQmmYltMpPMJDOxjW1sA2Ab29jmKU95yudw1VVXXXXVVVddddW/B8FVV1111VVXXXXVVf8uEXHrOI6f3VojM8lMbGMb29jGNrb5n0QSAJK4nySemyReENvYxja2sY1tMpPMJDPJTDKTzCQzaa2RmdjGNraxjW1sYxuAJz/5yZ+zXq9v5aqrrrrqqquuuuqqfw+Cq6666qqrrrrqqqv+3SLiu6dpurW1RmaSmdjGNpmJbWxjG9vY5oFs80C2eWFs86KQxANJAkASAJJ4bpKQhCReENvYxja2sY1tMpPMJDPJTDKTzCQzaa2RmWQmmUlmkpnYxja2sQ3A0dHRrU95ylM+m6uuuuqqq6666qqr/r0Irrrqqquuuuqqq676d4uIZ2Tm+0zTRGaSmWQmmYltbPP82OYFsc1/Bkk8N0lI4kVhGwDb2MY2tslMMpPMJDPJTDKT1hqtNTKT1hqZSWaSmWQmmUlmYhvb2OYv/uIv3oerrrrqqquuuuqqq/4jEFx11VVXXXXVVVdd9R+ilPLb0zR99jRNZCaZiW1s829lm+dmmxeFJO4niReFJF4Q29jGNplJZpKZZCaZSWaSmWQmmUlrjdYarTVaa0zTRGuN1hqtNTKTzCQzsU1mYptnPOMZ3727u/vbXHXVVVddddVVV131H4Hgqquuuuqqq6666qr/MJK+Z5qm326tkZlkJraxjW0eyDYPZJvnxza2sY1t/qvZxja2sY1tbGObzKS1RmuNzKS1RmuN1hqtNaZpYpompmmitUZrjdYamUlrjcwkM8lMbHNwcHDrX/3VX70PV1111VVXXXXVVVf9RyG46qqrrrrqqquuuuo/TETcCrzPNE201rDNA9nGNrb57yYJAEn8S2xjm8wkM8lMWmtkJplJa43WGq01pmlimiamaaK1xjRNTNPENE1M08Q0TUzTRGuNzCQzyUwykz/8wz98H6666qqrrrrqqquu+o9EcNVVV1111VVXXXXVfyhJt47j+D6ZiW1sYxvbPD+2+Y8miReFJF4Q29jGNraxjW0yk8wkM2mt0VqjtcY0TbTWaK0xTRPTNDGOI9M0MU0T0zQxTRPTNNFao7VGa43MJDP5zd/8zdfZ29v7ba666qqrrrrqqquu+o9E5aqrrrrqqquuuuqq/3C11u+epulBtdbPts2LyjaS+M8giReVbe5nG9vYJjPJTFprtNZorSEJ20QEkshMWmtM08Q4jozjyDiOjOPINE1M08Q0TbTWaK3RWuNv/uZvPufcuXO/zVVXXXXVVVddddVV/9GoXHXVVVddddVVV131n0LSd4/jSK31s21jG9s8kG0kYRtJ/GeQxL+FbWxjG9tkJplJZtJaY5omIgIA20QEAJlJa41pmhjHkXEcGceRcRwZx5FpmmitMU0TrTXuuuuu3/6Hf/iHz+aqq6666qqrrrrqqv8MBFddddVVV1111VVX/aew/YzW2vfYxjb3s41tbPP82ObfQxL/Ekk8P7axjW1sYxvbZCaZSWuN1hqtNVprTNPENE1M08Q4jozjyDiOjOPIMAwMw8AwDAzDwDiOjOPINE2M48g0TRweHvJ7v/d778NVV1111VVXXXXVVf9ZqFx11VVXXXXVVVdd9Z/GNpIAsI1t/jtJ4l/DNplJZpKZZCatNaZpIiKQhG1aa0QEtslMWmuM48gwDAzDwDAMDMPAOI4Mw8A4jhweHnLu3Dmuuuqqq6666qqrrvpPReWqq6666qqrrrrqqv9UkiilAGAb2zyQbSTxH0ES/162sY1tbGObzKS1RmuNaZqICCICgMwkIpCEbTKTaZqYpon1es16vWYYBoZhYBgGxnHk4OCAc+fOcdVVV1111VVXXXXVfzoqV1111VVXXXXVVVf9p5NEKYX72cY2tpEEgG0kAWAbSfxnkMQD2QbANrYBsI1tMpPMJDPJTFprtNaYpglJ2CYzkQSAbTKTaZoYx5FxHBmGgfV6zTAMDMPA/v4+58+fRxIAtrnqqquuuuqqq6666j8Nlauuuuqqq6666qqr/tPY5n6SiAj+s0jiX8s2ALa5n21sk5nYJjPJTFprtNaYpglJAGQmpRQkAWCb1hrTNDGOI8MwMAwD6/Wa9XrN2bNnOTg44Kqrrrrqqquuuuqq/zJUrrrqqquuuuqqq676LyOJiKC1hm3+s0niRWUb29jGNrbJTDKTzKS1xjRNSALANplJaw1J2CYzyUymaWIcR4ZhYL1es16vufPOOxnHEQBJXHXVVVddddVVV131X4LKVVddddVVV1111VX/aSLiVts8t67rkERmYhvbSMI2kvjXksR/BNvYxja2yUwyk9YaEYEkJAFgm9YaEQGAbTKT1hrTNDGOI+v1muVyyR133EEpBUk8t2EYbuWqq6666qqrrrrqqv8sVK666qqrrrrqqquu+m8hiVortvm3kASAJP41bGObB7KNbQBsY5vMJDPJTFprRASSkIRtWmtEBJIAsE1rjdYa4zgyTRMXL17k6OiIvu9prfHcJHHVVVddddVVV1111X8qKlddddVVV1111VVX/bcqpQCQmUjifraRxPMjCQBJvCgk8dxsA2Cb+9nGNraxTWbSWkMSkgCwTWYSEUjifplJa43WGuv1mvvuu4+u63hukrjqqquuuuqqq6666r8Mlauuuuqqq6666qqr/lNJwjYvjCRKKWQm/xJJvCgk8S+xDYBtbGMb22QmmYkkMpPWGpIAsE1mIglJAGQmmck0TVy8eJH5fM5isWCaJiQBIIkHksRVV1111VVXXXXVVf/pqFx11VVXXXXVVVdd9V/CNrZ5QSRRawVAEv9VbANgG9vYxjaZiSRaa9zPNplJRHA/22QmEUFEsL29zTiOSEISAJJ4fiRx1VVXXXXVVVddddV/KipXXXXVVVddddVVV/2PIglJPD+SeFFI4l/DNgC2sY1tMhNJSOJ+tpGEJAAigtlsxsbGBsMwMI4jkpDE8yMJAElcddVVV1111VVXXfVfgspVV1111VVXXXXVVf+ppmm6teu6B/OvJAlJAGQmtVZeFJL4t7CNbWyTmQBIAsA2tpEEQNd1TNPEwx/+cMZxZBxHJPGvtVwub+Wqq6666qqrrrrqqv9MVK666qqrrrrqqquu+m9lG0m8IJKQhG1sExEASOKBJCGJ5yaJ58c2trGNbWxjm8zkgWyTmcxmM06ePMnx48fZ2NggM5mmCUlIQhKSkASAJAAkASAJAElcddVVV1111VVXXfVfhspVV1111VVXXXXVVf8tbCOJf4ltJAEgCdsAZCaSqLUiiX8P29jGNrbJTGqtHD9+nKOjIx7zmMdQa6WUgiRsAyAJSTw3SQBIAkASV1111VVXXXXVVVf9t6By1VVXXXXVVVddddV/KknY5n62+Y8iCdtIAsA2pRQkIQlJSEISknggSUhCErVWZrMZEcFsNuPEiRPMZjP6vqfveyQhCUlIAkASAJKQhCQkIYkXhSSuuuqqq6666qqrrvpPR+Wqq6666qqrrrrqqv9ytpHEv8Q2knhRSCIikEREEBFEBJKICCKCiKCUQkRQSqGUQq2VWiu1Vrquo+97JPFAkpAEgCQAJCEJAEk8kCQk8dwkASAJAElcddVVV1111VVXXfWfiuCqq6666qqrrrrqqv9UtvmX2OZFYZv/KpKQhCTuJwkASUhCEpIAkIQkJHE/SUjiqquuuuqqq6666qr/NgRXXXXVVVddddVVV/2nysxb+TewzQtjm3+JbV5UkpDE8yMJSUhCEpKQhCQkIQlJvCCSkMRzWy6Xt3LVVVddddVVV1111X8mKlddddVVV1111VVX/aeyDYBtXhjbSOK/myQkASAJSUhCEpKQxP0kIQlJAEhCEpKQxPMjiauuuuqqq6666qqr/ssQXHXVVVddddVVV131X8Y2L4xtbGOb52ab+9nmP5skACQBIAlJSAJAEg8kiauuuuqqq6666qqr/sehctVVV1111VVXXXXVfxvbSOLfyjb/GpJ4UUgCQBIAkrifJAAkIQlJSEISkpCEJAAkIYn7SeJ+krjqqquuuuqqq6666j8dlauuuuqqq6666qqr/k+yjSReGEk8kCQkASAJAElIQhKSkASAJCQhCUk8N0ncTxIPJAkASVx11VVXXXXVVVdd9Z+K4Kqrrrrqqquuuuqq/3S2+fewzQtim38tSTyQJJ4fSdxPEpIAkIQkJCEJAElIQhLPjySuuuqqq6666qqrrvovR3DVVVddddVVV1111X8q2/xHss1zs80D2eZfIgkASQBI4n6SkASAJCQhCUlIQhKSkASAJAAkASAJAElI4oEkcb/lcnkrV1111VVXXXXVVVf9ZyK46qqrrrrqqquuuuo/le1beT5sA2Cb/0i2+Y8iCUlIAkASkpAEgCQkIQlJPJAkrrrqqquuuuqqq676b0dw1VVXXXXVVVddddV/Kdv8a9jmRWEb2/x7SEIS95PE/SQBIAlJSAJAEpKQhCQkIYkHkgSAJK666qqrrrrqqquu+i9FcNVVV1111VVXXXXVfyrbANjmfrb5n0wSkgCQhCQkIQlJAEhCEpJ4fiQhiftJ4n6SkMRVV1111VVXXXXVVf/pqFx11VVXXXXVVVdd9b+GbSQBYJv/bJKQhCQkIQlJAEhCEpKQhCQkIQlJ3E8SV1111VVXXXXVVVf9tyG46qqrrrrqqquuuuo/nW1eGNs8P7b5ryAJSQBIQhKSeG6SkIQkJCEJSUhCEi8KSVx11VVXXXXVVVdd9V+GylVXXXXVVVddddVV/6lscz/b/E8miQeShCQkIQlJAEhCEpIAkASAJCQhCUlIAkASV1111VVXXXXVVVf9tyC46qqrrrrqqquuuuo/2628CGzzQLb57ySJ+0lCEpKQhCQkIQlJAEhCEs9NEgCSkMQDLZfLW7nqqquuuuqqq6666j8Tlauuuuqqq6666qqr/lPZ5kVlm/tJ4oFsIwkA20jCNv/RJCEJAElIAkASAJIAkIQkJCEJSQBI4l8iiauuuuqqq6666qqr/ktQueqqq6666qqrrrrqv41tJPHfRRKSeH4kASAJSQBIQhIAkgCQhCQAJCEJSUhCEi+IJK666qqrrrrqqquu+k9H5aqrrrrqqquuuuqqqwBJPDdJAEhCEpKQxP0kIQlJSOIFkcT9JHHVVVddddVVV1111X8ZKlddddVVV1111VVX/aeyjW1s829lG0k8P7b5jyIJAElIAkASkpCEJCQBIAlJAEhCEpKQhCQkASCJ+0nigWxz1VVXXXXVVVddddV/KoKrrrrqqquuuuqqq/5T2eaBbPPvYZv/aJK4nyTuJ4n7SUIS95OEJCQBIAlJPJAk7ieJq6666qqrrrrqqqv+y1G56qqrrrrqqquuuuo/laRn8HzYRhL/00lCEpIAkASAJCQhCUncTxKSeGEkAbBarZ7BVVddddVVV1111VX/mQiuuuqqq6666qqrrvpPZZvnZpv72eaFsc3zY5v/LJKQhCQkIQkASUhCEpKQhCQkIQlJ3E8SAJKQxHOThCSuuuqqq6666qqrrvpPReWqq6666qqrrrrqqv8ytvnPYJv/CJKQxPMjCUlIAkASkpCEJCQhCUlIAkASz00S97PNVVddddVVV1111VX/qahcddVVV1111VVXXfWfyjb/UWwjiX8PSQBI4oEkcT9JSEISkpCEJCQhCQBJSEISz48kHkgSkngg21x11VVXXXXVVVdd9Z+K4Kqrrrrqqquuuuqq/1S2+ZfY5vmxzX82SfxLJCEJSUhCEpIAkIQkJCEJSVx11VVXXXXVVVdd9T8Glauuuuqqq6666qqr/tPZ5j+bbV4YSdxPEg8kiftJAkASkpDEA0kCQBKSAJCEJO4nCQBJSEISDySJq6666qqrrrrqqqv+SxBcddVVV1111VVXXfWfKiJuBbDNC2ObB7LNC2IbANv8e0jigSQBIAkASUhCEpKQhCQkASAJSUhCEpKQBIAknh9JXHXVVVddddVVV131X4bgqquuuuqqq6666qr/NrZ5fmzz3Gzz30USkpDE/SQhCUlIAkASkpDEc5OEJO4nidVqdStXXXXVVVddddVVV/1nonLVVVddddVVV1111X8q27yobAMgif9qknggSUhCEveThCQAJCEJSQBI4oEkIQlJXHXVVVddddVVV13134bKVVddddVVV1111VX/6WxzP9v8Z7HNv5ckJPFAkpCEJCQBIAlJSEISkpCEJCTxQJK46qqrrrrqqquuuuq/BcFVV1111VVXXXXVVf+pbPPvZZv72eY/iyTuJwlJSEISkpCEJCQhCUlIQhKSkMSLQhIAmclVV1111VVXXXXVVf+pqFx11VVXXXXVVVdd9d/CNpL497LNfyZJAEgCQBIAkpCEJCRxP0lIQhKSkASAJCQhiauuuuqqq6666qqr/stQueqqq6666qqrrrrqv4xtAGwjiX8P2/xHkcT9JCEJSUgCQBIAkpAEgCQkASAJSUji+ZHE87Ner2/lqquuuuqqq6666qr/TARXXXXVVVddddVVV/2niohbeSFs88LY5l/DNv8akgCQxPMjCUlIQhIAkpAEgCQkIQlJSEISknhhJHHVVVddddVVV1111X86KlddddVVV1111VVX/aezjW3+p5MEgCQAJHE/SUhCEpKQhCQkASAJAEncTxKSuOqqq6666qqrrrrqvw3BVVddddVVV1111VX/a9jmv4okACQhCUkASOJ+kpCEJAAkASAJSTyQJAAkIYmrrrrqqquuuuqqq/5LULnqqquuuuqqq6666j+dJP4tbCOJ/wySeH4kcT9JSEISAJKQBIAkJCEJSUhCEpK4nyQAJAEgiQeyzVVXXXXVVVddddVV/6kIrrrqqquuuuqqq676T2Ub27wwtvnXsA2AbQBs828hiedHEpJ4IElIQhKSkIQkJCEJSdxPElddddVVV1111VVX/Y9AcNVVV1111VVXXXXV/0i2+e8mCUlIQhKSAJCEJCQhCUlIQhKSAJAEgCSeH0lcddVVV1111VVXXfWfjuCqq6666qqrrrrqqv9UEXErL4Bt7meb+9nmudnmRWWbfw1JSEISkgCQxP0kIQlJSEISkpDEA0kCQBIAkgCQhCSe23q9vpWrrrrqqquuuuqqq/4zUbnqqquuuuqqq6666j+dbQBsY5sXxDYAkvjvJAkASUjigSQhCUlIQhKSkIQkJAEgiecmCUlI4qqrrrrqqquuuuqq/xJUrrrqqquuuuqqq676f00SL4wkJCEJSUgCQBKSkIQkJAEgCUncTxJXXXXVVVddddVVV/23Ibjqqquuuuqqq6666r+Ebf6tbHM/2/xbSQJAEv8SSUgCQBKSkIQkJHE/SUhCEpJ4IEncTxIPJImrrrrqqquuuuqqq/7TEVx11VVXXXXVVVdd9Z9OEg9kG9v8R7LNv5ckJCGJ+0nifpIAkIQkJCEJSQBIQhKSkMT9JPHcJHHVVVddddVVV1111X86KlddddVVV1111VVX/a9kGwDb/EeQxANJQhIAkpAEgCQkIQlJSEISknhukpDE/SQhCUlcddVVV1111VVXXfVfguCqq6666qqrrrrqqv90rbVbeQFs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8A//8Nv33Xffrb/927/9Pffdd9+tXHXVVVddddVVV131vwl60IMexFVXXXXVVVddddVV/7tdc801DwZ4sRd7sdcG/GIv9mKvfc011zwY4MyZMw/mma655poHA9x333238kxnz569FeC+++679b777rv17Nmzz7jvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/+3Qgx70IK666qqrrrrqqquuuuqqq6666qqrrrrqqv+TqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8IILHDLogO8lsAAAAASUVORK5CYII=) @@ -136,11 +170,13 @@ sweepSketch = startSketchOn(XY) ```kcl // Rotate an imported model. - import "tests/inputs/cube.sldprt" as cube cube - |> rotate(axis = [0, 0, 1.0], angle = 9) + |> rotate( + axis = [0, 0, 1.0], + angle = 9, + ) ``` ![Rendered example of rotate 3](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEG7UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqf4RrrrnmwTyXM2fOPJhnuuaaax7MA5w5c+ZBPMA111zzYB7gmmuueTAPcN99991633333fqjP/qjn8NVV1111VVXXfX/BXrQgx7EVVddddVVV1111VVXXXXFNddc82Cey5kzZx7MM11zzTUP5gHOnDnzIB7gmmuueTAPcM011zyYBzhz5syDeaZrrrnmwfw3+Id/+Iff/vqv//r3ue+++27lqquuuuqqq676vw496EEP4qqrrrrqqquuuuqqq/4nueaaax7MA5w5c+bBPMA111zzYB7gzJkzD+IBrrnmmgfzANdcc82DeYAzZ848mGe65pprHsz/EBcvXuS5XbhwgftdvHiRB7pw4QIPdPHiRR7o4sWLPNBDH/pQ3vAN3xCA++6779bf+q3f+u4f/dEf/Ryuuuqqq6666qr/y9CDHvQgrrrqqquuuuqqq6666rldc801D+YBzpw582Ae4JprrnkwD3DmzJkH8QDXXHPNg3mAa6655sE8wJkzZx7MM11zzTUP5n+Iixcv8twuXLjA/S5evMgDXbx4kQe6ePEiD3ThwgUe6OLFi9zv4sWL/FexDcCJEyd4+Zd/ed7wDd8QgB/5kR/57B/90R/9HK666qqrrrrqqv+r0IMe9CCuuuqqq6666qqrrvqf6ZprrnkwD3DmzJkH8wDXXHPNg3mmM2fOPIjncs011zyYZ7rmmmsezHM5c+bMg3mma6655sH8D3Hx4kUe6MKFCzzQxYsXeaCLFy/yQBcvXuSBLly4wANdvHiR+128eJH/j97gDd6AN3iDNwDgvvvuu/W3fuu3vvtHf/RHP4errrrqqquuuur/GvSgBz2Iq6666qqrrrrqqqtesGuuuebBPMCZM2cezANcc801D+aZzpw58yCeyzXXXPNgnumaa655MA9w5syZB/MA11xzzYP5H+LixYs80MWLF3mgixcvYpv7Xbx4kQe6ePEiD3ThwgUe6OLFi9zv4sWLXPVf78SJE7zjO74jD3vYwwD4kR/5kc/+0R/90c/hqquuuuqqq676vwQ96EEP4qqrrrrqqquuuup/umuuuebBPMCZM2cezANcc801D+aZzpw58yCeyzXXXPNgnumaa655MA9w5syZB/MA11xzzYP5H+LixYs80MWLF3mgixcvcr8LFy7w3C5evMj9Ll68yHO7ePEi97t48SL/19nmqud04sQJXv7lX543eIM3AOC+++679eu//uvf5x/+4R9+m6uuuuqqq6666v8C9KAHPYirrrrqqquuuuqqF8U111zzYB7gzJkzD+YBrrnmmgfzTGfOnHkQz+Waa655MM90zTXXPJgHOHPmzIN5gGuuuebB/A9x8eJFHujixYs80MWLF7nfhQsXeG4XL17kfhcvXuS5Xbx4kftdvHiRq/5vs83/RCdOnOCDP/iDOXHiBAA/8iM/8tk/+qM/+jlcddVVV1111VX/26EHPehBXHXVVVddddVV/3tcc801D+YBzpw582Ae4Jprrnkwz3TmzJkH8VyuueaaB/NM11xzzYN5gDNnzjyYZ7rmmmsezP8gFy9e5IEuXrzIA128eJH7Xbhwged28eJF7nfx4kUe6OLFizzQxYsXueqq/wts869x4sQJXv7lX543eIM3AOC+++679eu//uvf5x/+4R9+m6uuuuqqq6666n8r9KAHPYirrrrqqquuuupFd8011zyY53LmzJkH80zXXHPNg3mAM2fOPIjncs011zyYZ7rmmmsezAOcOXPmwTzTNddc82D+B7l4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uuqqq6666qr/cWwjif8qtpHE/0a2kcS/xDaS+PeyjSSuuuq/gm0kcdVziggkERFEBAARQUQgCUm8KO67775bAc6ePXvrfffdd+t9991369mzZ59x33333Qr4H/7hH36Hq6666qqrrvrfj8pVV1111VVXXfUf7uzZs7cCbG1t8W9lG0n8a9lGEv/ZbCOJF5VtJPGiso0krvrPYRtJ/EezjST+tWwjif9utpHE/wa2kcT/BLaRxH+EiKCUQimFiEAStVYAaq28qO67775bAc6ePXvr3//93/82wNmzZ59x3333Pf3s2bPPuO+++27lqquuuuqqq/5/oHLVVVddddVVV/2Hu++++24F2Nra4n8L20jiqv+5bCOJfw3bSOKq/z62kcT/draRxL9VKQWAWiu1ViICSXRdhyS6ruNFdd99990K8A//8A+/fd99990KcPbs2Vvvu+++Z5w9e/bW++6771auuuqqq6666qr7Ubnqqquuuuqqq/7D3XfffbcCbG9vYxtJ/FvYRhL/WraRxH8220jiv5ttJPEfwTaS+O9iG0n8X2IbSVz1f1etFUnUWpnNZkiilEKtlVorpRReVPfdd9+tZ8+evfW+++679b777rsV4OzZs8+47777bv2Hf/iH3+aqq6666qqrrvrXonLVVVddddVVV/2ns40k/qezjST+s9hGEi8q20jiP4ptJPGfzTaS+N/INpL4v8Y2kvifyDaS+M9kG0nYRhK2kYRtJPHC1FqRRNd1LBYLALquo9ZKrZVaKy+K++6771aAs2fP3nrffffdet99990K8A//8A+/A/AP//APv81VV1111VVXXfWfgcpVV1111VVXXfUf7uzZs88A2Nra4t/LNpL417KNJP6z2UYS/5/YRhL/VraRxH8k20jiqn8920jifxLbSOL5sY0kXhS2kcQL0nUdfd/TdR1d1yGJruvouo5aK13X8aK47777bgU4e/bsrffdd9+t9913361nz559xn333XcrwD/8wz/8NlddddVVV1111X8XKlddddVVV1111X+K++6779ZrrrnmwVtbWxwcHGAbSfxb2EYS/1q2kcS/hm0k8Z/FNpK46n8/20jiqhedbSTxX6Hve7quo+97+r4HYHNzE4DNzU1eVPfdd9+tAGfPnr317//+738b4OzZs8+47777br3vvvuefvbs2Wdw1VVXXXXVVVf9T0blqquuuuqqq676T3H27Nlbr7nmmgdvbW1xcHDAVf+5bCOJq676v67veyTR9z2z2Yy+7wHY2toCYGtrixfVfffddyvAP/zDP/z2fffddyvA2bNnn3Hfffc9/ezZs8+47777buWqq6666qqrrvrfjspVV1111VVXXfWfant7m3vuuQcA20ji38I2kvjXso0k/jVsI4kXlW0k8Z/BNpL4j2IbSbwwtpHEVf95bCOJfw3bSOJ+tpHEfzfbSOI/wmw2A6Dve3Z2dgCYzWb0fc9sNqPve15U9913361nz5699b777rv1vvvuuxXg7Nmzt953333P+Id/+Iff5qqrrrrqqquu+v+CylVXXXXVVVdd9Z/i7//+73/7xV7sxV57a2uLB7KNJP4/s40krvrfwzaSuOqFs40knp/ZbAbAfD5nZ2cHgNlsxmw2YzabMZvNeFHcd999twKcPXv21vvuu+/W++6771aAf/iHf/gdgH/4h3/4ba666qqrrrrqqquejcpVV1111VVXXfW/hm0k8a9lG0n8Z7KNJP6/sI0kXhDbSOLfwjaSeH5sI4mrnpdtJPGfxTaSALCNJO43m82Yz+fMZjPm8zkA8/mc2WzGfD5nNpvxorjvvvtuBTh79uyt991336333XffrWfPnn3GfffddyvAP/zDP/w2V1111VVXXXXVVf86VK666qqrrrrqqv8UZ8+efQbAddddx3OzjST+J7ONJP4nsI0k/iW2kcRV/zfYRhL/GWwjiRfFfD5nPp8zn8+Zz+cAHDt2DEkcO3aMF9V99913K8DZs2dv/fu///vfBjh79uwz7rvvvlvPnj1763333XcrV1111VVXXXXVVf/xqFx11VVXXXXVVf8p7rvvvlt5IWwjiX8t20jifzvbSOL/K9tI4r+CbSTx3Gwjif+v5vM5APP5nMViwXw+B+DEiRMAHD9+nBfVfffddyvAP/zDP/z2fffddyvA2bNnn3Hffffdet999z397Nmzz+Cqq6666qqrrrrqvweVq6666qqrrrrqP8XZs2dvBdje3uZ/AttI4l/DNpJ4UdlGEv/T2UYSL4xtJHHV/06LxQKAxWLBiRMnAFgsFszncxaLBfP5nBfVfffdd+vZs2dvve+++2697777bgU4e/bsM+67776n/8M//MPvcNVVV1111VVXXfU/G5Wrrrrqqquuuuq/jW0k8a9lG0n8f2IbSVz1gtlGEv/dbCOJ/yyLxQKAkydPslgsAFgsFszncxaLBYvFghfFfffddyvA2bNnb73vvvtuve+++24F+Id/+IffBvQP//APv81VV1111VVXXXXV/35Urrrqqquuuuqq/xT33XffrQBbW1v8Z7CNJP41bCOJ/ylsI4n/SLaRxFX/draRxH8122xsbLBYLFgsFiwWCySxWCxYLBYsFgsWiwUvivvuu+9WgLNnz95633333Xrffffdevbs2Vvvu+++ZwD8wz/8w29z1VVXXXXVVVdd9f8Dlauuuuqqq6666j/Nfffdd+s111zz4Ouuu4577rmH58c2kvifyjaSeFHZRhL/H9hGEi+IbSRx1RWLxYKNjQ0WiwWLxQJJnDx5EoBTp07xorrvvvtuBTh79uytf//3f//bAGfPnn3Gfffdd+vZs2dvve+++27lqquuuuqqq6666qr7Ubnqqquuuuqqq/7TnD179tZrrrnmwfwLbCOJfy3bSOJfwzaS+P/ONpK46t9vY2MDgMViwcbGBovFAkmcOnUKgFOnTvGiuu+++24F+Id/+Iffvu+++24FOHv27DPuu+++W8+ePXvrfffddytXXXXVVVddddVVV/1rULnqqquuuuqqq/7T3Hfffbe+2Iu9GNvb29xzzz38b2UbSfxnsI0kXhS2kcR/FdtI4r+DbSTx321jYwOAjY0NTp8+DcDGxgYbGxssFgs2NjZ4Ud133323nj179tb77rvv1vvuu+9WgLNnzz7jvvvuu/Uf/uEffpurrrrqqquuuuqqq/4zULnqqquuuuqqq/7T3HfffbcCbG1t8S+xjST+tWwjiX8N20jiP4ttJPHfxTaS+J/ONpL477KxsYEkTp8+zcbGBgAbGxtsbGywsbHBxsYGL4r77rvvVoCzZ8/eet99991633333QrwD//wD78D+B/+4R9+h6uuuuqqq6666qqr/rtQueqqq6666qqrrrrqfxXbSOKF2djYYGNjg83NTTY2NgDY3NxkY2ODjY0NNjY2eFHcd999twKcPXv21vvuu+/W++6779azZ88+47777ns6oH/4h3/4ba666qqrrrrqqquu+p+MylVXXXXVVVdd9Z/mH/7hH34H4LrrruNFYRtJ/GvZRhL/GraRxIvKNpK46r/fxsYGW1tbbGxssLGxAcCZM2cAOHPmDC+q++6771aAs2fP3vr3f//3vw1w9uzZW++7775nnD179tb77rvvVq666qqrrrrqqquu+t+OylVXXXXVVVddddV/AttI4kVhG0m8KGwjif8ItpHEv4dtJPEfYXNzE4CNjQ02NzfZ3NwE4MyZMwCcOXOGF9V9991369mzZ2+97777br3vvvtuBTh79uwz7rvvvlvPnj1763333XcrV1111VVXXXXVVVf9f0Dlqquuuuqqq676T3P27NlbAba3t3lR2UYS/1q2kcR/JttI4n8D20jiv5ttJLG5uQnAxsYG11xzDQCbm5tsbm6ysbHB5uYmL6r77rvv1rNnz95633333XrffffdCnD27Nln3Hfffbf+wz/8w29z1VVXXXXVVVddddVVz0blqquuuuqqq676f8s2krjqBbONJF6Yzc1NAK655ho2NjYA2NzcZGtri42NDTY3N3lR3HfffbcCnD179tb77rvv1vvuu+9WgH/4h3/4HYB/+Id/+G2uuuqqq6666qqrrrrqX4fKVVddddVVV131n+a+++67FWBra4utrS0ODg54UdhGEv/b2UYSLwrbSOJ/ms3NTba2ttjc3GRzcxOAzc1NNjc32dzcZHNzkxfFfffddyvA2bNnb73vvvtuve+++249e/bsM+67775bAf/DP/zD73DVVVddddVVV1111VX/8ahcddVVV1111VX/qf7hH/7ht1/sxV7stbe3tzk4OOA/k20k8a9hG0m8qGwjif9OtpHEv9fm5iZbW1tsbm6yubkJwLXXXgvANddcw4vqvvvuuxXg7Nmzt/793//9bwOcPXv2Gffdd9/Tz549+4z77rvvVq666qqrrrrqqquuuuq/B5Wrrrrqqquuuup/JNtI4qp/vc3NTQC2trbY2tpic3MTgGuuuQaAa6+9lhfVfffdd+vZs2dvve+++2697777bgU4e/bsrffdd98zzp49e+t99913K1ddddVVV1111VVXXfU/F5Wrrrrqqquuuuo/1X333Xfri73Yi7G1tcV/BdtI4l/DNpL4z2AbSfxH2dzcBGB7e5trrrkGgK2tLTY3N9na2mJzc5MX1X333Xfr2bNnb73vvvtuve+++24FOHv27DPuu+++W//hH/7ht7nqqquuuuqqq6666qr//ahcddVVV1111VX/qe67775bAba2tvjXso0k/qexjST+o21ubgJw7bXXsrW1BcDm5iZbW1tsbW2xubnJi+K+++67FeDs2bO33nfffbfed999twL8wz/8w+8A/MM//MNvc9VVV1111VVXXXXVVf8/ULnqqquuuuqqq/5Hs40k/jVsI4n/Sba2ttjc3GRra4vNzU0Atra22NraYnNzk62tLV4U9913360AZ8+evfW+++679b777rv17Nmzz7jvvvtuBfiHf/iH3+aqq6666qqrrrrqqquuuh+Vq6666qqrrrrqP9U//MM//A7Addddx/9ktpHEv8XW1habm5tsbW2xtbUFwHXXXYdtrrvuOl5U9913360AZ8+evfXv//7vfxvg7Nmzz7jvvvtuve+++55+9uzZZ3DVVVddddVVV1111VVX/WtQueqqq6666qqr/svYRhL/FWwjiX+Pra0tALa2ttja2mJzcxOA6667DoDrrruOF9V9991369mzZ2+97777br3vvvtuBTh79uwz7rvvvqefPXv2Gffdd9+tXHXVVVddddVVV1111VX/0ahcddVVV1111VX/qc6ePXsrwPb2Nv9WtpHEf6StrS0Atra2uO666wDY2tpia2uLra0ttra2eFHdd999t549e/bW++6779b77rvvVoCzZ8/eet999z3jH/7hH36bq6666qqrrrrqqquuuuq/C5Wrrrrqqquuuuq/xNbWFgC2kcR/pq2tLQCuv/56tra2ANja2mJra4utrS22trZ4Udx33323Apw9e/bW++6779b77rvvVoB/+Id/+B2Af/iHf/htrrrqqquuuuqqq6666qr/yahcddVVV1111VX/qe67775b77vvvluvueaaB29tbXFwcMC/hW0ksbW1xdbWFltbW2xtbQGwvb3N1tYWW1tbbG1t8aK47777bgU4e/bsrffdd9+t9913361nz559xn333XcrwD/8wz/8NlddddVVV1111VVXXXXV/3ZUrrrqqquuuuqq/3Rnz5699Zprrnnw9vY2BwcH2EYSz21ra4utrS22t7fZ2toC4LrrrkMS1113HS+q++6771aAs2fP3vr3f//3vw1w9uzZZ9x33323nj179tb77rvvVq666qqrrrrqqquuuuqq/w+oXHXVVVddddVV/2Ue8YhHsLW1xdbWFpK4/vrrsc3111/Pi+q+++679ezZs7fed999t9533323Apw9e/YZ991336333Xff08+ePfsMrrrqqquuuuqqq6666qqrrqBy1VVXXXXVVVf9p/v7v//7336xF3ux137EIx7BIx7xCF6Q++6779azZ8/eet99991633333Qpw9uzZZ9x3331P/4d/+Iff4aqrrrrqqquuuuqqq6666l8HPehBD+Kqq6666qqrrvrP9zqv8zrv/Tqv8zrvdd99991633333QrwD//wD78N6B/+4R9+m6uuuuqqq6666qqrrrrqqv946EEPehBXXXXVVVddddVVV1111VVXXXXVVVddddX/SVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8V/wjQ7niOUHlADQAAAABJRU5ErkJggg==) @@ -150,22 +186,31 @@ cube // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) - |> rotate(axis = [0, 0, 1.0], angle = 90) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) + |> rotate( + axis = [0, 0, 1.0], + angle = 90, + ) ``` ![Rendered example of rotate 4](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAC6p0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVdd9d/ummuueTDAmTNnHgxwzTXXPBjgzJkzD+KZrrnmmgcDXHPNNQ++7777br3mmmsefObMmQfzANdcc82D+Xe67777buW5nD179lae6b777ruVZ7rvvvtuBTh79uwzAO67775bAc6ePXvrfffddytXXXXVVVddddVVV/13Qw960IO46qqrrrrqqquuuuo/xzXXXPNggBd7sRd77TNnzjwI4JprrnnwNddc82CAF3uxF3tt/gVPeMITuN/+/j7329/f5357e3u8IPv7+7ww29vbPD87Ozs8t+3tbQC2t7e536Mf/WhemPvuu+9WgLNnz95633333QrwD//wD78D8A//8A+/DXDffffdylVXXXXVVVddddVV/xnQgx70IK666qqrrrrqqquu+re75pprHnzmzJkHv9iLvdhrAbz4i7/4a585c+bB11xzzYN5Lk984hPZ29sDYH9/n/39fQD29/fZ39/nuW1vb2MbgO3tbXZ2dgDY3t7mftvb29xve3ub52dnZ4fnZ29vj+dnf3+fB9rf32d/f5/77e3tAbC/v8/+/j7PbXt7G4Dt7W0AdnZ22N7eZnt7G4BHP/rRPNB99913K8DZs2dvve+++279h3/4h9+57777bj179uyt9913361cddVVV1111VVXXfVvhR70oAdx1VVXXXXVVVddddWL5pprrnnwa7/2a78XwIu/+Iu/9ou92Iu9Ns+0v7/PXXfdxd7eHvv7++zv77O/v8/+/j7Pz/b2Ntvb22xvbwOwvb3NjTfeCMD29jbb29s80P7+Pvfb398H4IYbbuC/wl133YVtAHZ2dtje3uZ++/v73G9vb4/9/X0A9vf32d/fZ29vj/39ffb393l+tre32d7eZmdnh+3tbba3t9ne3ubGG28E4L777rv17Nmzt9533323/sM//MPv3Hfffbf+wz/8w29z1VVXXXXVVVddddWLAj3oQQ/iqquuuuqqq6666qrn75prrnnwa7/2a7/Xi7/4i7/2i73Yi702wP7+PnfddRf7+/vcdddd3HXXXbww29vbbG9vc8MNNwBwww03cMMNN3C//f199vf3ueGGG3h+Dg8PATg6OmK5XCKJ1WpFRBARjONIrZVSCraptdJ1HbVWuq6jlIIkIoL5fA7AarUiM7FNa41pmhjHkWmaGMeRiKC1RmuN1hpd1zGbzbCNbRaLBbbZ2Nhgc3OT5+euu+5ie3ub7e1tAPb39wG46667ALjzzjvZ39/nrrvu4oFsc7/t7W22t7fZ2dnhhhtuYHt7mxtvvJH77rvv1rNnz95633333fpbv/Vb3/MP//APv81VV1111VVXXXXVVc8PetCDHsRVV1111VVXXXXVVVdcc801D37t137t97rmmmse/Dqv8zrvfd999906TdOD77rrLu666y7uuusu/iXb29s86lGP4oYbbmB7e5vt7W329/fZ39/nhhtu4H77+/tI4u677+bw8BCAe++9F0kcHR1xdHRERBARRAQRQSmFUgqlFGqt1Frpuo6u6+j7nr7v6fuevu/p+56u6+i6jlIKpRQWiwUAy+WS1hqtNaZpYhgGxnFkGAaGYWAYBsZxZBgGpmlimiamaaK1RmuN1hqZSWaSmSwWC2yzsbHBxsYGANdeey222dra4rrrruOB7rrrLm644QYA9vf32d/f58477+Suu+7irrvu4oXZ3t5me3ub7e1tHv3oR3PDDTdw33333foP//APv/0P//APv/Nbv/Vb381VV1111VVXXXXVVfdDD3rQg7jqqquuuuqqq676/+6aa6558Gu/9mu/1zu90zt99v7+Pk984hO5++67ueuuu3h+bPNA29vb3HDDDbz8y78829vb7O/vs729DcDe3h77+/vcddddHB4esr+/zz333IMkJCGJiEASkpBERCCJiCAiiAgiglIKpRRKKdRaqbXSdR1d19H3PX3f0/c9fd/T9z1d11FrpdZKRLCxsQHA0dERmUlrjXEcGceRYRgYhoFxHBmGgWEYGMeRaZqYpolpmmit0VqjtUZmkplkJpmJbTIT29jGNrbJTGyzubmJba6//nquv/56tra2uOGGG7jfXXfdxQ033MD+/j533XUXf/Znf8b+/j7/ku3tbba3t3n0ox/NDTfcwHK5vPUf/uEffvtHf/RHP+e+++67lauuuuqqq6666qr/39CDHvQgrrrqqquuuuqq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3/7+PgcHBxwcHABwzz33cHh4iCSOjo44PDzkX2Ib29zPNg9kG9vczzb3s41tHsg2D2Qb2zyQbV6Yzc1NbLOxscG1114LwNbWFpubm1x//fU80JOe9CTuuece/uqv/oq7776bF0YS99ve3uYRj3gEAI985CPZ3t5mf3+fJz3pSdxwww201vipn/op/vzP/5xpmgDIzFu56qqrrrrqqquu+v8JPehBD+Kqq6666qqrrrrq/6uHPOQhns/n9H1PKYVaKydOnOBBD3oQN998M4997GMBePKTn8zW1hbXX389BwcH7O/vc3BwwF133cXBwQF33303L4qtrS0Atre32dra4vrrrwdge3ub66+/ngc6PDwE4PDwkKOjIySxXC6RxHq9JiKICMZxpNZKrRXbdF1HrZW+76m1IolaKxHBzs4OAHt7e2Qm0zRhm2maGMeRcRyZpolhGCilME0TrTX6vqe1xnw+xzaLxQLbbGxsYJtrrrmG57a/v8/BwQF33303AHfffTf7+/vs7+/zotje3gbgEY94BAA33HAD119/PQD7+/s86UlP4uVe7uW4dOkSly5d4hnPeAa/8zu/Q2uN1hqtNaZpYhgGbrvtNnHVVVddddVVV131/xN60IMexFVXXXXVVVddddX/Vw95yEM8n8/puo5aK7VWIoJSChFBRHDs2DFuuukmbrzxRm688Ua2t7cBePKTn8zW1hbXX389AAcHB+zv73NwcMD+/j4HBwccHBywv7/PwcEBL4qtrS0Atre32dra4n7XX38999va2gLg+uuv57/S3XffDcD+/j4ABwcHAOzv73NwcADA/v4+BwcHvKi2trbY3t5ma2uL7e1tAK6//nquv/567re/v8/dd9/NIx/5SAD29vbY29vj9ttv5/bbb+cZz3gGmUlm0lqjtcY0TWQm0zQxDAO33XabuOqqq6666qqrrvr/CT3oQQ/iqquuuuqqq6666v+rhz3sYe77nq7rqLVSSqGUQkRQSiEikEREIImIYGdnh+3tbXZ2dtje3ub666/n+uuv54Huvvtutre32dra4n4HBwfs7+9zcHAAwP7+PgcHBwAcHBwAsL+/z8HBAf8eW1tb/FsdHBzworDNC7K1tQXA9vY2W1tbbG9vc7/rr78egOuvv54H2t/f5+DggOuvv5777e/vA3DXXXext7fHnXfeye23345tMhPb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q6666qqrrrrqqv8zCK666qqrrrrqqquuusw2z802/xLbvKhs88LY5oFs80C2eW62sc2/xDa2sQ2AbQBs89xsYxvb2MY2tnlutgGwzb+Gbf61bHPVVVddddVVV1111b8awVVXXXXVVVddddVVl0nCNi+Mbf6tbPOisM2Lwja2eW62AbCNbQBs8/zY5n62+ZfYxjYviG2uuuqqq6666qqrrvofheCqq6666qqrrrrqqsumabqVB7DNC2KbB7LNC2Ob/0i2eX5s89xsA2Cb+9nmgWwDYJv/Krb5t7DNC2IbgGmabuWqq6666qqrrrrqKgCCq6666qqrrrrqqqsusw2AbR7INi8K2zw329jmX8s297MNgG1eGNvczzbPj21sA2AbANs8kG1s88LY5l9iG9v8d7DNVVddddVVV1111VWXEVx11VVXXXXVVVdddZltXhjb/EtsA2Ab2/xnsM0D2cY297MNgG1sYxvbPD+2uZ9tHsg2trGNbV4Q2wDY5vmxzVVXXXXVVVddddVV/20Irrrqqquuuuqqq656Fts8P7Z5UdnmP4Jt/iW2eVHZ5n62+deyzQPZ5gWxzYvCNv8ZbHPVVVddddVVV1111WUEV1111VVXXXXVVVddlpnczzb/Etv8V7HNc7PNc7MNgG2eH9vYBsA2ALaxDYBtbPOC2Obfwjb/Hrb512itPYOrrrrqqquuuuqqqwAIrrrqqquuuuqqq666zPYz+B/ONi+IbR7INgC2sc3zY5vnxzb/VWzz72GbB7LNVVddddVVV1111VXPQnDVVVddddVVV1111XOwzf1s89xs8x/JNraxzXOzzfNjmweyzf1scz/b3M8297PNc7PNA9nGNs/NNvezDYBt7meb58c2/1Vsc9VVV1111VVXXXXVZQRXXXXVVVddddVVV102TRO2uZ9t/jPZxjYPZJsXxDbPj23uZxsA2zw/trENgG0AbGMbANs8N9vY5oFs89/JNlddddVVV1111VVXvUgIrrrqqquuuuqqq666LCJu5V/JNv8WtnlBbPNAtnkg29zPNi+IbQBsY5vnxzbPzTb/VrZ5YWzz/Njm38M2V1111VVXXXXVVVc9XwRXXXXVVVddddVVV/2Xss1/BNs8kG0AbHM/29zPNgC2sc1zs839bPPcbPPfwTYviG2en9barVx11VVXXXXVVVddBUBw1VVXXXXV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qquuuuqqqx6I4Kqrrrrqqquuuuqq58s297PNi8I297PNC2Ob/yy2eSDb/HvZ5qqrrrrqqquuuuqq/3UIrrrqqquuuuqqq656DpmJbe5nm38N2/x72OY/m20eyDYvjG3+u9jmRWWbq6666qqrrrrqqqueA8FVV1111VVXXXXVVc/tVv4FtgGwzfNjm/8utrmfbf6nsM1/NklcddVVV1111VVXXfUcCK666qqrrrrqqquueh62sY1t7mcb29jm38s2z49t/rPYBsA2/xq2eVHZxja2+beyzQtimxdmmqZbueqqq6666qqrrrrqgQiuuuqqq6666qqrrvo/wzYvjG0eyDb3s82/h22eH9v8W9nmqquuuuqqq6666qp/F4Krrrrqqquuuuqqq14o29jmudkGwDb/E9jm38s297ONbV4UtvnXsM39bPPcbGObq6666qqrrrrqqqv+3Qiuuuqqq6666qqrrnoOrTVsYxvb/EezzfNjm38r2/xHsY1tXlS2eX5s819tmqZbueqqq6666qqrrrrqgQiuuuqqq6666qqrrnoOEXGrbZ6bbe5nmweyzX8V29jGNraxzfNjGwDb/GexzX83SVx11VVXXXXVVVdd9QIRXHXVVVddddVVV131IrONbe5nm/vZ5l9im38r29jmfwrb/GvZ5j+Sba666qqrrrrqqquueqGoXHXVVVddddVVV131fNkGwDa2eVHY5n6SsM0DSeL5sY0kXhDbSOI/km0AbHPVVVddddVVV1111f9ZBFddddVVV1111VVXPYfM5H62eUFsA2Cb58c2/xLb2OaFsc3/JLaxzb+Gbf4rtNZu5aqrrrrqqquuuuqqByK46qqrrrrqqquuuuo5RMSttnlutrmfbR7INv8atrHN82Mb29jGNv8Wtnkg2/x72cY2/xq2+Y9mm6uuuuqqq6666qqrXmRUrrrqqquuuuqqq656HraxjW1scz/b2EYSALaRBIBtJPHC2AZAEs/NNgCSeEFs86KQhG3uJwnbPDfbANjGNraxjW1sYxvb2Ob5sY1tbGMb29jGNv/RbPPcJGGbq6666qqrrrrqqqteICpXXXXVVVddddVVVz2PWisPZJsXhW0k8UC2uZ8knpttACTx3GzzQJJ4YWxzP0nYRhK2eX5sA2Ab29jm+bGNbWxjG9vY5qqrrrrqqquuuuqq//EIrrrqqquu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mQmAbVprlFKICCKCiEASEYEkJCEJAEm8MOfOnfturrrqqquuuuqqq656URBcddVVV1111VVXXfUisf3btrGNbWxjG9vYxjYAtrHNc7PN/WxjG9vYBsA2trGNbWxjG9vYxja2uZ9tHsg297PNv5YkJCEJSUgiIpBERFBKoZRCKYVSCqUUaq3UWqm1Umul6zpqrdRaqbVSSqGUQimFUgqlFEopRAQRgSQkIQkASTyQJJ6f5XJ5K1ddddVVV1111VVXvSioXHXVVVddddVVV131IpH0O5lJZhIRANjGNgC2sQ2AJGzzgkgCwDbPTRK2kYRtJGEbSdzPNpK4n20k8aKSBIAkJCEJSQBIQhKSkEREEBFEBKUUSinUWqm1Umul1kqtlVortVYiAknYRhIAmUkphYggIogIJBERSEISkgCQxHOTxAOtVqtncNVVV1111VVXXXXVi4LKVVddddVVV1111VUvEkm32sY2trGNbQBsIwnbSMI2knhBbAMgCQDbSALANpKwjSRsI4n72UYS/xkkIQlJSCIiiAgigoiglEIphVIKtVZqrdRaqbVSa6XWSkQAYBsA25RSKKVQSiEiiAgiAklIAkASkgCQhCQAJPFAtjk8PPxtrrrqqquuuuqqq656URBcddVVV1111VVXXfUiiYhbp2n67czENrYBsI1tbANgGwDb2MY2trGNbWxzP9vYBsA2tgGwDYBt/iW2+deQBIAkJCEJSUhCEpKQREQgiYggIiilEBGUUiilUGul1kqtlVortVZqrZRSqLVSSqHWSimFUgqlFCKCiCAikIQkJCGJ+0nihRmG4dZxHG/lqquuuuqqq6666qoXBcFVV1111VVXXXXVVS+yzPxt29jGNraxjW1sYxsA29jmBbGNbe5nm/vZBsA2z802/x6SeH4kASAJSUhCEhFBRBARRASlFEop1FoppVBrpZRCrZVaK6UUaq2UUqi1UkqhlEIphYiglEJEIImIQBKSkIQkXhSXLl36ba666qqrrrrqqquuelFRueqqq6666qqrrrrqRSbpdzIT29jGNrYBsI1tbAMgCds8P5IAsA2AJGwDIAnbSOLfShLPTRL3k8T9JAEgCUlIQhIRQUQgiYiglEIphVIKpRRKKZRSqLVSSqGUQimFiAAgM7FNKYWIICKICCKCiEASknggSfxLLl68+DtcddVVV1111VVX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kASAJCQhiauuuuqqq6666qqr/stQueqqq6666qqrrrrqv4xtAGwjiX8P2/xHkcT9JCEJSUgCQBIAkpAEgCQkASAJSUji+ZHE87Ner2/lqquuuuqqq6666qr/TARXXXXVVVddddVVV/2niohbeSFs88LY5l/DNv8akgCQxPMjCUlIQhIAkpAEgCQkIQlJSEISknhhJHHVVVddddVVV1111X86KlddddVVV1111VVX/aezjW3+p5MEgCQAJHE/SUhCEpKQhCQkASAJAEncTxKSuOqqq6666qqrrrrqvw3BVVddddVVV1111VX/a9jmv4okACQhCUkASOJ+kpCEJAAkASAJSTyQJAAkIYmrrrrqqquuuuqqq/5LULnqqquuuuqqq6666j+dJP4tbCOJ/wySeH4kcT9JSEISAJKQBIAkJCEJSUhCEpK4nyQAJAEgiQeyzVVXXXXVVVddddVV/6kIrrrqqquuuuqqq676T2Ub27wwtvnXsA2AbQBs828hiedHEpJ4IElIQhKSkIQkJCEJSdxPElddddVVV1111VVX/Y9AcNVVV1111VVXXXXV/0i2+e8mCUlIQhKSAJCEJCQhCUlIQhKSAJAEgCSeH0lcddVVV1111VVXXfWfjuCqq6666qqrrrrqqv9UEXErL4Bt7meb+9nmudnmRWWbfw1JSEISkgCQxP0kIQlJSEISkpDEA0kCQBIAkgCQhCSe23q9vpWrrrrqqquuuuqqq/4zUbnqqquuuuqqq6666j+dbQBsY5sXxDYAkvjvJAkASUjigSQhCUlIQhKSkIQkJAEgiecmCUlI4qqrrrrqqquuuuqq/xJUrrrqqquuuuqqq676f00SL4wkJCEJSUgCQBKSkIQkJAEgCUncTxJXXXXVVVddddVVV/23Ibjqqquuuuqqq6666r+Ebf6tbHM/2/xbSQJAEv8SSUgCQBKSkIQkJHE/SUhCEpJ4IEncTxIPJImrrrrqqquuuuqqq/7TEVx11VVXXXXVVVdd9Z9OEg9kG9v8R7LNv5ckJCGJ+0nifpIAkIQkJCEJSQBIQhKSkMT9JPHcJHHVVVddddVVV1111X86KlddddVVV1111VVX/a9kGwDb/EeQxANJQhIAkpAEgCQkIQlJSEISknhukpDE/SQhCUlcddVVV1111VVXXfVfguCqq6666qqrrrrqqv90rbVbeQFs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8A//8Nv33Xffrb/927/9Pffdd9+tXHXVVVddddVVV131vwl60IMexFVXXXXVVVddddVV/7tdc801DwZ4sRd7sdcG/GIv9mKvfc011zwY4MyZMw/mma655poHA9x333238kxnz569FeC+++679b777rv17Nmzz7jvvvtu/Yd/+Iff5qqrrrrqqquuuuqq/+3Qgx70IK666qqrrrrqqquuuuqqq6666qqrrrrqqv+TqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8IILHDLogO8lsAAAAASUVORK5CYII=) @@ -173,27 +218,32 @@ sweepSketch = startSketchOn(XY) ```kcl // Sweep two sketches along the same path. - sketch001 = startSketchOn(XY) rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) - |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) - |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61) - |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001)) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 50.61, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfile(sketch002, at = [0, 0]) - |> yLine(length = 231.81) - |> tangentialArc(radius = 80, angle = -90) - |> xLine(length = 384.93) + |> yLine(length = 231.81) + |> tangentialArc(radius = 80, angle = -90) + |> xLine(length = 384.93) parts = sweep([rectangleSketch, circleSketch], path = sweepPath) // Rotate the sweeps. -rotate(parts, axis = [0, 0, 1.0], angle = 90) +rotate(parts, axis = [0, 0, 1.0], angle = 90) ``` ![Rendered example of rotate 5](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEVA0lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqr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4eHh7ou/+Iu/9unTp7n55pu55557GMeRF5Vt/rVs869hmxeVbQBuuOEGrrnmmgf/1m/91vdw1VVXXXXVVf8/UI4fP85VV1111VVXXXXVVVddddX9Dg8Pd//hH/7hd377t3/7e17xFV/xrY8fP378+uuvp+s6zp8/zwtim38L2/xr2eZFZRuAcRx5xCMewTXXXPPgf/iHf/ids2fP3spVV1111VVX/d9HOX78OFddddVVV1111VVXXXXVVc/t8PBw98/+7M9+5vDwcPdlXuZlXvv06dMAnD9/ngeyzb+Fbf61bPOvYZv7jePImTNn2Nzc5L777rv1H/7hH36Hq6666qqrrvq/j3L8+HGuuuqqq6666qqrrrrqqquen8PDw91/+Id/+B2AF3/xF3/t06dPA3Du3Dn+rWzzr2Wbfw3bPD9HR0c86EEP4pprrnnwL/zCL3wNV1111VVXXfV/H+X48eNcddVVV1111VVXXXXVVVe9MP/wD//wO2fPnn3GK77iK7716dOnATh37hz/Grb5t7DNv4ZtXphHPOIRbG5uHv+Hf/iH3zl79uytXHXVVVddddX/bZTjx49z1VVXXXXVVVddddVVV131L7n11lv/+uzZs894xVd8xbc+ffo0AOfOneNfYpt/C9v8a9nmhRnHkTNnzrC5ucl999136z/8wz/8DlddddVVV131fxvl+PHjXHXVVVddddVVV1111VVXvShuvfXWvwZ48Rd/8dc+ffo0AOfOneO52ebfyjb/WrZ5UR0dHfGgBz0ISfzWb/3W93DVVVddddVV/7cRXHXVVVddddVVV1111VVX/Sv8wz/8w+/wTLfccgunT58GwDa2sc2/hW1s869lm3+Ng4MDAM6cOfNgrrrqqquuuur/PoKrrrrqqquuuuqqq6666qp/hbNnz94K8MM//MNsbGzwsi/7stjm38M2/xa2+dewzdHREWfPngXgxV7sxV6bq6666qqrrvq/jeCqq6666qqrrrrqqquuuupf4b777rsV4OzZs/z93/89GxsbvNzLvRz/Fraxzb+WbWzzr2Gb+509e5ZrrrnmwS/2Yi/2Wlx11VVXXXXV/20EV1111VVXXXXVVVddddVV/0r/8A//8Nv33XcfX/u1XwvALbfcwunTp3lR2MY2tvm3sM2/lm0e6OzZswC8+Iu/+Gtz1VVXXXXVVf+3EVx11VVXXXXVVVddddVVV/0bXHvttZw9e5av/dqvBeDlXu7leGFsY5t/K9vY5l/LNs/t8PAQgDNnzjyYq6666qqrrvq/jeCqq6666qqrrrrqqquuuurf4JprrkES//AP/8Df/d3fsbGxwcu93Mvx3Gxjm38P2/xb2Ob5OTo64vDwkGuuuebBL/ZiL/baXHXVVVddddX/XQRXXXXVVVddddVVV1111VX/RpI4e/YsP/IjPwLAxsYGGxsb2MY2tvn3sI1t/i1s88IcHR1x1VVXXXXVVf8PEFx11VVXXXXVVVddddVVV/0r3XfffbcCSEIS//AP/8Df//3fc/r0aR796EfzH8E2/1a2+ZecPXsWgBd7sRd7La666qqrrrrq/y6Cq6666qqrrrrqqquuuuqqf6VrrrnmwZK4nyS+9mu/FoAzZ87w72Eb2/xb2eZFcfbsWQBe/MVf/LW56qqrrrrqqv+7CK666qqrrrrqqquuuuqqq/4Nzp07hyQkIYmzZ8/y93//92xsbPCgBz2Ifwvb/HvY5l/rzJkzD+aqq6666qqr/u8iuOqqq6666qqrrrrqqquu+lc6c+bMgwEkIQlJSOKHf/iHAXjMYx7Dv4ZtbPPvYZt/jcPDQ6666qqrrrrq/wGCq6666qqrrrrqqquuuuqqf4Nz584REdxPEmfPnuXv//7vATh9+jT/EtvY5t/LNv9aR0dHAFxzzTUP5qqrrrrqqqv+7yK46qqrrrrqqquuuuqqq676V7rmmmsefPbsWSQhCUlI4uzZs/z93/89GxsbPOhBD+IFsY1t/iPY5t/q7NmzALzYi73Ya3PVVVddddVV/zcRXHXVVVddddVVV1111VVX/TtEBACSkMQ//MM/AHDmzBmem21s8x/FNlddddVVV1111QtFcNVVV1111VVXXXXVVVdd9a9wzTXXPBjg7NmzAEgiIgCQxOMe9zgANjY2OH36NLaxjW3+I9nm38M2h4eHAFxzzTUP5qqrrrrqqqv+byK46qqrrrrqqquuuuqqq676Vzhz5syDeS4RAYAkJPH3f//3AJw+fZr/DLa56qqrrrrqqqteJARXXXXVVVddddVVV1111VX/Ctdcc82Dz549y3OLCO73D//wDwCcOXOG/2i2+feyDcDh4SEAZ86ceRBXXXXVVVdd9X8Tlauuuuqqq6666qqrrrrqqv8AEYFtAB73uMcBsLm5yX8k21x11VVXXXXVVf8qVK666qqrrrrqqquuuuqqq/6Vzp49ywNJAiAiyEzOnj3LfzTbXHXVVVddddVV/2oEV1111VVXXXXVVVddddVV/wpnzpx50NmzZ3l+JAFw9uxZ7rvvPjY2NtjY2ODfyzb/UWxz1VVXXXXVVf+PEFx11VVXXXXVVVddddVVV/0rXHPNNQ/mBZBERCCJs2fPArC5ucm/h22uuuqqq6666qp/M4Krrrrqqquuuuqqq6666qp/pbNnz/KCRAT/UWxz1VVXXXXVVVf9uxBcddVVV1111VVXXXXVVVf9K1xzzTUP5l8QEZw9e5ajoyM2Njb4t7DNVVddddVVV13170Zw1VVXXXXVVVddddVVV131r3DmzJkHnz17lhcmIgDY2Njg38I2V1111VVXXXXVfwgqV1111VVXXXXVVVddddVV/4EkAXDu3DkANjY2+NewzX+Vzc1NAM6ePfsMrrrqqquuuur/JoKrrrrqqquuuuqqq6666qp/hWuuuebBZ8+e5V9yzTXXcHR0xNHRES8q2/xnk8RVV1111VVX/T9C5aqrrrrqqquuuuqqq6666l/p7NmzvCg2Njb4n2xzcxOA++6771auuuqqq6666v8mgquuuuqqq6666qqrrrrqqv8BbPNfRRIAGxsbAJw9e/ZWrrrqqquuuur/JoKrrrrqqquuuuqqq6666qoX0TXXXPNggLNnz/IvOXPmDABHR0f8S2xz1VVXXXXVVVf9p6By1VVXXXXVVVddddVVV131Ijpz5syDeRGdPn0agMPDQ14Q2/x3kcTm5iYA9913361cddVVV1111f9NVK666qqrrrrqqquuuuqqq15E11xzzYPPnj3Li+ro6IgXxDb/nTY2NgA4e/bsM7jqqquuuuqq/7uoXHXVVVddddVVV1111VVX/SucPXuWF8WZM2cAODo64rnZ5r/b5uYmAPfdd9+tXHXVVVddddX/XVSuuuqqq6666qqrrrrqqqteRGfOnHnQ2bNn+bewzf8kGxsbANx33323ctVVV1111VX/d1G56qqrrrrqqquuuuqqq676D3bmzBkAzp49i22uuuqqq6666qr/NlSuuuqqq6666qqrrrrqqqteRNdcc82D+RfY5vTp0/xPt7m5CcB99933dK666qqrrrrq/y4qV1111VVXXXXVVVddddVV/wpnz57lX3LmzBkADg8P+Z9qY2MDgLNnzz6Dq6666qqrrvq/i+Cqq6666qqrrrrqqquuuupFdM011zz47Nmz/HtIQhKSkIQkJCEJSUhCEpL4z7S5uclVV1111VVX/T9A5aqrrrrqqquuuuqqq6666kV05syZB/NvJIl/LUk8N9v8R9jY2ADgH/7hH36bq6666qqrrvq/i8pVV1111VVXXXXVVVddddW/wtmzZ/mXnD59GoCjoyMAJPEfRRIPZJurrrrqqquuuuoFonLVVVddddVVV1111VVXXfUiuuaaax589uxZ/iVnzpwB4PDwEEn8Z5LEA9nmRbG5uQnAfffddytXXXXVVVdd9X8Xlauuuuqqq6666qqrrrrqqv8kkvivJokHss1z29jYAOC+++67lauuuuqqq676v43KVVddddVVV1111VVXXXXVi+Caa655MMDZs2f5l5w5cwaAo6Mj/rtJ4oFss7m5CcDZs2dv5aqrrrrqqqv+b6Ny1VVXXXXVVVddddVVV131Ijhz5syDeRGdPn0agMPDQ/6nkcTm5iYA9913361cddVVV1111f9tVK666qqrrrrqqquuuuqqq14E11xzzYPPnj3LVVddddVVV131vwqVq6666qqrrrrqqquuuuqq/2BnzpwB4OjoiP+JNjY2ALjvvvtu5aqrrrrqqqv+b6Ny1VVXXXXVVVddddVVV131Ijp79iz/F2xubgJw9uzZZ3DVVVddddVV/7dRueqqq6666qqrrrrqqquuehGcOXPmQWfPnuVfcubMGQCOjo74n2pjY4Orrrrqqquu+n+CylVXXXXVVVddddVVV1111YvgmmuueTAvgjNnzgBweHjI/1Sbm5sA/MM//MNvc9VVV1111VX/t1G56qqrrrrqqquuuuqqq656EZ09e5Z/yenTpwE4Ojriqquuuuqqq676b0dw1VVXXXXVVVddddVVV131IrjmmmsefPbsWf67SEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpLY2NgA4L777ruVq6666qqrrvq/jcpVV1111VVXXXXVVVddddWL4MyZMw/mRXDmzBkADg8P+beSxH+WjY0NAO67775bueqqq6666qr/+6hcddVVV1111VVXXXXVVVf9Bzpz5gwAR0dH/GtI4r/CxsYGAGfPnr2Vq6666qqrrvq/j8pVV1111VVX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ALaxjW0AbPNAtrnqqquuuuqqfwHBVVddddVVV1111VVXXXXVM11zzTUP5kVw5swZANbrNQCSuJ8k7icJSQBIQhIAkpAEgCQkASAJSQAcP36cRz7ykZw8eZJhGJimidYamUlrjcwkM8lMMhPb2AbANraxjW1eENvYxja2AbCNbWwDYBsA29jmgWxzzz33cM8997C1tcVLvuRL8vzY5n62uZ9tAGxjmweyzQPZBsA2trENgG0AbGObq6666qqrrnouBFddddVVV1111VVXXXXVVc/l7NmzvDBnzpwBYLVaIQkASUgCQBKSuJ8kJAEgCUkASEISAJKQhCQkIYkTJ07weq/3eqxWK8ZxZJomWmtkJplJZmIb29jGNraxzQPZxja2sY1tbPPcbHM/29gGwDa2AbCNbWxzvz/4gz8A4Nprr8U2trGNbWxzP9sA2OZ+trmfbWzzQLaxDYBtHsg2ALa53+bm5oO56qqrrrrqqmcjuOqqq6666qqrrrrqqquueqYzZ848mH8DSdxPEpIAkIQk7icJSQBIQhIAkpCEJAAkIQmAkydP8pCHPIRhGJimidYarTUyk8wkM8lMbANgGwDb2MY2Lyrb2MY297PN/Wzz3GxzcHDAPffcw9bWFi/1Ui/F82MbANsA2OZ+tnkg29jGNvezDYBtbGMbANvYxjYA6/Waq6666qqrrnoAgquuuuqqq6666qqrrrrqqme65pprHnz27Fn+JWfOnAFgvV5zP0lI4n6SuJ8kJHE/SUgCQBKSkASAJCQBIAlJvORLviTr9ZpxHJmmicyktUZmkpnYxja2AbDNA9nGNrZ5braxjW2em20AbHM/29jGNra539/8zd8A8LCHPYwHso1tAGwDYBsA29zPNrZ5braxDYBtHsg2tgGwjW2uuuqqq6666rkQXHXVVVddddVVV1111VVXPcDZs2f5l5w5c4b7SUIS95OEJAAkIQlJAEhCEpIAkIQkJAEgCUkASEISkjh16hS2yUwyk9YatrHNc7MNgG2eH9vYxja2eUFs80C2eUFsc88993DPPfewtbXFtddei21scz/bPJBtAGxjm/vZxja2sc39bANgG9vY5n62sY1tbHPVVVddddVVD0Bw1VVXXXXVVVddddVVV131TGfOnHnQ2bNneVENw8D9JCGJ+0lCEveThCTuJwlJ3E8SkgCQhCQkAVBrxTYA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r3+bq6666qqrrnrBCK666qqrrrrqqquuuuqqqx7gH/7hH377sY99LC+MJJ4fSUjigSQhiftJQhL3k4Qk7icJSUQEkpDE/SQBIIn/TLZ5INs8kG3+o9jmBbGNbZ4f29hmmqZbueqqq6666qoXjOCqq6666qqrrrrqqquuuuoBfuu3fuu7X+zFXozndubMGQCGYeC5SUISDyQJSTyQJB5IEveThCTud/HiRSQBIIl/iST+M9nGNra5n20AbHO/66+/HoC77roL29jGNraxDYBtbGObB7INgG2em21sY5v72WYcx1u56qqrrrrqqheM4Kqrrrrqqquuuuqqq6666gHOnj37jH/4h3/47dd+7dfmga655hoAhmHggSTx3CTxQJKQxP0kIYn7SeJ+kpDEhQsXeCBJvCgk8R/FNi8q2wBsb2/zwtjm+bHNA9nGNraxzQPZxja2aa09g6uuuuqqq656wQiuuuqqq6666qqrrrrqqquey9///d//9mu91mvxwkhCEs9NEg8kiQeSxP0kIYn7SeJ+u7u7SEISkgCQhCT+M9nmRWEbANvczzb329/f50Vlm/vZ5vmxDYBtHmiapt/mqquuuuqqq14wgquuuuqqq6666qqrrrrqqufyD//wD79zzTXX8EBnzpwBYBgGJPH8SOKBJPFAkrifJO4nCUncTxIXL15EEi+IJCTxn802z802D2QbgOuvvx6A/f19bPMvsY1t7mcbANs8kG0AbANgG9vYRhJXXXXVVVdd9UIQXHXVVVddddVVV1111VVXPZezZ8/eeubMGR772MdyvzNnzgAwjiPPjyQeSBL3k4Qk7ieJ+0nifpKQBIAkACQBIIn/Srb5l9jmgba3twG46667ALCNbWxjGwDb2MY2D2SbB7KNbWwDYJsHso1tMvNWrrrqqquuuuoFI7jqqquuuuqqq6666qqrrnou9913363/8A//8Nuv/dqvzYtCEg8kiftJ4oEkcT9J3E8S95PE7u4ukpCEJB5IEveTxH8U2zw/trGNbWzz/NjmX2Kbf4ltXhjb2AZgGIbf5qqrrrrqqqteOIKrrrrqqquuuuqqq6666qrn40d+5Ec+58Ve7MW435kzZwAYhoEHksQDSeIFkcT9JHE/SdxPEvfddx//09kGwDb3u/766wHY39/nRWUb2wDYBsA2D2Qb29jmfraZpulWrrrqqquu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sc3zY5vt7W3uZ5sXhW1sA2AbANvczzYPZBsA27TWbuWqq6666qqrXjRUrrrqqquuuuqqq6666qqr/oeRxP8EtnlutgGwzXPb398HwDa2eUFs84LYxjYAtrHN/WzTWruVq6666qqrrnrREVx11VVXXXXVVVddddVVV/0PkZkPjggAJPHfwTb/GjfccAMA+/v7PDfb2MY2trGNbR7INgC2eSDb3M8291uv17/NVVddddVVV73oCK666qqrrrrqqquuuuqqq/6HyMwHA0gCQBL/mWxzP9v8S2zzQLbZ3t4G4M477+RfyzYPZBvb2AbANvezjW1sc9VVV1111VX/ClSuuuqqq6666qqrrrrqqqv+53iwJAAkASAJSTw/kvjvYJvnxza2eVHY5n62eVHYZhiG3+Gqq6666qqrXnQEV1111VVXXXXVVVddddVV/0NIepAkJPH8SEIS/9ls89xs8/zccMMNAOzt7XE/27wwtrmfbQBs80C2AbCNbWwDYJurrrrqqquu+legctVVV1111VVXXXXVVVdd9T9EKeXBkrifJP672Ob5sQ2AbR5of3+fB7KNbWxjG9vYxjYviG1sY5vnxzbjOP42V1111VVXXfWiI7jqqquuuuqqq6666qqrrvofIiK4nyQeSBL3k8S/l23uZxsA2/xr2ObGG28EYG9vj38t2wDY5rnZxjYAtrENQGbeylVXXXXVVVe96KhcddVVV1111VVXXXXVVVf9D1FKebAkJHE/SfxPYRsA2zy3vb09bPOiss0D2eZ+trmfba666qqrrrrq34HKVVddddVVV1111VVXXXXV/xCllAdLAkASkgCQxH832zw/29vbAOzv7wNgG9u8ILaxzf1scz/b2AbANg9km/V6/dtcddVVV1111b8OwVVXXXXVVVddddVVV1111f8QkgCQxL+GJP41bPOC2OZFYZvt7W0A9vb2eG62sY1tbGMb2zyQbV4UtgGYpulWrrrqqquuuupfh+Cqq6666qqrrrrqqquuuup/iFLKgyXxX8k2z802D2Sb+9nmfjfeeCMA+/v72ObfyjYPZBsA29zPNuM43spVV1111VVX/etQueqqq6666qqrrrrqqquu+h8gMx8kCQBJSOK/km0kcT/b/EtsA7C3tweAbV5UtgGwDYBtbGMbANsA2OZ+0zQ9g6uuuuqqq67616Fy1VVXXXXVVVddddVVV131P4DtBwNI4n6SkMT/FLYBsA3A9vY2APv7+9zPNi+MbWzzwtjmgWxjm2mafpurrrrqqquu+tehctVVV1111VVXXXXVVVdd9T9AZj5YEgCSeG6SkMT9JPFfyTbPbWdnB4C9vT0eyDa2sY1tbGMb2zyQbQBscz/bvCCSuOqqq6666qp/JYKrrrrqqquuuuqqq6666qr/ASICSUgCQBL/GWzzgtjmX2IbANtsb28DsLe3x7+WbR7INrYBsA2AbWxjG9u01m7lqquuuuqqq/51CK666qqrrrrqqquuuuqqq/4HkPRgSQBI4oEkcT9J/EexzYvCNs/P9vY2APv7+9jGNi8K29zPNi+K9Xr921x11VVXXXXVvx7BVVddddVVV1111VVXXXXV/wCllAdLQhL3k8R/BdvczzYPZJv72QbANgA7OzsA7O3tcT/bvDC2uZ9tAGwDYBvbANjmfrZprd3KVVddddVVV/3rUbnqqquuuuqqq6666qqrrvofICK4nyQkASCJ/2q2+fewjW1scz/b2OYFsc39bHM/2wDY5qqrrrrqqqv+DQiuuuqqq6666qqrrrrqqqv+ByilPFgSkvjPYpt/K9s80A033ADAnXfeiW1eENvY5rnZBsA2D2Sb+9kGwDbr9fp3uOqqq6666qp/PYKrrrrqqquuuuqqq6666qr/ASLiwZL4r2KbB7LNi8I2ANvb2wDs7e0BYJsXlW0eyDa2sc1VV1111VVX/QejctVVV1111VVXXXXVVVdd9T9ArfXBAJKQxItKEv/ZbPPcdnZ2eG62+ZfY5n62eUFsA2AbgGEYfpurrrrqqquu+tcjuOqqq6666qqrrrrqqquu+h9CEveThCSeH0n8R7HNC2Ob+9kGwDbb29sA3HHHHTyQbWxjmweyjW3uZxsA2zyQbWzzQLbJzFu56qqrrrrqqn89gquuuuqqq6666qqrrrrqqv9mmflgSQBI4rlJQhL/Hrb5l9jmgWzzorDN82Mb29jmhbGNbWzzQLYBaK3dylVXXXXVVVf921C56qqrrrrqqquuuuqqq676b5aZDwaQBIAk/rvY5vmxDYBtAG688UYA7rzzTgBs86KyDYBtnpttHsg26/X6t7nqqquuuuqqfxsqV1111VVXXXXVVVddddVV//0eLAkASTyQJO4nif/JbPMvsc0LYpvnxzZXXXXVVVdd9W9EcNVVV1111VVXXXXVVVdd9d+slIIkJHE/Sfxnsc0D2eaFsc1z29nZAWBvb48Hso1tnpttbHM/2wDYxja2AbANgG1sY5txHG/lqquuuuqqq/5tCK666qqrrrrqqquuuuqqq/6bSXqQJJ6bJP4j2Ob5sc2/hm0AbrjhBgD29vawzfNjG9vYxjYPZJt/jWmansFVV1111VVX/dsQXHXVVVddddVVV1111VVX/TeLiAdLQhKSkMR/Nds8P7Z5bjs7OwDceeedANjm38I2D2QbANs80DiOv81VV1111VVX/dtQueqqq6666qqrrrrqqquu+m8WEQ/mfyDb3M82ALZ5fmzzorDNA9nGNrZ5fmwjiauuuuqqq676N6Jy1VVXXXXVVVddddVVV13136yU8mBJSEISL4wk7ieJ/0i2eVHceOONAFy6dIkHso1tnh/b2OZ+tnlutnkg2wC01m7lqquuuuqqq/5tCK666qqrrrrqqquuuuqqq/6bSUIS95OEJO4nif8otnkg2/xLbPP87O/vY5vnZhvb2MY2tnkg2wDY5n62eSDbAKzX69/hqquuuuqqq/7tCK666qqrrrrqqquuuuqqq/6b1VofDCCJ5yaJfw/b/EexDcCNN94IwN7eHgC2eVHZ5oFsYxsA2zy3aZpu5aqrrrrqqqv+7Qiuuuqqq6666qqrrrrqqqv+B5AEgCTuJ4n7SeI/km1eFLZ5Qfb29rifbf4ltrmfbf4ltpmm6elcddVVV1111b8dwVVXXXXVVVddddVVV1111X+jaZpem/9mtnl+bHM/2wDYZmdnB4C9vT0eyDYviG2em23uZxsA29jmfsMwPIOrrrrqqquu+rejctVVV1111VVXXXXVVVdd9d/I9oMlIQlJAEjif6qdnR0A9vb2sM1zs41tbGMb29jmgWxzP9vY5gXJzFu56qqrrrrqqn87gquuuuqqq6666qqrrrrqqv9GEYEknpsk/qPZ5gWxzf1sY5vn58YbbwRgb28PANv8a9gGwDYPZJsHso1tWmu3ctVVV1111VX/dgRXXXXVVVddddVVV1111VX/jSQ9SBIAkpDEfxTbvDC2eSDb2Oa52QbANvfb29vjfrZ5UdjmgWwDYJsXJDNv5aqrrrrqqqv+7Qiuuuqqq6666qqrrrrqqqv+G0XEgyUhif8qtvm32tnZAWBvb48Hss0LY5v72eZ+tnlBWmu3ctVVV1111VX/PlSuuuqqq6666qqrrrrqqqv+G0UEknhRSOJ+kvivYBsA2wBsb28DsLe3h20eyDa2sc39bGObf4ltbHM/26xWq9/mqquuuuqqq/59CK666qqrrrrqqquuuuqqq/4blVIeDCAJSUhCEgCSkMR/Jtu8ILZ5bjs7OwDs7e0BYJvnxza2eW62AbCNbWxjmweyzVVXXXXVVVf9ByG46qqrrrrqqquuuuqqq676b1RKebAk/rPZ5j/Czs4OAHt7e9zPNi8K27wgtnluq9Xqd7jqqquuuuqqfx+Cq6666qqrrrrqqquuuuqq/0allAcDSOKBJHE/Sfxr2eZFZZvnZpv72QbANjs7OwBcunSJB7LNC2Ob+9nmgWzz/Njmqquuuuqqq/6dCK666qqrrrrqqquuuuqqq/6bSQJAEv9VbPNAtgGwjW3+LWzz3Gxjm/vZBsA2trHNCzIMw29z1VVXXXXVVf8+BFddddVVV1111VVXXXXVVf9NMvPBkgCQBIAk/jPZ5gWxzXOzDYBtbrrpJgDuuOMOAGzz3GxjG9vY5l/LNgC2aa3dylVXXXXVVVf9+1C56qqrrrrqqquuuuqqq676b5KZD5aEJB5IEv8T7ezsALC3t8f9bPOisg2AbR7INlddddVVV131n4Tgqquuuuqqq6666qqrrrrqv4ntB0sCQBKS+K9kmxfGNg+0vb3N82Obf4ltHsg2trHN87Ner3+bq6666qqrrvr3I7jqqquuuuqqq6666qqrrvpvUkoBQBL/EkncTxIvjG0eyDb/Wra5n20AdnZ2ALj99tuxzQPZ5gWxzf1s89xs80C2mabpVq666qqrrrrq34/KVVddddVVV1111VVXXXXVfxNJD5LECyKJ/01sYxvb2MY2tnlutrmfbZ6faZpu5aqrrrrqqqv+/Qiuuuqqq6666qqrrrrqqqv+m0TEgyUhCUlIQhIAkvjPYpv72ea52eZ+tgGwzU033QTAHXfcAYBt/jVscz/b2OYFWa/Xz+Cqq6666qqr/v2oXHXVVVddddVVV1111VVX/TeJCP4lkviPYhtJPDfb/GvY5n62eVHYBsA2L4pxHH+bq6666qqrrvr3o3LVVVddddVVV1111VVXXfXfpNb62pKQxANJ4n8C2zzQzs4OAHt7ezyQbWzzgtjmBbHN8yOJq6666qqrrvoPQHDVVVddddVVV1111VVXXfXfSBIAkvifyjY33XQTAHt7ewDY5rnZxjYAtrGNbe5nGwDb2MY295PEA03TdCtXXXXVVVdd9e9HcNVVV1111VVXXXXVVVdd9d+k1vpgAEkASOJfIokXxjYPZJvnxzYvjG0eaGdnB4A77riD+9nm+bHNi8o2z22aplu56qqrrrrqqv8YVK666qqrrrrqqquuuuqqq/4bSeKBJPHfzTb3sw2AbQBs80C2eVHYBsA297PN87NarX6bq6666qqrrvqPQXDVVVddddVVV1111VVXXfXfIDMfLIn7SeIFkcR/FNvczzYvqptvvhmAvb09bPNAtnlhbPNAtrHNC2Kbq6666qqrrvoPQnDVVVddddVVV1111VVXXfXfIDMfLAlJSOI/m22eH9s8kG3uZ5vntre3x/Njm+dmG9vczzbPzTaSuJ9tVqvV73DVVVddddVV/zGoXHXVVVddddVVV1111VVX/fd4sCQeSBIAkpDEfxXbvDC2uemmmwC4dOkSALZ5braxjW1s80C2AbDN/Wzz/Njmqquuuuqqq/6DULnqqquuuuqqq6666qqrrvpvUEoBQBKSkMRzk8R/F9s8P5cuXeJ+tvm3sI1tACTx3Nbr9W9z1VVXXXXVVf8xCK666qqrrrrqqquuuuqqq/57vJYknpsk/q1s80C2eX5s86+1s7MDwN7eHg9km3+JbQBs80C2eX5aa7dy1VVXXXXVVf8xqFx11VVXXXXVVVddddVVV/03iAgk8T+Rbe5nm52dHQD29vYAsM0D2eYFsc0D2QbANs/PNE23ctVVV1111VX/cahcddVVV1111VVXXXXVVVf9NyilPBhAEpJ4UUjiv8NNN90EwKVLl3hBbGMb29jGNra5n23uZ5sXZLVa/TZXXXXVVVdd9R+H4Kqrrrrqqquuuuqqq6666r9BKeXBkrifJP6z2AbANvezzfNjm/vZ5oH29va4n21eVLZ5fmwDIImrrrrqqquu+k9CcNVVV1111VVXXXXVVVdd9d9AEgCSuJ8knpsk/rPY5oFs8/zs7OwAcOnSJWxzP9v8a9jGNgC2AZAEgCQAhmG4lauuuuqqq676j0Plqquuuuqqq6666qqrrrrqv0Ep5cGSAJDEfxfbPD+2ud/Ozg4Ae3t7PDfbvDC2AbDN/WzzggzD8Ayuuuqqq6666j8OwVVXXXXVVVddddVVV1111X+xzHwQzySJ5yaJfy/b/Eewzc7ODg9kmweyjW3uZxvb2OZfaxiG3+aqq6666qqr/uMQXHXVVVddddVVV1111VVX/Rez/WBJSOJ+kgCQxL+FbV4UtvmX2OaBjh07BsDtt9/O/Wzz3Gxjm+dmGwDb2MY2tpGEJO4nCUlcddVVV1111X8ggquuuuqqq6666qqrrrrqqv9imflgSdxPEs9NEv/dbAOws7MDwKVLl/jPIIn7TdN0K1ddddVVV131H4fgqquuuuqqq6666qqrrrrqv1hEIAlJSOJ+knhBJPFvYRsA29zPNi+IbV4Y29zPNv8S2wDY5oFs89yWy+XvcNVVV1111VX/sahcddVVV1111VVXXXXVVVf9F5P0YP4Hss1zu+mmmwC4/fbbeX5sY5vnZhvbPJBtbGMbAElI4n7TNN3KVVddddVVV/3HIrjqqquuuuqqq6666qqrrvovFhEPloQkJPHfwTYPZJsHsg3Azs4OAHt7e9zPNs/NNraxjW0eyDbPzTYPJIlxHJ/OVVddddVVV/3HonLVVVddddVVV1111VVXXfVfLCKQxP0kIYnnJon/TLb5l+zs7PD82OZFYRsA2zw3SQBIwjbDMDyDq6666qqrrvqPRXDVVVddddVVV1111VVXXfVfrJTyYABJ/GewzfNjmxeFbe537NgxAG677TZs80C2+dewjW1sIwkASdxvHMdbueqqq6666qr/WARXXXXVVVddddVVV1111VX/xSQ9WBIAkvj3ss1/Bts8N9s8kG2eH9vYBsA2z48kHmiaplu56qqrrrrqqv9YVK666qqrrrrqqquuuuqqq/6L1VofDCCJ5yaJ/062eaCbb74ZgDvuuIMXxDa2sQ2AbV4Y20gCQBIAtmmt3cpVV1111VVX/cciuOqqq6666qqrrrrqqquu+m8giftJAkASAJL4j2AbANvczzYviG3uZxsA2wDY5n62eUFs80C2AbCNbWxzP0ncb5qmW7nqqquuuuqq/3gEV1111VVXXXXVVVddddVV/4Uy88GSuJ8k/iWS+M9mm+fn2LFjAFy6dIkHss2/xDYviCQAJAFwdHT021x11VVXXXXVfzyCq6666qqrrrrqqquuuuqq/0KZ+WBJSEIS95PEfxXbPJBtHsg2ADs7OwBcunQJANs8kG1eFLZ5INtIQhJXXXXVVVdd9Z+MylVXXXXVVVddddVVV1111X+tB0viv5tt/iU33XQTALfffjv3s80D2cY2D2Qb2zyQbWxjGwBJSEISAMvl8ne46qqrrrrqqv94BFddddVVV1111VVXXXXVVf+FIgJJSEISL4gk/i1s8/zY5kVhm38L29jGNg9kmxfFNE1cddVVV1111X8CKlddddVVV1111VVXXXXVVf+FJD2IB5CEJP4nOnbsGACXLl3CNvezzYvCNgC2uZ9tJCEJSdxvtVr9NlddddVVV131H4/KVVddddVVV1111VVXXXXVf6GIeLAk/qPYRhL/EWxzP9vs7OwAsLe3x3OzzQtjmweyjW0AJCEJSdyvtXYrV1111VVXXfUfj+Cqq6666qqrrrrqqquuuuq/UEQgCUlI4oEk8R/FNgC2uZ9t/jVuvvlmAC5dugSAbR7INs+Pbe5nm+cmCUlcddVVV1111X8BKlddddVVV1111VVXXXXVVf+FSimvzfMhCQBJPJAk/ivY5n62eaBLly5xP9s8kG1sA2Ab2zw329zPNpKQhCQADg8Pf5urrrrqqquu+s9BcNVVV1111VVXXXXVVVdd9V9MEpIAkMR/Jds8N9s8P8eOHQPg0qVL/Ets89xscz/b2AZAEpKQBMA4jrdy1VVXXXXVVf85qFx11VVXXXXVVVddddVVV/0XqrU+mOciif9KtpGEbZ6bbQB2dnYAuHTpEgC2uZ9t/iW2eUEkIQkASQzDcCtXXXXVVVdd9Z+D4Kqrrrrqqquuuuqqq6666r+YJCQhif9Itnl+bPPcbPPC7OzsAHDp0iWeH9u8ILa5n20eyDaSkIQkAI6Ojp7BVVddddVVV/3noHLVVVddddVVV1111VVXXfVfZJqm15bEv0QS/x1sc79jx44BsLe3x/1s80C2sc0D2ea52cY2tpFERCAJSQBM03QrV1111VVXXfWfg+Cqq6666qqrrrrqqquuuuq/iO0HS+J/g52dHQAuXbqEbe5nm+dmG9vY5oFs89wiAklIQhIAmXkrV1111VVXXfWfg+Cqq6666qqrrrrqqquuuuq/iCQkIQlJSEIS/1a2eX5sA2Cb+9nmhbHN/Wxz7NgxAC5dusS/hW0AbHM/20hCEpIAkMQ4jrdy1VVXXXXVVf85qFx11VVXXXXVVVddddVVV/0XkfQgXgBJPDdJ/FewzXM7duwYD2Sb+9nmhbHNA9nGNgARQUQgCYD1en0rV1111VVXXfWfh8pVV1111VVXXXXVVVddddV/kVLKgyUhCUk8N0n8Z7KNJF4Y2wDs7OwAcPvtt/P82MY2z80297PNc4sIJCEJgMPDw9/mqquuuuqqq/7zULnqqquuuuqqq6666qqrrvovIglJPDdJ/FexjSQAbPOCHDt2jEuXLrG7u8v9bPPcbGMb29jmudnmfraRhCQkcdVVV1111VX/BQiuuuqqq6666qqrrrrqqqv+i5RSHgwgCQBJ/GezzXOzjW2em20e6NixYzw327wobHM/29gGICKICCQBcHBw8DtcddVVV1111X8eKlddddVVV1111VVXXXXVVf9FIuLBknggSTyQJP4tbCOJ/wg33XQTALfddhsAtvnXsM0LEhFIQhIA4zhy1VVXXXXVVf+JqFx11VVXXXXVVVddddVVV/0XkQSAJCTxP4lt7nfs2DEALl26xPNjmxfENvezjW0AbBMRRAQRgSQAlsvlb3PVVVddddVV/3kIrrrqqquuuuqqq6666qqr/otExIMl8V/BNv+RbPNAtrHNA9nmfra5n20ASilEBBFBRAAwTdOtXHXVVVddddV/HoKrrrrqqquuuuqqq6666qr/Apn5YEk8kCReEEn8W9jmudnmhbHN/Wxzyy23AHD77bdjm/vZ5rnZxja2+ZdEBBGBJCQhiauuuuqqq676T0blqquuuuqqq6666qqrrrrqv0BmPlgSkpCEJP4nsM1/NNsA2OZ+timlEBFEBAD7+/u/zVVXXXXVVVf95yK46qqrrrrqqquuuuqqq676L2D7wZJ4fiQhiX8N2/xr2Oa52eaBbANw8803A3DbbbcBYJv72eaFsc0D2cY2AKUUSilEBJJYr9e3ctVVV1111VX/uahcddVVV1111VVXXXXVVVf9FyilIAlJPJAk/qvYRhIAtvmX2Ob5sc3zY5v72eaBbFNKISKQBMDR0dGtXHXVVVddddV/LoKrrrrqqquuuuqqq6666qr/Gg/imSTxX8E2z802tnlutrnfsWPHALh06RL3s80D2cY2trGNbZ6bbQBsAxARRAQRgSSOjo6ewVVXXXXVVVf95yK46qqrrrrqqquuuuqqq676LxARD5bE/SQhiQeSxL+Fbf6jHDt2DIBLly4BYJv72eZFYZv72QYgIqi1Ukoh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7RlcddVVV1111X89gquuuuqqq6666qqrrrrqqv8EH/7hH/5dvACS+O9gmweyzfHjxwHY3d3l38I2ALa5n202Njbo+55SCpK47777fpurrrrqqquu+q9HcNVVV1111VVXXXXVVVdd9Z/g9OnTry0JSUjifpIAkMR/Jts8kG2en2PHjvHcbHM/27yobGObY8eOsVgsqLVSSgFAElddddVVV13134DKVVddddVVV1111VVXXXXVf4K77777wZK4nyT+M9lGEg9kmxfENgDHjh0D4LbbbsM2z49tnh/bANjmgY4fP85isaDrOiICgGEYbuWqq6666qqr/usRXHXVVVddddVVV1111VVX/Qd7ndd5nfeWhCQkcT9J/FvZ5j/D8ePHAdjd3eWBbPNAtrGNbWxjmxdkZ2eH2WxGrRVJ/OVf/uXvcNVVV1111VX/PahcddVVV1111VVXXXXVVVf9Bztz5syDzp49y/0k8T+JbV4Q2/xr2AbANraxzdbWFrPZjForEcFdd911K1ddddVVV13134Pgqquuuuqqq6666qqrrrrqP9jZs2efUUpBEpL415DEv5Vt/jUe9KAHAfCMZzwD2zw32/xbbGxs0Pc9pRQkMU0TV1111VVXXfXfhOCqq6666qqrrrrqqquuuuo/2JkzZx4kCUm8MJL497LNv4Zt7nfs2DEAdnd3eUFs84LYBsA297PNYrGg73siAoC//Mu//G2uuuqqq6666r8HwVVXXXXVVVddddVVV1111X+ws2fPPuPFXuzFeCBJ/Esk8Z/JNg9km+fHNg9kmweyjW0eyDa2AVgsFnRdR0Qgidtvv52rrrrqqquu+m9CcNVVV1111VVXXXXVVVdd9R/svvvuu/Waa65BEpKQxP0k8Z/JNi+qBz3oQQA84xnPAMA297PNA9nGNrZ5INs8UCmF+XxOrZWIwDZ33HHHb3PVVVddddVV/z0Irrrqqquuuuqqq6666qqr/oOdPXv21jNnzvDoRz+aB5IEgCT+rWwDYJsXxDbPzTYPZJv/KLa53/b2NrPZjForkgAYx/FWrrrqqquuuuq/B8FVV1111VVXXXXVVVddddV/sPvuu+/W3/qt3/ruV3/1V0cSLwpJ/EeyjW1sY5vn50EPehAAz3jGM7ifbe5nmxfGNvezjW22traYzWbUWpHEHXfccStXXXXVVVdd9d+H4Kqrrrrqqquuuuqqq6666j/Bb/3Wb33Pox71KAAk8Z/JNv8atnlutnl+bPP82AbANg+0sbFBrZVSChHB1tbWg6+55poHc9VVV1111VX/PQiuuuqqq6666qqrrrrqqqv+E5w9e/bWzLz1Ld7iLQCQxP80x48fB2B3d5cHss0D2cY2ALaxzQsyn8/p+55SCgCtNa655poHc9VVV1111VX/PQiuuuqqq6666qqrrrrqqqv+E9x33323fv3Xf/37vMqrvAqnTp3iuUniRWWb/yi2ATh+/DgAly5d4n62eWFs80C2AbCNbWwzm83ouo6IAOCuu+7iqquuuuqqq/4bEVx11VVXXXXVVVddddVVV/0nOXv27K133333b7/He7wH/9ls869xyy23AHDrrbdim+dmm3+Lvu/puo6IQBL33XcfV1111VVXXfXfiOCqq6666qqrrrrqqquuuuo/yX333Xfrj/7oj372sWPHbn2TN3kTXhBJ/Fewzb+GbV4Q2wDY5n62mc1m1FqRBMCxY8e47777buWqq6666qqr/nsQXHXVVVddddVVV1111VVX/Sf6h3/4h9/5rd/6re9+pVd6Jd74jd8YSfxHsc0D2eYFsc0DHTt2DIDd3V0eyDYPZJvnZpsHso1t+r6n6zoigojANsePH+e+++67lauuuuqqq67670Hlqquuuuqqq6666qqrrrrqP9lv//Zvf88111zz4Fd8xVd8b0n82q/9Gv+VbPPcjh8/DsDu7i4AtnlBbGMb29jmfrZ5oMViQd/31FoB2N3d5R/+4R9+m6uuuuqqq67670Nw1VVXXXXVVVddddVVV131n+y+++679Ud/9Ec/5+677/7tV3iFV+AN3/AN+fewzQtimweyzXOzzfHjxwG4dOkSz802/xaz2YxSCqUUIoJLly5x33333cpVV1111VVX/fchuOqqq6666qqrrrrqqquu+i9w33333fr1X//17zNN062v8AqvwBu8wRvwr2WbF4VtbGObF+TYsWMA7O7ucj/b3M82L4xtAGxjG9v0fU/XdZRSWK/XLJdLfvRHf/RzuOqqq6666qr/PgRXXXXVVVddddVVV1111VX/Re67775bP+uzPut17rzzzt9+gzd4A17/9V8fSfx72OZfwzYAx48fB2B3dxfbPD+2eX5s8/x0XUetFUlcvHiR3/qt3/ru++6771auuuqqq6666r8PwVVXXXXVVVddddVVV1111X+h++6779av//qvf+8f+ZEf+ew3eIM34BM/8RN5yEMewn+l48ePA7C7u8tzs80D2eZ+trHN/WxzP9t0XUcphYhgtVrxoz/6o5/DVVddddVVV/33ohw/fpyrrrrqqquuuuqqq6666qr/SkdHR5f+4R/+4XcAXv7lX/61X+7lXo4TJ05w9913s16vAZCEJCQBIAkASQBI4n6SeFHYBuDaa6/lpV7qpbjnnnv4m7/5G/4ltrHNA9kGwDa2sc21117LYx/7WE6ePMlnfuZnvs6tt97611x11VVXXXXVfy+Cq6666qqrrrrqqquuuuqq/yY/+qM/+jkf8iEf8pB/+Id/+O2XfdmX5f3e7/14ndd5Hf6zHT9+HIBLly5hGwDb3M82/xaPfexjecQjHsGP/MiPfPY//MM//DZXXXXVVVdd9d+Pcvz4ca666qqrrrrqqquuuuqqq/67HB4e7v7DP/zD7xweHu6+/Mu//Gs/5CEP4WVf9mWZz+fceuutSAJAEgCSAJDEA0nihbHN/R71qEfx4Ac/mCc+8YnceuutPD+2eUFsA2AbANu82Zu9GS/+4i9+65/+6Z/+9Hd913d9DFddddVVV131PwPl+PHjXHXVVVddddVVV1111VVX/Xc6PDzc/Yd/+Iff+e3f/u3vOTw83H35l3/5137IQx7Cy7zMyzCbzbh06RLr9RoASdxPEveTxAtimwd6qZd6Ka677jr+5m/+hnvuuYf72eaBbPPcbHM/2zzsYQ/jwz/8w7nmmmtu/a3f+q3v/q7v+q6P4aqrrrrqqqv+56AcP36cq6666qqrrrrqqquuuuqq/wkODw93/+Ef/uF3fvu3f/t7Dg8Pd1/+5V/+tR/ykIfw6Ec/muuuu47FYsG9997L/STxQJJ4UbziK74ix48f54lPfCL33HMPtnlBbGMb29jmfsePH+d93ud9eKM3eiP29/dv/fqv//r3+e3f/u3v4aqrrrrqqqv+Z0EPetCDuOqqq6666qqrrrrqqquu+p/ozJkzD3qd13md936nd3qnz77vvvtuveaaax68u7vLM57xDP76r/+a2267jecmifvZ5rnZ5iM/8iM5fvw4X/M1X8Pu7i62AbCNbQBsYxvb2MY2x48f52Vf9mV5gzd4A+73Iz/yI5/9oz/6o5/DVVddddVVV/3PhB70oAdx1VVXXXXVVVddddVVV131P9k111zz4Nd+7dd+rxd/8Rd/7Rd7sRd7bZ5pd3eXS5cu8YxnPINbb72VZzzjGfxLbPOZn/mZAHzO53wOALaxDYBtbANw7Ngxjh8/zkMe8hBe7/Vej/vdd999t/7oj/7o5/zWb/3Wd3PVVVddddVV/7OhBz3oQVx11VVXXXXVVVddddVVV/1vcebMmQe9zuu8znu/+Iu/+Gu/2Iu92GvzALu7uwA84xnPYHd3l0uXLrG7u8ulS5fY3d3FNgCf+ZmfCcDnfM7nYJvjx49jmwc/+MEcP34c2zzkIQ/hIQ95CA9033333fpbv/Vb3/2jP/qjn8NVV1111VVX/e+AHvSgB3HVVVddddVVV1111VVXXfW/0TXXXPPgF3uxF3vtF3uxF3uta6655sEv9mIv9tr8B7vvvvtu/a3f+q3v/q3f+q3vPnv27DO46qqrrrrqqv9d0IMe9CCuuuqqq6666qqrrrrqqqv+L7jmmmseDPBiL/Zir/1iL/ZirwVwzTXXPBjgxV7sxV77vvvuu/Waa655MM/lvvvuuxXg7Nmzt/793//9bwP8wz/8w+/8wz/8w29z1VVXXXXVVf+7oQc96EFcddVVV1111VVXXXXVVVddddVVV1111VX/J1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8q/hHRzMxGF39n4wAAAABJRU5ErkJggg==) @@ -203,19 +253,19 @@ rotate(parts, axis = [0, 0, 1.0], angle = 90) sketch001 = startSketchOn(XY) fn square() { - return startProfile(sketch001, at = [-10, 10]) - |> xLine(length = 20) - |> yLine(length = -20) - |> xLine(length = -20) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + return startProfile(sketch001, at = [-10, 10]) + |> xLine(length = 20) + |> yLine(length = -20) + |> xLine(length = -20) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() } profile001 = square() profile002 = square() - |> translate(x = 0, y = 0, z = 20) - |> rotate(axis = [0, 0, 1.0], angle = 45) + |> translate(x = 0, y = 0, z = 20) + |> rotate(axis = [0, 0, 1.0], angle = 45) loft([profile001, profile002]) ``` diff --git a/docs/kcl-std/scale.md b/docs/kcl-std/functions/std-transform-scale.md similarity index 99% rename from docs/kcl-std/scale.md rename to docs/kcl-std/functions/std-transform-scale.md index 971a94d5b..95e4b60a7 100644 --- a/docs/kcl-std/scale.md +++ b/docs/kcl-std/functions/std-transform-scale.md @@ -9,35 +9,40 @@ Scale a solid or a sketch. ```kcl scale( - @objects: [Solid] | [Sketch] | ImportedGeometry, - x?: number, - y?: number, - z?: number, + @objects: [Solid; 1+] | [Sketch; 1+] | ImportedGeometry, + x?: number(_), + y?: number(_), + z?: number(_), global?: bool, -): [Solid] | [Sketch] | ImportedGeometry +): [Solid; 1+] | [Sketch; 1+] | ImportedGeometry ``` -This is really useful for resizing parts. You can create a part and then scale it to the correct size. +This is really useful for resizing parts. You can create a part and then scale it to the +correct size. For sketches, you can use this to scale a sketch and then loft it with another sketch. By default the transform is applied in local sketch axis, therefore the origin will not move. -If you want to apply the transform in global space, set `global` to `true`. The origin of the model will move. If the model is not centered on origin and you scale globally it will look like the model moves and gets bigger at the same time. Say you have a square `(1,1) - (1,2) - (2,2) - (2,1)` and you scale by 2 globally it will become `(2,2) - (2,4)`...etc so the origin has moved from `(1.5, 1.5)` to `(2,2)`. +If you want to apply the transform in global space, set `global` to `true`. The origin of the +model will move. If the model is not centered on origin and you scale globally it will +look like the model moves and gets bigger at the same time. Say you have a square +`(1,1) - (1,2) - (2,2) - (2,1)` and you scale by 2 globally it will become +`(2,2) - (2,4)`...etc so the origin has moved from `(1.5, 1.5)` to `(2,2)`. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `objects` | [`[Solid]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) | The solid, sketch, or set of solids or sketches to scale. | Yes | -| `x` | [`number`](/docs/kcl-std/types/std-types-number) | The scale factor for the x axis. Default is 1 if not provided. | No | -| `y` | [`number`](/docs/kcl-std/types/std-types-number) | The scale factor for the y axis. Default is 1 if not provided. | No | -| `z` | [`number`](/docs/kcl-std/types/std-types-number) | The scale factor for the z axis. Default is 1 if not provided. | No | +| `objects` | [`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) | The solid, sketch, or set of solids or sketches to scale. | Yes | +| `x` | [`number(_)`](/docs/kcl-std/types/std-types-number) | The scale factor for the x axis. | No | +| `y` | [`number(_)`](/docs/kcl-std/types/std-types-number) | The scale factor for the y axis. | No | +| `z` | [`number(_)`](/docs/kcl-std/types/std-types-number) | The scale factor for the z axis. | No | | `global` | [`bool`](/docs/kcl-std/types/std-types-bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | ### Returns -[`[Solid]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) - Data for a solid, sketch, or an imported geometry. +[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) ### Examples @@ -47,22 +52,30 @@ If you want to apply the transform in global space, set `global` to `true`. The // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) - |> scale(z = 2.5) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) + |> scale( + z = 2.5, + ) ``` ![Rendered example of scale 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADUbElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV/0nu+aaax585syZBwNcc801Dz5z5syDeKZrrrnmwTzTNddc82Cey5kzZx589uzZW8+cOfNg/hXOnj17Kw9w33333coz3XfffbeePXv2GQD33XffrQBnz5699b777ruVq6666qqrrrrqqquu+r8FPehBD+Kqq6666qqrrrrqP8qLvdiLvfbrvM7rvNc111zz4DNnzjz4mmuueTD/gvvuu4/73Xfffdzv7Nmz/FucOXOGB7rmmmu45ppreGHuu+++W3mmr//6r3+ff/iHf/htrrrqqquuuuqqq6666n8/9KAHPYirrrrqqquuuuqq/wjv+I7v+Fnv9E7v9Nn33Xcfv/Vbv8Xf//3f8w//8A+82Iu9GB/xER/BNddcw/NzdHSEJFarFRFBZtL3PbPZjNlsRt/3zGYzJGGb1hrDMLBcLjk6OmK5XALQWqO1xmw2wzYbGxtsbm7ygvzWb/0Wv/mbv8k111zDNddcwzXXXMOZM2eQ9Ntf//Vf/z733XffrVx11VVXXXXVVVddddX/blSuuuqqq6666qqr/oP9wz/8Ay/+4i/OO73TOwFw3333cc011/CCbGxsALBYLAAYhoGIoJRCZjIMA+M4cj/b2CYiWCwWbG1t8W/xYi/2YrzYi70YZ8+e5e///u95ndd5HQAuXrz42q/92q/9Xj/6oz/6OVx11VVXXXXVVVddddX/bpTjx49z1VVXXXXVVVdd9R/h7Nmzz3jCE57w0ddddx3XXXcdEcFsNmNzc5N/jVIKEYEkAGyTmWQmmYltbAMQEfxbHB0d0XUd4ziSmWxtbXHnnXfyB3/wBwBcuHDht//hH/7hd7jqqquuuuqqq6666qr/3ahcddVVV1111VVX/Qe57777bh3HkQsXLvDHf/zHzOdzZrMZJ0+epJRCrZWdnR1KKWxvbxMRlFLY3NxkGAa2trYopdB1HV3XsVgs6PueruuotVJKoZSCJLquwzaZSWuNcRxZr9es12uOjo5Yr9es12sODg6Ypolpmjg4OODg4IBpmmit0VpjmiamaWKaJtbrNcvlkoc97GFcddVVV1111VVXXXXV/xFUrrrqqquuuuqqq/4D2cY297PN3t4eXddRa2W5XFJr5fz589RaKaXQdR1d19F1HfP5nPl8zubmJtvb22xvbzObzdjY2GCxWND3PbVWJGGb1hrr9ZrDw0OGYWAYBo6Ojjg4OGC5XLJarRiGgXEcGceRF0YSkrh48SJXXXXVVVddddVVV131fwTBVVddddVVV1111X+g1tqttvnXsg2Abe5nmxeVJCQBIAlJPDdJAEjifpKQxANJ4qqrrrrqqquuuuqqq/6PoHLVVVddddVVV131HygzAbCNbe5nG9sA2AbANgC2eW62AbCNbWxjmweSBIAk7ieJfy9JXHXVVVddddVVV1111f8RBFddddVVV1111VX/gWqt2ObfwzYAtnl+bHM/SQBIQhIAkpCEJCTx/Eji+ZEEwDXXXPNgrrrqqquuuuqqq6666n8/gquuuuqqq6666qr/QKvV6lbb2AbANi8q29gGwDYAtrGNbQBs89wkIQkASfx7SeKqq6666qqrrrrqqqv+j6By1VVXXXXVVVdd9R/MNgC2AbDNv4Vt/jUkIQlJPJAknh9J3E8SkpDEVVddddVVV1111VVX/R9CcNVVV1111VVXXfUfKCKwjW1eGNs8kG3uZxvbANjGNraxzXOTBIAkJHE/SUjifpIAkMS/5NKlS1x11VVXXXXVVVddddX/EVSuuuqqq6666qqr/gON43irbV4Q27wwtrmfbQBs88JI4n6SkMT9JPFvcc011zyYq6666qqrrrrqqquu+t+PylVXXXXVVVddddV/INvYxja2sQ2AbZ4f29jmgWxzP9sA2Oa5SeJ+kpDE/STx3CTx/Ejiqquuuuqqq6666qqr/o+ictVVV1111VVXXfUfKDNv5QWwzQtjm/vZxja2sQ2AbWzz3CRxP0lIAkASAJJ4IEncTxL3k4QkJHHVVVddddVVV1111VX/R1C56qqrrrrqqquu+g9km8zENvezzQPZBsA2LyrbPD+SAJCEJCQBIIl/q0uXLnHVVVddddVVV1111VX/R1C56qqrrrrqqquu+g+UmdgGwDYvKtsA2MY2trGNbWwDYJsXRhIAkrifJAAk8UCSeCBJ3E8SV1111VVXXXXVVVdd9X8Elauuuuqqq6666qr/QLafYRvbANjmP4JtXhBJSAJAEgCSkMS/1ZkzZx7MVVddddVVV1111VVX/e9H5aqrrrrqqquuuuo/kG1s829hm/vZxja2sc39bPOCSAJAEi+IJO4niecmiauuuuqqq6666qqrrvo/hMpVV1111VVXXXXVf6CIuNU2trENgG1sA2AbANvczzYPZJsHso1tbANgm+cmCQBJPJAkJAEgiRdGEgCSuOqqq6666qqrrrrqqv8jqFx11VVXXXXVVVf9B8pMbGMbANvczzbPzTYPZJv72cY2L4wkJAEgCUlIQhKSeFFI4oH29va46qqrrrrqqquuuuqq/yOoXHXVVVddddVVV/0Hy0wAbPNvZRsA29jGNrZ5UUjiuUniRWWbq6666qqrrrrqqquu+j+CylVXXXXVVVddddV/oIi41Ta2+dewzf1sA2Cb52ab50cSkpAEgCReEEncTxIAkgCQhCSuuuqqq6666qqrrrrq/wgqV1111VVXXXXVVf/BMpMXxjYAtnkg29gGwDa2sY1tbPOCSOKBJAEgCUlI4l/rmmuueTBXXXXVVVddddVVV131vx+Vq6666qqrrrrqqv9gmYltbGMb29jm38o2ALZ5QSQhCUkASOKFkcQLIomrrrrqqquuuuqqq676P4LKVVddddVVV1111X+giLgVwDb/VraxjW1sA2AbANvY5oWRBIAkHkgSknhBJCEJSVx11VVXXXXVVVddddX/EVSuuuqqq6666qqr/oPZxja2eSDb2Oa52eaFsQ2AbV4YSUgCQBIAknhBJPH87O3tcdVVV1111VVXXXXVVf9HULnqqquuuuqqq676D9Z1HfezzfNjGwDbANjGNra5n21sA2Cb50cSkpDE/STxQJKQxAsiiauuuuqqq6666qqrrvo/iuCqq6666qqrrrrqP9hyubzVNvezzb+GbWwDYBvbANjGNi+IJCRxP0n8e1xzzTUP5qqrrrrqqquuuuqqq/53o3LVVVddddVVV131H6yUgm1scz/b/HvY5oWRxP0kIQkASbwwkgCQxP0kcdVVV1111VVXXXXVVf9HEFx11VVXXXXVVVf9B1utVrfaBsA2z802ALZ5QWxjG9vYxja2AbCNbZ6bJCTxL5HE8yMJSQCcPXuWq6666qqrrrrqqquu+j+AylVXXXXVVVddddV/AtvY5l/LNrZ5INvczzb/EklIQhL/FpKQxFVXXXXVVVddddVVV/0fQHDVVVddddVVV131H0wSD2QbANvY5gWxzQPZxjYAtrHN8yMJSUhCEs9NEpKQxP0k8cJI4syZMw/mqquuuuqqq6666qqr/nejctVVV1111VVXXfUfbJqmW21jG9v8S2xjmweyzf1s868hCUlIQhIPJImrrrrqqquuuuqqq676f4TKVVddddVVV1111X8C2zyQbR7INgC2eW62AbCNbWxjG9vYxjbPjyQk8e8hCUlcddVVV1111VVXXXXV/xFUrrrqqquuuuqqq/6DtdZuzUxs869lGwDbPJBtXlSSeFFIAkASz+3cuXNcddVVV1111VVXXXXV/wFUrrrqqquuuuqqq/6D2eZ+trHNv4VtbGMbANvY5vmRBIAkACQhCUlI4l8iCUncr5TCVVddddVVV1111VVX/R9A5aqrrrrqqquuuuo/WGaSmdjmgWwDYBsA2zyQbQBscz/bANjmfraxzXOTBIAknpskXlSSkMRVV1111VVXXXXVVVf9H0Bw1VVXXXXVVVdd9R/M9jNs80C2+dewjW0AbANgG9u8MJIAkMRzkwSAJO4niQeSxP2uueaaB3PVVVddddVVV1111VX/u1G56qqrrrrqqquu+g9mG9vYxja2uZ9tnpttbANgmweyjW1s84JI4oEkASAJSVx11VVXXXXVVVddddX/Y1Suuuqqq6666qqr/oNFxK22sc2/h23uZxvbANjmuUlCEpIAkMT9JHE/SfxLJHHhwgWuuuqqq6666qqrrrrq/wAqV1111VVXXXXVVf/BMhPbANjm+bENgG2em21sA2Ab2wDYxjb/ESTxwkQEV1111VVXXXXVVVdd9X8AwVVXXXXVVVddddV/gszENvezjW1eGNs8kG3uZ5sHso1tnpskJCEJSfxrSOJ+kjhz5syDuOqqq6666qqrrrrqqv/dqFx11VVXXXXVVVf9B4uIW21jG9vY5kVlGwDbANjGNraxjW1s8/xI4rlJAkASL4gkJAEgiauuuuqqq6666qqrrvo/hMpVV1111VVXXXXVf4LM5PmxjW1eGNsA2AbANv8akgCQxANJ4oEk8fxI4qqrrrrqqquuuuqqq/6PoHLVVVddddVVV131nyAzsc0LYxsA29jm+bENgG1sY5vnRxIAkgCQxP0k8a+1u7vLVVddddVVV1111VVX/R9A5aqrrrrqqquuuuo/WETcCmAb29jmX8s2tgGwDYBtAGxjm+cmCQBJvDCS+JdI4qqrrrrqqquuuuqqq/4PoHLVVVddddVVV131n8A2D2Qb27wwtrGNbe5nGwDbANjmhZEEgCQkIYkXRhLPTRJXXXXVVVddddVVV131fwTBVVddddVVV1111X+C1tqttrHN82MbANu8MLaxjW1sA2AbANs8P5J4bpIAkMQLIglJAEjimmuueTBXXXXVVVddddVVV131vxuVq6666qqrrrrqqv8EtrENgG3+tWxjGwDb3M82ALZ5bpJ4fiRx1VVXXXXVVVddddVV/08RXHXVVVddddVVV/0nKKVgG9s8kG1s89xs8/zYBsA2tnlutnkgSQBIQhKS+NeSxKVLl7jqqquuuuqqq6666qr/Awiuuuqqq6666qqr/hOsVqtbeQDbPDfbPD+2AbANgG1sYxvb2OaFkcTzI4n7SeKBJHHVVVddddVVV1111VX/B1G56qqrrrrqqquu+k+SmQDYBsA2z49tAGxjGwDbANjGNvezDYBtHkgSDySJF5Uknpskrrnmmgdz1VVXXXXVVVddddVV/7sRXHXVVVddddVVV/0niAgAbPNvZZv72cY2ALYBsM1zk4QkACQhCUk8P5J4bpKQxFVXXXXVVVddddVVV/0fQeWqq6666qqrrrrqP8E4jrfaxjYAtnkg27wwtgGwjW1sA2CbF0QSL4gk/jUkcdVVV1111VVXXXXVVf8HULnqqquuuuqqq676T5CZ2AbANvezzQPZ5rnZ5vmxDYBtbPPCSOL5kYQknh9J3O/SpUtcddVVV1111VVXXXXV/wFUrrrqqquuuuqqq/4T2L7VNra5n20AbPOC2OZ+trGNbWxjG9u8MJKQBIAk/iWSuOqqq6666qqrrrrqqv/DqFx11VVXXXXVVVf9J7CNbV5UtrHN/WxzP9vYBsA2tgGwjW1eGElIAkASLypJnDlz5sFcddVVV1111VVXXXXV/25Urrrqqquuuuqqq/4TZCa2sY1tbPPcbANgmweyDYBtbHM/29zPNi+MJP6tJHHVVVddddVVV1111VX/R1C56qqrrrrqqquu+k9g+xmZyX8E29jGNraxzQsjCQBJ3E8SL4wkACQBIImrrrrqqquuuuqqq676P4DKVVddddVVV1111X8C29jGNrYBsI1tXhjbANjGNrYBsM0D2cY2DyQJSQBIAkASz48kXpi9vT2uuuqqq6666qqrrrrq/wAqV1111VVXXXXVVf8JIuJW29zPNvezjW0AbPMvsQ2AbWxjmweyzb+HJB5IEra56qqrrrrqqquuuuqq/wOoXHXVVVddddVVV/0nyExsY5sXlW0AbHM/29jGNraxDYBtAGzz3CQBIAkASbwoJHE/SVx11VVXXXXVVVddddX/AVSuuuqqq6666qqr/pNkJraxzb/ENg9kG9vczza2AbANgG1eEEk8P5K4nyRemGuuuebBXHXVVVddddVVV1111f9uVK666qqrrrrqqqv+E0TErbZ5YWwDYJsXxDa2uZ9tXhhJPJAkACQhCQBJ/EskcdVVV1111VVXXXXVVf8HULnqqquuuuqqq676T5KZ2MY2trGNbV4Y29zPNvezjW1sYxvbvCCSAJDEv5YkJLG/v89VV1111VVXXXXVVVf9H0Bw1VVXXXXVVVdd9Z/ENrb517KNbQBsYxvb2AbANgC2sc3zI4n7SeIFkcTzY5urrrrqqquuuuqqq676P4Dgqquuuuqqq6666j9BRNxqG9vY5oFsYxsA2/xr2AbANv+ZJAFwzTXXPJirrrrqqquuuuqqq67634vKVVddddVVV1111X8S29zPNrZ5QWxjmweyjW1sYxvb2MY2D2SbF0QSLwpJXHXVVVddddVVV1111f9BBFddddVVV1111VX/SVprt9rmgWzzwtgGwDb3s41tbHM/29jm+ZEEgCT+rSRx1VVXXXXVVVddddVV/wcQXHXVVVddddVVV/0nyUxsY5vnxzbPj20AbGObB7KNbe5nGwDbAEgCQBIPJIkHksRzkwSAJADOnj3LVVddddVVV1111VVX/S9H5aqrrrrqqquuuuo/Sa2V+9nmBbHNC2Mb29jGNraxjW1eFJIAkIQknpsk7icJAElEBFddddVVV1111VVXXfW/HMFVV1111VVXXXXVf5LVanWrbWwDYBsA29jmRWGb+9nm+bHN8yMJSfxb2AbgzJkzD+aqq6666qqrrrrqqqv+9yK46qqrrrrqqquu+k9kGwDb/Etscz/b2AbANrYBsI1tbGMb2zw/kvj3kMRVV1111VVXXXXVVVf9H0Dlqquuuuqqq6666j9JRGAb29zPNg9kGwDbANjGNvezDYBtbGMb29jmBZHECyMJAElcddVVV1111VVXXXXV/3FUrrrqqquuuuqqq/6TjON4q23+vWwDYJsHss1/BklI4vz581x11VVXXXXVVVddddX/clSuuuqqq6666qqr/pPYxja2sY1tHsg2L4htbANgG9vYxja2sQ2AbV4QSUhCEpL41yqlcNVVV1111VVXXXXVVf/LEVx11VVXXXXVVVf9J8nMW21jmweyjW3uZ5sXxDYAtgGwjW2em20eSBL/Ea655poHc9VVV1111VVXXXXVVf97EVx11VVXXXXVVVf9J7GNbR7INi+IbQBsA2AbANsA2OZ+trGNbf49JAEgCQBJAEjiqquuuuqqq6666qqr/g+gctVVV1111VVXXfWfJDOxjW1sY5vnZpsHss0D2QbANraxjW3+LSTxwkjigSRx1VVXXXXVVVddddVV/8tRueqqq6666qqrrvpPYvsZtnlR2OaBbHM/29gGwDa2sY1tAGzzQJIAkIQkHkgS/xJJAFy4cIGrrrrqqquuuuqqq676X47gqquuuuqqq6666j+JbWxjG9vczzYvCtvY5n62sQ2AbWxjm3+JJJ6bJP4lEcFVV1111VVXXXXVVVf9L0flqquuuuqqq6666j9JRNyamTyQbe5nm+fHNg9kG9vYBsA2z802DySJB5LECyKJ5yYJgDNnzjyIq6666qqrrrrqqquu+t+LylVXXXXVVVddddV/kszENrYBsM39bHM/2zw32wDY5oFsYxvb2MY2trnqqquuuuqqq6666qqrni8qV1111VVXXXXVVf+JMhPb2OZfYhvb3M82ALaxjW1sA2Cb52abB5LE8yOJF4Ukrrrqqquuuuqqq6666n85KlddddVVV1111VX/SSLiVtu8MLZ5UdjGNraxDYBtbGObF0QS/xqSAJDE7u4uV1111VVXXXXVVVdd9b8clauuuuqqq6666qr/RJmJbWxjG9vY5rnZ5n62uZ9tbPNAtrHNA9nmBZEEgCReFJK46qqrrrrqqquuuuqq/yOoXHXVVVddddVVV/0nykz+LWxjm/vZxja2uZ9tbPNvJYkXRhLXXHPNg7nqqquuuuqqq6666qr/vahcddVVV1111VVX/SeJiFsBbGObB7KNbQBscz/bPJBtbGMb29jGNra5n22emyQeSBL/EkncTxJXXXXVVVddddVVV131fwDBVVddddVVV1111X8i29gGwDa2eUFs88LYBsA2trGNbQBs89wk8dwk8fxI4rlJ4qqrrrrqqquuuuqqq/6XI7jqqquuuuqqq676T9R1HbZ5INu8MLaxjW1sYxvbANjGNraxDYBtAGwDIIn7SeKFkcQLsru7y1VXXXXVVVddddVVV/0vR3DVVVddddVVV131n+jo6OhW29jm+bENgG3+JbaxzQPZ5j+aJAAkcdVVV1111VVXXXXVVf/LUbnqqquuuuqqq676T1Rr5X62uZ9tXlS2sY1tbGMb29jmfrZ5QSTxryUJgGuuuebBXHXVVVddddVVV1111f9eBFddddVVV1111VX/iVar1a22sQ2Abe5nm+dmm/vZxjbPzTa2AbCNbf6jSOKqq6666qqrrrrqqqv+D6Fy1VVXXXXVVVdd9Z/MNgC2AbDNA9kGwDYAtrHN/WxjG9vYxjYAtnkg27wwkrifJP4le3t7XHXVVVddddVVV1111f9yVK666qqrrrrqqqv+E0UEtrHNv4VtAGxjG9sA2MY2trHN8yMJSQBI4n6SeCBJXHXVVVddddVVV1111f9RVK666qqrrrrqqqv+E43jeKttXhDbvCC2AbDN/WxjG9sA2OaBbHPVVVddddVVV1111VVXPQvBVVddddVVV1111X+izATANraxDYBtHsg2D2SbB7KNbQBsA2AbANs8kG0k8e8hCUmcOXPmwVx11VVXXXXVVVddddX/XlSuuuqqq6666qqr/hPZvjUzsc39bANgm+dmmweyjW0AbGMb29jGNrYBsI1tnh9J/GtIAkASV1111VVXXXXVVVdd9b8cwVVXXXXVVVddddV/ItvY5l/DNgC2uZ9tAGwDYJv72eZFJYkXRBJXXXXVVVddddVVV131fwyVq6666qqrrrrqqv9EmYltbGMb2zw32wDY5rnZxja2sY1tbGMb29gGwDb/0fb29rjqqquuuuqqq6666qr/5Qiuuuqqq6666qqr/hPZfoZt/rVs89xsA2AbANsA2AbANrZ5UUnifpJ4IElcddVVV1111VVXXXXV/wFUrrrqqquuuuqqq/4T2cY2trENgG1sA2AbANs8N9sA2MY2ALaxjW0AbANgm+dHEv8akniga6655sFcddVVV1111VVXXXXV/14EV1111VVXXXXVVf+JJN2amdzPNvezzXOzjW3uZ5v72cY2ALaxjW1s8y+RhCT+NSRx1VVXXXXVVVddddVV/8tRueqqq6666qqrrvpPZBvb2MY2/xa2sY1tAGxjG9s8kG0eSBJXXXXVVVddddVVV131/xyVq6666qqrrrrqqv9kmYltXhDbANjmfrZ5fmxjGwDb2MY2/1aSeG6SANjf3+eqq6666qqrrrrqqqv+lyO46qqrrrrqqquu+k8UEbfyALaxjW3+JbaxDYBtbGMb29gGwDa2uZ9tnpsk/rUkYZurrrrqqquuuuqqq676X47gqquuuuqqq6666j9ZZmIb2zw32zw32zyQbe5nGwDb2OZ+trHNfyRJAFxzzTUP5qqrrrrqqquuuuqqq/53Irjqqquuuuqqq676T9ZawzbPzTb3sw2AbZ4f29gGwDa2sY1tbPNAtnlhJCGJf4kkrrrqqquuuuqqq6666n85KlddddVVV1111VX/iSLiVkkA2MY2tvmX2MY2trENgG1sY5v72QbANgC2ueqqq6666qqrrrrqqqueheCqq6666qqrrrrqP1lmYpsHss39bANgmxfENgC2sY1tbANgGwDb/FtIAkASz+38+fNcddVVV1111VVXXXXV/2JUrrrqqquuuuqqq/6TdV2HbWzzr2Ub2wDY5n62sY1tbGObB7LN8yOJF4Ukrrrqqquuuuqqq6666v8Agquuuuqqq6666qr/ZEdHR7faBsA297ONbZ6bbQBscz/b2MY2trGNbWxzP9s8N0kASOJFIQlJAEgC4MyZMw/mqquuuuqqq6666qqr/neictVVV1111VVXXfWfrNaKbWwDYJvnZhsA2wDY5n62uZ9tbPNAtrENgG2uuuqqq6666qqrrrrqqmchuOqqq6666qqrrvpPtlqtbuW52OZFYRsA29gGwDa2sY1tAGxjGwDbPD+S+Nc6d+4cV1111VVXXXXVVVdd9b8YwVVXXXXVVVddddV/AdvYxjbPzTYAtvmX2AbANraxjW3+M0giIrjqqquuuuqqq6666qr/xahcddVVV1111VVX/SeLCGzz3GzzwtgGwDa2sY1tbGMb29jGNraxjW2emyT+JZJ4IEkARARXXXXVVVddddVVV131vxjBVVddddVVV1111X+ycRxvtY1tbGOb+9nmudnGNgC2uZ9tAGxjm/8q11xzzYO56qqrrrrqqquuuuqq/52oXHXVVVddddVVV/0ny0xs80C2eSDbANjmudnGNgC2sQ2AbWxjG9vYxja2eVFI4qqrrrrqqquuuuqqq/6Po3LVVVddddVVV131n8z2rbaxzb+GbR7INrYBsI1tbGOb/wySkMRVV1111VVXXXXVVVf9L0blqquuuuqqq6666j+ZbWwDYBvbPD+2eW62AbDN/WxjG9vczza2+Y924cIFrrrqqquuuuqqq6666n8xKlddddVVV1111VX/yTIT29jmgWwDYJsHso1t7mcbANvYxja2AbCNbWwDYBsA2/xbSeJ+EcFVV1111VVXXXXVVVf9L0blqquuuuqqq6666j+Z7WdkJraxDYBtAGzzorANgG1sA2Ab29gGwDYAtvmPdObMmQdx1VVXXXXVVVddddVV/ztRueqqq6666qqrrvpPZpsHss1zsw2Abe5nG9vYBsA297ONbWwDYBsA2/xLJPEvkYQkJHHVVVddddVVV1111VX/i1G56qqrrrrqqquu+k8WEbdmJrb5t7KNbWxjG9vYBsA2ALZ5QSTx/EjigSTxQBcvXuSqq6666qqrrrrqqqv+F6Ny1VVXXXXVVVdd9Z8sM7ENgG0AbGMbANsA2OZ+tnl+bGMb29jGNraxzf1sA2Cb5yaJF0QSz00SV1111VVXXXXVVVdd9b8Ylauuuuqqq6666qr/ApmJbQBscz/bPDfb3M82trGNbZ6bbQBsA2CbF4Uk/iWSuOqqq6666qqrrrrqqv/lqFx11VVXXXXVVVf9J4uIW21jG9u8qGzz3GxjG9vYxja2eW62eW6S+NeSxDXXXPNgrrrqqquuuuqqq6666n8nKlddddVVV1111VX/BWzzwtgGwDbPj21sYxvb2MY2ALaxDYBtrrrqqquuuuqqq6666qpnIbjqqquuuuqqq676L9Bawza2sY1tbPOC2OZ+tnkg29jGNraxjW3uZ5t/DUk8N0kASOKqq6666qqrrrrqqqv+FyO46qqrrrrqqquu+k8WEbdKwjbPj20AbANgGwDb2AbANraxzQPZ5n62sc1/FEns7u5y1VVXXXXVVVddddVV/4tRueqqq6666qqrrvovkJnYxjYPZJt/iW3uZxvb2MY2trGNbe5nG9v8W0niga655poHc9VVV1111VVXXXXVVf87EVx11VVXXXXVVVf9F6i1cj/b2OZfyzYAtrGNbQBsY5v/DJK46qqrrrrqqquuuuqq/8UIrrrqqquuuuqqq/4LLJfLW21jm/vZ5n62AbDNA9kGwDYAtgGwjW1scz/b2Oaqq6666qqrrrrqqquuehaCq6666qqrrrrqqv8CtVZsA2Cbf4ltbANgGwDbANjmfraxjW3uZ5v/KHt7e1x11VVXXXXVVVddddX/YgRXXXXVVVddddVV/wVWq9WttnlutrENgG0AbPPcbANgG9vYxja2sY1tbGMbANvY5kUliecmiauuuuqqq6666qqrrvpfjspVV1111VVXXXXVfxHb2AbANi8K29zPNrYBsI1tAGxz1VVXXXXVVVddddVVVz1fVK666qqrrrrqqqv+C0QEtrGNbQBs86KwjW3uZxvb2MY2ALYBsI1t/r0kASCJM2fOPJirrrrqqquuuuqqq67634nKVVddddVVV1111X+BYRhu5YWwDYBtAGxjmweyjW1sA2Ab29jGNs+Pba666qqrrrrqqquuuur/MSpXXXXVVVddddVV/wVsYxvbANgGwDa2eUFs8/zYBsA2trmfbWxjm38LSTzQ3t4eV1111VVXXXXVVVdd9b8Ylauuuuqqq6666qr/ArZvzUwAbANgmweyDYBtHsg2trGNbWxjG9sA2MY2ALb5jyKJq6666qqrrrrqqquu+l+O4Kqrrrrqqquuuuq/gG0AbPPvZRvb2MY2ALZ5bra56qqrrrrqqquuuuqq/+eoXHXVVVddddVVV/0XyExsA2Ab2zw/tgGwjW3uZxvb2OZ+trGNbQBsYxvb/HtI4n6SuOaaax7MVVddddVVV1111VVX/e9E5aqrrrrqqquuuuq/gO1nZCa2eSDbANjm+bGNbe5nG9vYBsA2trHNA9nmqquuuuqqq6666qqrroLgqquuuuqqq6666r+AbWzzQLYBsM0D2eb5sQ2AbWxjm/vZBsA2tvm3kMRzk8RVV1111VVXXXXVVVf9L0blqquuuuqqq6666r9ARNxqG9vYxjbPzTYviG0AbHM/29jGNgC2+Y8iCUns7e1x1VVXXXXVVVddddVV/4tRueqqq6666qqrrvovkJnYxjYvKtvYxjYAtgGwjW1sYxvb2AbANraxjW1eGElcddVVV1111VVXXXXV/3EEV1111VVXXXXVVf9FMhMA2wDYxjYAtgGwDYBtHsg2ALaxjW0AbGMb2/xnuuaaax7MVVddddVVV1111VVX/e9D5aqrrrrqqquuuuq/QETcahvbANjmfrZ5UdjmfraxzQPZxjYPZJt/D0lcddVVV1111VVXXXXV/2JUrrrqqquuuuqqq/6LZCa2sc0LY5sHss39bGMbANvYxja2uZ9tbPMf5ezZs1x11VVXXXXVVVddddX/UgRXXXXVVVddddVV/0UyE9u8ILZ5INvYBsA2trmfbQBsYxvbANjmfrb595JERHDVVVddddVVV1111VX/SxFcddVVV1111VVX/ReIiFt5JtvYxja2eX5s8/zYxja2sY1tbGMb29jGNv8RJGEbgDNnzjyYq6666qqrrrrqqquu+t+HylVXXXXVVVddddV/EdvY5rnZxjYAtnlutnkg2wDY5gWxzX8ESVx11VVXXXXVVVddddX/YlSuuuqqq6666qqr/ouUUrCNbV4Y2zw329jGNgC2sY1tbGMb29jGNg9kmweSxFVXXXXVVVddddVVV/0/QXDVVVddddVVV131X2S1Wt1qGwDb2OaFsY1tnpttbANgG9vYxjb3s41t/q0kcb9z585x1VVXXXXVVVddddVV/0tRueqqq6666qqrrvovUmvludnmfra5n23uZxvb2MY297ONbR7INra5n23+PSQREVx11VVXXXXVVVddddX/UgRXXXXVVVddddVV/0VWq9WttrGNbe5nG9sA2OZfYhvb2AbANraxzX+GiOCqq6666qqrrrrqqqv+lyK46qqrrrrqqquu+i9kG9u8qGxzP9vYBsA2ALaxjW1sYxvb2ObfShLP7ZprrnkwV1111VVXXXXVVVdd9b8Plauuuuqqq6666qr/IpmJbe5nG9s8N9sA2AbANra5n20AbGMb29zPNvezzb+WJO4niauuuuqqq6666qqrrvpfjspVV1111VVXXXXVf5HMvNU2trHNc7PNv8Q2trGNbWwDYBvbANjmP4okJHHVVVddddVVV1111VX/S1G56qqrrrrqqquu+i9iG9s8N9s8N9s8N9s8kG0AbGMb29zPNgC2+fe6ePEiV1111VVXXXXVVVdd9b8Ulauuuuqqq6666qr/IrZvtY1tbGOb+9kGwDYPZBsA2wDYxja2AbCNbR7INv/Rzpw58yCuuuqqq6666qqrrrrqfx8qV1111VVXXXXVVf9FbGObB7LNc7MNgG0AbANgm/vZxja2sY1tbHM/29jmfrb5t5LEVVddddVVV1111VVX/S9F5aqrrrrqqquuuuq/SGZiG9s8P7b5l9jGNgC2uZ9t7mebB7LNv5Ukrrrqqquuuuqqq6666n8xKlddddVVV1111VX/RWw/wza2sY1tAGzz3GzzQLZ5INsA2MY2trHNf4bd3V2uuuqqq6666qqrrrrqfykqV1111VVXXXXVVf9FbGObB7INgG0AbPNAtrENgG1sYxvb2MY2tgGwDYBtbGMb2/xbSeKqq6666qqrrrrqqqv+l6Ny1VVXXXXVVVdd9V9E0q22sY1t/iW2eWFscz/b/GeRxFVXXXXVVVddddVVV/0vReWqq6666qqrrrrqv4htMpP72eb5sc1zs41tbGMb2wDYxja2sQ2AbWzz7yEJAEkAXHPNNQ/mqquuuuqqq6666qqr/vchuOqqq6666qqrrvovZBvb2OZ+tgGwzf1scz/bPJBtAGxjG9sA2OaBbPMfQRJXXXXVVVddddVVV131vxTBVVddddVVV1111X+RiLg1M7ENgG1sA2Cb58c2D2QbANvYxja2sQ2AbWzzH2l3d5errrrqqquuuuqqq676X4rKVVddddVVV1111X8D2zw/trmfbe5nG9sA2Oa52cY297MNgG1s80C2+deQxFVXXXXVVVddddVVV/0vRXDVVVddddVVV131X6i1hm1eGNv8S2xjG9vYBsA2ALb5j3bNNdc8mKuuuuqqq6666qqrrvrfh8pVV1111VVXXXXVf5GIuFUStgGwjW1sA2Cb52Yb29zPNraxjW1sYxvbANgGwDa2+feShCSuuuqqq6666qqrrrrqfymCq6666qqrrrrqqv9CmQmAbR7INg9kmweyjW1eENvYBsA2z49trrrqqquuuuqqq6666v8ZKlddddVVV1111VX/hUop2OYFsc39bPPcbGMb29jGNrYBsM39bANgGwDb/GtJAuDSpUtcddVVV1111VVXXXXV/1IEV1111VVXXXXVVf+FVqvVrbaxjW1sY5sXxjYAtnlutrGNbe5nGwDbXHXVVVddddVVV1111f9zVK666qqrrrrqqqv+C9Vasc3zYxsA29zPNgC2AbCNbWxjm/vZxjb/GSRx5syZB3PVVVddddVVV1111VX/+xBcddVVV1111VVX/RdarVa32sY2trmfbR7INv8S29jGNvezjW1scz/b/GtI4n6SuOqqq6666qqrrrrqqv/FCK666qqrrrrqqqv+C9nm38o2ALaxDYBtbGMb2zyQbWxz1VVXXXXVVVddddVV/49Rueqqq6666qqrrvovFBHYxjYAtrHN/WxzP9sA2MY2ALYBsI1t7mcb2wDYxjb/Ufb29rjqqquuuuqqq6666qr/pahcddVVV1111VVX/Rcax/FW2wDY5vmxzf1s88LYxjZXXXXVVVddddVVV1111fNF5aqrrrrqqquuuuq/kG1sY5sHso1t7meb52Yb29jGNraxjW1sYxsA29jGNv8RJHHVVVddddVVV1111VX/SxFcddVVV1111VVX/ReyfattbGMb29jmX2Kb52ab+9nGNs/NNrb515IEgCQArrnmmgdz1VVXXXXVVVddddVV//tQueqqq6666qqrrvovZBvbvCC2uZ9tAGzzQLaxDYBtbHM/29gGwDb3s81VV1111VVXXXXVVVf9P0Tlqquuuuqqq6666r9Qaw3b2AbANgC2sc1zs839bGOb+9kGwDa2sc39bPPvJQmA/f19rrrqqquuuuqqq6666n8pgquuuuqqq6666qr/Ws/ITABs8/zY5oWxjW0AbANgG9sA2OY/km2uuuqqq6666qqrrrrqfykqV1111VVXXXXVVf+FbANgm/vZ5rnZ5n62sY1tbHM/29jGNvezDYBtbGObfy9JXHXVVVddddVVV1111f9SBFddddVVV1111VX/hSTdmpnYxja2eSDb3M82z49tbHM/29jGNgC2eX5sY5t/q2uuuebBXHXVVVddddVVV1111f8uVK666qqrrrrqqqv+C9nGNs/NNrZ5brZ5QWxjmweyDYBt7mebq6666qqrrrrqqquu+n+K4Kqrrrrqqquuuuq/mG1sYxsA2zyQbZ6bbWxjG9vYxja2sY1tbANgGwDb/HtJQhJnz57lqquuuuqqq6666qqr/heictVVV1111VVXXfVfKCJutc39bPP82OZ+tvmX2MY2tnkg2wDY5t8jIrjqqquuuuqqq6666qr/hQiuuuqqq6666qqr/otlJraxzXOzzf1s89xsA2Ab29jGNvezjW1s8y+xzb/GmTNnHsxVV1111VVXXXXVVVf970Jw1VVXXXXVVVdd9V8sM7HN/WxjG9s8N9sA2MY2ALZ5INvYxjYPZJurrrrqqquuuuqqq676f47KVVddddVVV1111X+hiLgVwDYAtnlutvmX2MY2tgGwDYBtAGwDYBvb/HtI4qqrrrrqqquuuuqqq/6XIrjqqquuuuqqq676L5aZANjmBbHN/WxzP9vY5oFsA2Cb/yznz5/nqquuuuqqq6666qqr/hciuOqqq6666qqrrvov1lq71TYAtgGwDYBt7mebF8Q2trGNbWxjG9vYxja2+Y8SEVx11VVXXXXVVVddddX/QlSuuuqqq6666qqr/ovZxja2AbANgG2em20AbGMbANvczzYAtvmX2OZfQxKSAJDEVVddddVVV1111VVX/S9EcNVVV1111VVXXfVfrJSCbV4Q2zyQbe5nGwDb2AbANgC2sY1tbGMb29jGNv9WkgC45pprHsxVV1111VVXXXXVVVf970Jw1VVXXXXVVVdd9V9svV7fCmAb2/x72AbANgC2+ZfY5qqrrrrqqquuuuqqq/6fILjqqquuuuqqq676L2Yb29zPNrZ5INvY5n62sY1tbANgGwDbANgGwDb/0S5cuMBVV1111VVXXXXVVVf9L0Rw1VVXXXXVVVdd9V/MNraxzQPZxjYPZJvnxzYAtgGwjW1sA2Ab29jmgWzzbxERXHXVVVddddVVV1111f9CVK666qqrrrrqqqv+i9m+1TYAtvmX2OaBbANgGwDb2OZ+tvnPcObMmQdx1VVXXXXVVVddddVV/7sQXHXVVVddddVVV/0Xy0wAbANgmweyzfNjG9sA2AbANrYBsI1tAGxzP9vY5oFs86KShCSuuuqqq6666qqrrrrqfyEqV1111VVXXXXVVf/FbN9qGwDbANjmgWzzQLZ5bra5n23uZxsA29jmqquuuuqqq6666qqr/h8juOqqq6666qqrrvovZpvMxDYPZBvb3M82tnlutrENgG1sA2Ab2wDY5rnZ5t/q4sWLXHXVVVddddVVV1111f9CVK666qqrrrrqqqv+i9nmgWzzwtjmfra5n23uZ5v72QbANv9RJHHVVVddddVVV1111VX/CxFcddVVV1111VVX/RdrrWEb29gGwDb3s83zY5v72QbANrYBsI1tAGxzP9v8e0gC4JprrnkwV1111VVXXXXVVVdd9b8Llauuuuqqq6666qr/es/ITGzzgtjmgWxzP9sA2OZ+trENgG3uZ5t/D0kASOKqq6666qqrrrrqqqv+FyK46qqrrrrqqquu+m9gGwDb2AbANra5n23+Jbaxzf1scz/b3M82V1111VVXXXXVVVdd9f8Qlauuuuqqq6666qr/YpJutY1t/iW2sQ2AbWxjG9vYxjYAtrGNbQBs8+8hiQeShG2uuuqqq6666qqrrrrqfxmCq6666qqrrrrqqv9itrGNbWwDYJv72eZfwza2eX5sY5v72ebfYnd3l2uuuebBXHXVVVddddVVV1111f8uVK666qqrrrrqqqv+i0XErZnJ/WwDYJv72eaBbANgGwDb2MY2tgGwjW0AbGOb/wiSuOqqq6666qqrrrrqqv+lqFx11VVXXXXVVVf9N8hMbHM/2wDY5n62eSDbANjmudnmX2KbfytJXHXVVVddddVVV1111f9CVK666qqrrrrqqqv+G9jGNraxzQtiG9s8P7axjW0AbGObf4ltXhSSuN+lS5e46qqrrrrqqquuuuqq/4WoXHXVVVddddVVV/0Xi4hbbWMb29zPNgC2eW62AbANgG0eyDYPZBvb2AbANv9eZ86ceTBXXXXVVVddddVVV131vwuVq6666qqrrrrqqv8GpRRsA2Ab2wDYBsA2z802ALYBsI1tbANgG9s8N9v8W0lCEpK46qqrrrrqqquuuuqq/4UIrrrqqquuuuqqq/4brFarW21jmxfENrZ5fmzzQLZ5INv8R9rb2+Oaa655MFddddVVV1111VVXXfW/C8FVV1111VVXXXXVf4Npmm61jW1sYxvbANjmgWxjGwDb2AbANraxDYBtbPPvIYnnJglJXHXVVVddddVVV1111f9CBFddddVVV1111VX/DWxjm+dmGwDbPDfb3M82D2Sb+9kGwDb/FpJ4bnt7ewBcc801D+aqq6666qqrrrrqqqv+9yC46qqrrrrqqquu+m9QSsE2trHN82Mb2zw32wDYxja2sY1t7mcbANu8qCTxQJKQhCQkAXDmzJkHc9VVV1111VVXXXXVVf97ULnqqquuuuqqq676b7Ber2/NTGwDYBvbANjmgWxjGwDbANjmfrYBsI1t/iWS+JdI4oEkcf78ea666qqrrrrqqquuuup/GYKrrrrqqquuuuqq/waZeSuAbWxzP9u8ILZ5INvYBsA2/xkkIQlJXLx4kWuuuebBXHXVVVddddVVV1111f8eVK666qqrrrrqqqv+G2Qmmcn9bGOb+9nGNs/NNraxzf1sA2Ab2wBIwjYvKkm8MJKICK666qqrrrrqqquuuup/GSpXXXXVVVddddVV/w0y8xmZiW1scz/b2OZ+trGNbZ6bbWwDYJsHss3zI4kXlSQAJCGJ3d1dzpw58yCuuuqqq6666qqrrrrqfw+Cq6666qqrrrrqqv8Gkm7NTGxjG9v8S2wDYBvbANjGNraxjW1eFJK4nyQeSBL3kwSAJC5dusQ111zzYK666qqrrrrqqquuuup/D4Krrrrqqquuuuqq/ya2sc39bHM/29jmudnmfrYBsM0D2eb5kcQDSUISDyQJAEncTxKSuHTpEtdcc82Dueqqq6666qqrrrrqqv89CK666qqrrrrqqqv+G0i6NTOxjW1sA2Ab29zPNraxzf1sYxsA2wDYxja2AbCNbf41JPFAknigvb09zpw582Cuuuqqq6666qqrrrrqfw+Cq6666qqrrrrqqv8mrTVsYxsA29zPNs/NNra5n20AbANgG9vY5n62eW6SeFFJQhKS2N/f56qrrrrqqquuuuqqq/6XIbjqqquuuuqqq676bxARt9omMwGwDYBtbANg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326tYRvbPJBtHsg2trGNbQBsYxsA29jGNraxDYBtACRxP0lIQhKSAJAEgCTuJwlJSEISkogI7rzzTq655poHv9iLvdhrc9VVV1111VVXXXXVVf8zEVx11VVXXXXVVVf9N5um6RmZSWZiG9vYxjYAtrGNbZ6bbWxjG9sA2MY297PNc5PEc5MEgCQAJCEJAElIQhKSkERE8PSnP53XeZ3XeS+uuuqqq6666qqrrrrqfyaCq6666qqrrrrqqv9+t07ThG1sYxvb2MY2D2Qb29jGNrYBsI1tbGMb29jGNs9NEgCSkIQkJAEgCQBJSAJAEveThCQiglIKf/u3f8uLvdiLvTZXXXXVVVddddVVV131PxPBVVddddVVV1111X8zSbdO00RmYhvb2AbANraxjW3uZxvbANjGNraxjW0AbGOb50cSz00SAJK4nyQAJCEJSUQEkogI7rjjDq655poHv9iLvdhrc9VVV1111VVXXXXVVf/zEFx11VVXXXXVVVf9N4uIW22TmWQmtrGNbQBsA2Ab29jmfraxDYBtbANgm/vZ5gWRhCQkASAJAElIAkASAJKQhCQigojg8PCQpz3tabzYi73Ya3HVVVddddVVV1111VX/8xBcddVVV1111VVX/Q+wXC5/u7WGbWwDYBvbANjmgWxjG9sA2MY2trGNbWxjGwDbPDdJ3E8SkgCQxP0kASAJSUhCEpKICEop3Hbbbbz4i7/4a3PVVVddddVVV1111VX/8xBcddVVV1111VVX/Q/QWiMzsY1tbGMbANvYxja2sc0D2cY2ALaxjW1sA2CbB5KEJAAkIYn7SQJAEpIAkIQkACQhCUlEBKUU/uEf/oEzZ848mKuuuuqqq6666qqrrvqfh+Cqq6666qqrrrrqf4Bpmn67tUZmYhvbANjGNg9kG9vYxja2sY1tbGMb29jGNi+IJO4nCUkASEISAJKQBIAkJCEJSUgiIjg8POTg4ODBr/M6r/PeXHXVVVddddVVV1111f8sBFddddVVV1111VX/A9j+ndYamUlmYhvb2AbANraxzf1sYxvbANgGwDb3s41tbPP8SEISAJKQhCQAJCEJAElIAkASkogIIoJSCrfddhuv8zqv815cddVVV1111VVXXXXV/ywEV1111VVXXXXVVf8D2L51miYyE9vYxja2sY1tAGxjG9s8kG1sYxvb2MY2trmf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/8lms9lvXXvtta+9ubnJbDaj6zq6rqOUQq2VUgoRQSmFiCAiKKUQEZRSiAhKKUQEpRQigoiglEJEEBFIIiKQBIAkAGwDYBvb2MY2trGNbWxjm8zENraxjW1sYxvb2MY2ALaxjW1sYxvb2CYzsY1tMhPb2MY2tvmfwja2sc3m5iZbW1tsbW1xww03sL29zWw2u/Uf/uEffvu3fuu3vucf/uEffpurrrrqqquuuuqqq/47oAc96EFcddVVV1111VVX/U/Wdd1vnTlz5rW3t7eZzWb0fU/XdZRSqLVSSiEiKKUQEZRSiAgiglIKEUEphYiglEJEEBGUUogIIoKIQBKSkASAJABsA2Ab29jGNraxjW1sYxvb2MY2trGNbWwDYBvbANjGNgC2sY1tbGMb2wDYxja2uZ9tnh9J2AZAEraRxL+XbQAkAWAbANvYxja2yUwyk9Yam5ubXHfddTz60Y9mNpvd+lu/9Vvf/du//dvfc999993KVVddddVVV1111VX/VdCDHvQgrrrqqquuuuqqq/4ny8zXvvbaa3/r2LFjLBYL+r6n1kqtlVorpRRKKUQEpRQigoiglEJEEBGUUogISilEBBFBKYWIICKICCQREUgCQBIAtrmfbWxjG9vYxja2sY1tbANgG9vYxjb3s839bANgGwDbANgGwDYAtrHN/Wzz3CTxX8U2ALaxTWZiG9tkJplJZtJaY5omNjY2eMQjHsGrvuqrct9999369V//9e/zD//wD7/NVVddddVVV1111VX/2dCDHvQgrrrqqquuuuqqq/4ny8wHnzhx4uknT55ksVgwm83ouo5aK7VWSimUUogISilEBBFBKYWIICIopRARlFKICCKCUgoRQUQQEUQEkpCEJAAkAWAbANsA2MY2trENgG1sYxvbANjGNvezzb+VbWzzP4FtbGMb22QmtslMMpPMJDNprdFao7XGNE0sFgse+chH8tjHPpZhGG79rM/6rNe57777buWqq6666qqrrrrqqv8s6EEPehBXXXXVVVddddVV/9PNZrPfuuaaa157c3OT+XxO13XUWqm1UkqhlEJEUEohIiilEBFEBKUUIoKIoJRCRBARlFKICCKCiCAikEREACAJAEkA2AbANgC2sQ2AbWxjGwDb2OZ+tnlukrifJCQBIAlJSEISAJKwDYBtbPPcJPFfxTaZiW0yk8wkM8lMWmu01shMWmu01mit0VpjmiamaWKxWPCIRzyCRz7ykbf+1m/91nf/6I/+6Odw1VVXXXXVVVddddV/BipXXXXVVVddddVV/wsMw/Db0zS9dmaSmdjGNraxjW0AbANgG9vYxja2sY1tbGMb29jGNraxjSRsI4nnJgnbSMI2knggSdjGNpKwzQsiCUlIAiAikIQkIoKIICIopRARSMI2trENgG0AJPGiksS/hW3uJ4nMJDPJTFprZCatNVprTNPENE201pimiYggIogIIoKIYL1e89d//dc84QlPePA7vMM7fDbAj/7oj34OV1111VVXXXXVVVf9R0MPetCDuOqqq6666qqrrvqfrrX22tdee+1vHTt2jMViQd/3dF1HrZVSCqUUSilEBKUUIoKIoJRCRBARRASlFCKCiKCUQkQQEUQEEUFEIAlJSEISAJK4n23uZxsA2wDY5n62eW6SkIQkJCGJiCAiiAgiglIKpRS6rqPWSimFiADANraxjW0AJHE/Sfxnsk1E0FqjtUZm0lpjmiamaWKaJsZxZBxHpmliHEemaWKaJlprTNNEa43WGtM0MU0T8/mcRz7ykTzykY+89bM+67Ne57777ruVq6666qqrrrrqqqv+o1C56qqrrrrqqquu+l9A0q3DMNBaIzPJTDIT29jGNrYBsI1tAGxjG9sA2MY2trGNbWxjG9vYBkASL4gkAGwjiQeShG0AJHE/SQBIQhKSiAgigoiglEIphVIKXdfRdR1939P3PbVWaq0A2MY2trGNbSQhiecmiX8rSdjmudkmIpimicyktcY0TYzjyDiODMPAMAwMw8AwDEQEEUFEME0TkpCEJCQhifV6zV/+5V9yxx13PPhjPuZjfuuv/uqvvvtHf/RHP4errrrqqquuuuqqq/4jULnqqquuuuqqq676XyAibl2tVr89TdNrt9awjW0yk4jANraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY0kbHM/SdhGEg8kCQDbSOJ+knhukpCEJCQREUQEEUEphVortVZqrfR9z2w2YzabMZ/P6fueWiuSyExsA2Ab2wBIAkASL4gk/r1sExGM40hm0lpjHEfGcWQcR9brNavVivV6Ta2ViCAiiAgkASAJSUhCEpKQxNmzZ/md3/mdB7/DO7zDZ19zzTUP/vqv//r34aqrrrrqqquuuuqqfy8qV1111VVX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+PHjXHXVVVddddVVV131n6u19teHh4c/MwzDbt/3r52ZSMI2ALb517DN/UoptNYAsI1tnpttbHM/2zw/tnkg2zyQJFpr2MY2mUlmYhvb/FtI4oEk8UCSkMQDSUISAJIAkMS/hm0AbHM/2wDYxja2sY1tpmliNptx7733fs/Zs2dv5aqrrrrqqquuuup/B8rx48e56qqrrrrqqquuuuo/n+3dYRh+Z29v73umadrt+/61bWMbANvYBsA2ALZ5fmxzv4ggM7GNbWwDYBsA29gGwDa2sQ2AbWwDYBvbANjGNraxzf1s01qjtYZtMpPMxDa2sY1tbGOb+9nmX0MSz00SknggSQBIAkASL4gkbPNAtgGwjW1sYxsA29jGNplJa42HPOQhHD9+/NZ/+Id/+B2uuuqqq6666qqr/negHD9+nKuuuuqqq6666qqr/uvY3l2v17+zt7f3PcMw7EbEg4HjtrGNbWxjm/vZxja2sY1tbGObUgqtNTIT29jGNraxjW1sYxvb2MY2trGNbWxjG9tkJraxjW1sYxsA24zjSGaSmWQmtrGNbWxjG9sA2OaBbPP8SOK5SUISz00SkpAEgCQkASCJB7LNc7PN/WwDYBvb2MY2trGNbWyTmWQm4zjySq/0SvzWb/3W93DVVVddddVVV131vwOVq6666qqrrrrqqqv+W7TWbr106dLn7O/vf/d8Pn+dra2t1zp16tR7j+NIKYVSChFBRBARSCIiAJCEJCQREUzThG0eSBL3k8QDSeKBJPFAknggSUhCEuM4kpnYxja2sc0DSUISAJKQhG0k8YJIwjbPTRL3s80DSQLANpKwjSReGEnYBkAStgGQhCQkASAJSQBIQhKXLl3izJkzD+aqq6666qqrrrrqfw8qV1111VVXXXXVVVf9t8rMZxwdHX330dHRd58/f/5zJLFYLF5rc3PztWez2YO3t7dfOyKQhCQkASCJiMA24zhimweSxP0k8fxI4rlJ4rlJQhIArTUyk/vZRhIAkpAEgCQkIQlJSOJ+tpHEc5OEbV4QSdzPNveThG0kYZt/iSRscz9J2OZ+krifJCQREVy6dAngwddcc82D77vvvlu56qqrrrrqqquu+p+PylVXXXXVVVddddVV/2O01m4F2N/fv3V/f/97eKZa64MB11ofIola64MBSimWpNYaD2BAPCcD4jkZEM/JgHhOliSeyTYR4c3Nzdfu+/7BW1tbrw1QSkESEYEkIgJJSEISkpCEJCTxgkgCwDYvjCTuZxtJ/EeShCTuJ4mI4Ny5c5w5c+bB9913361cddVVV1111VVX/c9H5aqrrrrqqquuuuqq//GmaboVYJqmZ/A/xO7u7vcA1FofvL29/V6nTp16777vH1xKoZRCRBARRASSkERE8KKSxAtimweSBIBtJPGikIRtJGEbAElI4oEkIQlJRARPetKTuOaaax78D//wD1x11VVXXXXVVVf9L0A5fvw4V1111VVXXXXVVVdd9W+Vmbur1ep3Ll269NPr9Xp3Pp+/tm1s88JI4t9KEpKQhCTuJwkASbwobANgGwDb2AbANgC2sU1m0lpje3ubnZ2dv/6Hf/iH3+Gqq6666qqrrrrqfz6Cq6666qqrrrrqqquu+g/QWnvGpUuXPuepT33qQy5evPjb6/WacRyZpolpmshMMpPMxDaZSWZiG9vYxja2sY1tbGMb29jGNraxjW1sY5v72QbANi8KSbwgknggSUQEly5d4sVf/MVfm6uuuuqqq6666qr/HQiuuuqqq6666qqrrrrqP1Br7dZ77733fe65557PXq1WjONIa43WGq01MpPMxDa2yUxsYxvb2MY2trHNi8o2D2SbF5UkXhBJSAJAEru7u1x11VVXXXXVVVf9L0Llqquuuuqqq6666qqr/oNl5q17e3uf01rjmmuu+ez5fI5tSik8UEQAkJlEBA8kCQDbvCgkAWAbSQDY5l9LEpIAkMT9JCGJ/f19zpw582Cuuuqqq6666qqr/ncguOqqq6666qqrrrrqqv8kh4eHn3PXXXd99mq1YhxHWmu01shMMpPMxDa2sY1tbANgG9vYxja2sY1tnh/b2OZfSxL3k8T9JHE/SUhCEgDnzp17MFddddVVV1111VX/O1COHz/OVVddddVVV1111VVX/Wdprf3OMAzM5/PXloQkACRxP0kASAJAEs9NEpKQxPMjCUlIAkASL4gkbHM/2wDYxja2sQ2AbTIT22QmrTVe+qVfmvvuu+937rvvvlu56qqrrrrqqquu+p+NylVXXXXVVVddddVVV/0nOzo6+px7772Xa6+99rMlASCJB4oIbANgmweShG2eH0nczzYAkrCNJJ6bJGwjCdu8KCQBIAlJPPnJT+aqq6666qqrrrrqfwmCq6666qqrrrrqqquu+i9wdHT0Pbu7u789DAPTNNFaIzOxjW1sYxvb2MY2tgGwjW1s89xsYxvb/FtJ4n6SkIQkHkgSkogILl26xGMf+9jX4qqrrrrqqquuuup/PoKrrrrqqquuuuqqq676r3Hr7u7u+yyXS8ZxZJomWmtkJplJZpKZ2MY2tgGwjW1sA2Ab29jGNs/NNrYBsM0LI4kHksRzk4Qk7ieJ3d1drrrqqquuuuqqq/6XILjqqquuuuqqq6666qr/IrZvvffee99nGAamaSIzaa2RmdjGNraxjW1sY5v72cY2trmfbWxjG9vczzYAtgGwzb+WJO4nCUlI4tKlS7z4i7/463DVVVddddVVV131Px/BVVddddVVV1111VVX/RdqrX33xYsXf3scR6ZpIjPJTDIT29jGNraxjW1sYxvb3M82trHNc7PNA9nmBZEEgCSeH0lIAkASkpDENddc82Cuuuqqq6666qqr/ucjuOqqq6666qqrrrrqqv9i+/v777Ner5mmidYamUlmkplkJpmJbWxjG9vYBsA2trHN/WxjG9vY5n62+beQhCQeSBIAkrh06RL33XcfV1111VVXXXXVVf8LEFx11VVXXXXVVVddddV/vVvPnTv33cMwME0TmUlmkpnYxja2sQ2AbQBsY5v72cY2z49tXlSSuJ8k7ieJB5IEgCQkPeiaa655MFddddVVV1111VX/sxFcddVVV1111VVXXXXVf4P1ev05wzAwTRPTNJGZ2CYzsY1tbGMb29jGNgC2sc39bGMb29jGNvezzYtKEs+PJO4nCUmcP3+eM2fOPJirrrrqqquuuuqq/9kIrrrqqquuuuqqq6666r+BpFvvu+++9xmGgdYamUlmYhvb2MY2trGNbQBsYxsA29jGNv9ZJAEgCUlIQhIXLlzgmmuueTBXXXXVVVddddVV/7NRueqqq6666qqrrrrqqv8m0zT99nq9pus6SilEBJKQhCRsYxtJ2MY2AJKwDYAkAGzz/EjCNpJ4bpKwDYAkbPMvkUREUGvlzJkzD+Kqq6666qqrrrrqfzaCq6666qqrrrrqqquu+m8SEbeePXv2s4dhYJomWmtkJrbJTGxjG9vYxjYAtrENgG1s8y+xDYBtACQBIInnJglJSAJAEgCSAJDEU5/6VK655poHc9VVV1111VVXXfU/G8FVV1111VVXXXXVVVf9N8rM71mv17TWyEwyk8zENraxjW0AbGMb2wDY5n62sc1zs839bPMvkcTzIwkASQBI4qqrrrrqqquuuup/AYKrrrrqqquuuuqqq676bxQRt+7v7//2OI601shMMhPbZCa2sY1tAGwDYBsA29jmfraxjW1s86KQBIAknpsk7icJAElcunSJF3uxF3ttrrrqqquuuuqqq/5nI7jqqquuuuqqq6666qr/ZkdHR5+9Xq+ZponMxDaZiW1sYxvb2MY2tgGwjW0AbGOb58c2/1EkIQlJXHXVVVddddVVV/0vQHDVVVddddVVV1111VX/zUopv3NwcPDb0zTRWiMzsY1tbGMb29gGwDa2sQ2Abe5nG9vczzYvCkm8IJKQxP0kcenSJa666qqrrrrqqqv+FyC46qqrrrrqqquuuuqq/wEODg5+exxHWmu01shMbJOZ2MY2trENgG0AbANgmweyjW3uZ5sXlSQkIYkHkoQkACQh6cFcddVVV1111VVX/c9GcNVVV1111VVXXXXVVf8DSPqecRxprZGZZCaZiW1sYxvb2MY2ALYBsA2AbWzz7yGJB5LEc5OEJM6dO8c111zzYK666qqrrrrqqqv+5yK46qqrrrrqqquuuuqq/wEi4tbDw8Pfbq2RmWQmtrGNbWxzP9vYBsA2ALa5n21sYxvb2OYFkcT9JPGCSOKBJCGJq6666qqrrrrqqv/hCK666qqrrrrqqquuuup/iIODg9+eponWGplJZmIb29jGNrYBsI1tAGwDYBvbvCC2eX4k8cJIAkASkpAEwLlz5zhz5syDueqqq6666qqrrvqfi+Cqq6666qqrrrrqqqv+h4iI75mmiczENplJZmIb29jGNra5n20AbHM/2/xrSeJfQxIXLlzgqquuuuqqq6666n84gquuuuqqq6666qqrrvofIiJuPTw8/O3WGpmJbWxjG9vYxja2sY1tAGwDYJv72cY2trGNbQBs88JIQhKSkMRzk4QkJBERXHXVVVddddVVV/0PR3DVVVddddVVV1111VX/gyyXy99urZGZ2MY2mYltbGOb+9nGNgC2AbCNbf6jSAJAEg8kib29Pa655poHc9VVV1111VVXXfU/F8FVV1111VVXXXXVVVf9D9Ja+53WGpmJbWxjG9vYBsA2trmfbQBscz/b/Esk8UCSeGEkASAJANucOXPmQVx11VVXXXXVVVf9z0Vw1VVXXXXVVVddddVV/4NIunWaJjKTzMQ297ONbWxjG9vYBsA2ALa5n21sA2Ab2wDY5l9DEs9NEru7u1x11VVXXXXVVVf9D0dw1VVXXXXVVVddddVV/4NExK1HR0e/nZnYxja2sY1tbGOb+9nGNgC2AbDNA9nmhZHEA0lCEs+PJK666qqrrrrqqqv+FyG46qqrrrrqqquuuuqq/2GWy+Vvt9bITGxjG9sA2AbANra5n20AbANgmxfGNg8kCQBJ3E8Sz48kJCGJa6655sFcddVVV1111VVX/c9FcNVVV1111VVXXXXVVf/DZObvZCaZSWZiG9vYBsA2trGNbWwDYBsA2wDYxjYPZJt/DUkASEISD7S7u8s111zzYK666qqrrrrqqqv+5yK46qqrrrrqqquuuuqq/2Ek3dpawza2sc39bGOb52abB7LN/WxjG9u8MJL4l0gCQBJXXXXVVVddddVV/wsQXHXVVVddddVVV1111f8wEXHrcrn87czENraxjW3uZxvb2MY297PN/WzzH0ESDyQJAElcddVVV1111VVX/Q9HcNVVV1111VVXXXXVVf8DjeNIZmIb29jGNraxjW0eyDa2AbDN/WzzwkjigSQhCUm8MJK4dOkSZ86ceTBXXXXVVVddddVV/3MRXHXVVVddddVVV1111f9A6/X6tzMT29jGNs/NNraxzf1sA2Cb+9nmgWwDYJv7SeK5SeKqq6666qqrrrrqfzmCq6666qqrrrrqqquu+h/I9m9nJraxDYBtbGOb58c2D2Sb+9nGNrZ5QSTx3CQBIAlJPLdrrrnmwVx11VVXXXXVVVf9z0Vw1VVXXXXVVVddddVV/zPdmplkJraxzQPZxja2sY1t7meb/yySkIQkAB73uMfdylVXXXXVVVddddX/XARXXXXVVVddddVVV131P1BEPMM2tgGwjW1s84LYxjYAtgGwzb9EEg8kCUn8SyRxzTXXPJirrrrqqquuuuqq/7kIrrrqqquuuuqqq6666n+o5XL527axDYBtAGxjG9vYxja2uZ9tAGwDYBvbvCgkcT9JAEjiqquuuuqqq6666n8pgquuuuqqq6666qqrrvofqrVGZmIb2wDY5oWxzQtim/9Ikrjqqquuuuqqq676H47gqquuuuqqq6666qqr/ocahuG3bWMb29gGwDYPZBvb2OZ+tgGwzQPZxja2eSBJSOKFkcT9JAEgiauuuuqqq6666qr/wQiuuuqqq6666qqrrrrqf6hxHLGNbe5nGwDb2MY2z802D2SbF5UkJCEJAEkASOJ+krjf2bNnueqqq6666qqrrvofjOCqq6666qqrrrrqqqv+5/qdzATANrZ5YWxjm/vZ5n62+Y8giftJQhJXXXXVVVddddVV/4MRXHXVVVddddVVV1111f9QtrGNbe5nG9s8kG1s80C2AbDNv5UkACRx1VVXXXXVVVdd9b8UwVVXXXXVVVddddVVV/0PFRG32sY2tnkg2wDY5rnZ5vmxzQsjCQBJvKgkcdVVV1111VVXXfU/GMFVV1111VVXXXXVVVf9D2Yb2wDY5oFs80C2sc39bANgm/vZ5oWRBIAkXhhJXHXVVVddddVVV/0vQHDVVVddddVVV1111VX/Q0XErTyTbQBsY5vnZpsXxjb3s80DSUISz48kXpjM5Kqrrrrqqquuuup/MIKrrrrqqquuuuqqq676H2wcx1ttA2CbF4VtbANgm38rSbwwkpDEVVddddVVV1111f9gBFddddVVV1111VVXXfU/WEQAYJsHss39bANgG9u8ILa5n22emyQAJPHcJCEJAEnc7/Tp01x11VVXXXXVVVf9D0Zw1VVXXXXVVVddddVV/4MNw3CrbZ4f29jmBbENgG1eVJIAkMT9JHHVVVddddVVV131vxTBVVddddVVV1111VVX/Q9mmweyjW3+JbZ5fmzzryGJB5LEA9133323ctVVV1111VVXXfU/F8FVV1111VVXXXXVVVf9DxYR3M82L4htAGxjm/vZBsA2L4wk7icJAElcddVVV1111VVX/S9H5aqrrrrqqquuuuqqq/4HG8fxVtvY5j+bJABsI4mrrrrqqquuuuqq/wMIrrrqqquuuuqqq6666v8o2zyQbQBsc9VVV1111VVXXfX/BMFVV1111VVXXXXVVVf9D2ab58c297MNgG3uZ5v72eaFkcT9JCGJF9WpU6e46qqrrrrqqquu+h+M4Kqrrrrqqquuuuqqq/4Xs81zs82/liQkcT9JSEISkrjqqquuuuqqq676X4rgqquuuuqqq6666qqr/peyzb/ENgC2AbDNv4Ukrrrqqquuuuqqq/4XIrjqqquuuuqqq6666qr/wSTxr2Gbfw9JSOKqq6666qqrrrrq/wiCq6666qqrrrrqqquu+j/KNi+MbR5IEveThCRemFIKZ8+evZWrrrrqqquuuuqq/7kIrrrqqquuuuqqq6666n8wSfx72eb5kYQkACRxP0k8P5J4oK2tLa666qqrrrrqqqv+hyO46qqrrrrqqquuuuqq/8H6vn+wJP4ltrmfbWzz3Gzz/EjifpJ4IEm8IJK46qqrrrrqqquu+h+O4Kqrrrrqqquuuuqqq/4Ha60BIIn/bJK4nyT+JcePH+e+++67lauuuuqqq6666qr/uahcddVVV1111VVXXXXV/2CS+M9gmweSBIAkJAEgiRfGNlddddVVV1111VX/wxFcddVVV1111VVXXXXV/2G2eW62eX4k8fxI4qqrrrrqqquuuup/KYKrrrrqqquuuuqqq676H04SAJL4t7LNCyKJ+0lCEpL4lxw/fpz77rvvVq666qqrrrrqqqv+5yK46qqrrrrqqquuuuqq/8FqrQ/m38g2L4gkHkgSknhukrjqqquuuuqqq676X4zKVVddddVVV1111VVX/T8miRdEEi+IbWxz9uzZZ3DVVVddddVVV131PxfBVVddddVVV1111VVX/Q9mm38L2zw/tnl+JAEgCUlI4l9y4sQJrrrqqquuuuqqq/6HI7jqqquuuuqqq6666qr/wSTx72WbF0YSAJK46qqrrrrqqquu+j+G4Kqrrrrqqquuuuqqq/6PsM2/lyReVCdOnOCqq6666qqrrrrqfziCq6666qqrrrrqqquu+h9sNps9mP8kkpAEgCQkASCJF4Vt7rvvvlu56qqrrrrqqquu+p+L4Kqrrrrqqquuuuqqq/4Hy0wk8cLY5n62+deSxHOThCSeH9sA2Oaqq6666qqrrrrqfziCq6666qqrrrrqqquu+j/GNs+PbV4QSUhCEpL4l9jm5MmTnD179lauuuqqq6666qqr/uciuOqqq6666qqrrrrqqv/BbPPvYZvnJokHksQLIgkASTw321x11VVXXXXVVVf9D0flqquuuuqqq6666qqr/geTxH8mSdxPEv8ap06d4qqrrrrqqquuuup/OCpXXXXVVVddddVVV131P1RmPpj/RJK4nyTuJwlJvCjuu+++W7nqqquuuuqqq676n4vgqquuuuqqq6666qqr/heQxP1scz/bANjmudnmRSEJAElI4kVhG9tcddVVV1111VVX/Q9H5aqrrrrqqquuuuqqq/4fkgSAJAAk8dwk8YJI4tSpU1x11VVXXXXVVVf9D0dw1VVXXXXVVVddddVV/wfZ5oFs84JI4oEk8UCSsM0D2ea+++67lauuuuqqq6666qr/2Qiuuuqqq6666qqrrrrqfzBJvCC2eSDb/FtJQhKSAJDEA0kCwDYAkrjqqquuuuqqq676X4Dgqquuuuqqq6666qqr/ofKzAfzAtjm+bGNbV4UkpCEJP61dnZ2OHv27K1cddVVV1111VVX/c9G5aqrrrrqqquuuuqqq/6XsM1/FklI4gWxzVVXXXXVVVddddX/QgRXXXXVVVddddVVV131P5QkXhS2eVFJ4l8iiRfGNseOHeO+++67lauuuuqqq6666qr/2ahcddVVV1111VVXXXXV/0OSkIQkJCEJSbwwtrnqqquuuuqqq676X4bgqquuuuqqq6666qqr/ofKzAcDSOJ+tvnXss2/liSuuuqqq6666qqr/g8guOqqq6666qqrrrrqqv+hJCGJ/2iSuJ8kJCEJSQBIAkAS95PEAx0/fpz77rvvVq666qqrrrrqqqv+ZyO46qqrrrrqqquuuuqq/6Ek8aKyzX8ESbwobHPVVVddddVVV131vwDBVVddddVVV1111VVX/Q8liX+Jbf6tJAEgCUlI4rlJ4qqrrrrqqquuuup/MYKrrrrqqquuuuqqq676H0oS/xq2eW62eX4kASAJAEkASEIS/5ITJ05w9uzZZ3DVVVddddVVV131PxvBVVddddVVV1111VVX/Q8liX8t2/xrSQJAEveTxAtjm6uuuuqqq6666qr/BQiuuuqqq6666qqrrrrqfyjbD+LfwDa2sc0LIwlJSEISkpDEi+LEiRNcddVVV1111VVX/S9A5aqrrrrqqquuuuqqq/6Higgk8V9NEs+PJO5nm/vuu+9Wrrrqqquuuuqqq/5nI7jqqquuuuqqq6666qr/oSTxwtjm30ISkpCEJCQhCUlIAkASknhBbHPVVVddddVVV131vwDBVVddddVVV1111VVX/Q8liefHNg9km38vSdxPEi+MbU6cOMHZs2dv5aqrrrrqqquuuup/NipXXXXVVVddddVVV131/4QknpskJAEgCUm8KGxz1VVXXXXVVVdd9b8AwVVXXXXVVVddddVVV/0PJenBvAC2+feQhCQkIQlJSOJFdfLkSa666qqrrrrqqqv+FyC46qqrrrrqqquuuuqq/6Ek8aKyzYtCEs+PJAAkIQlJ/Evuu+++W7nqqquuuuqqq676n43KVVddddVVV1111VVX/Q8miReVbQAk8aKQhCQkASCJ5yaJ58c2V1111VVXXXXVVf8LULnqqquuuuqqq6666qr/oSTxn0ESkrifJCQhCUlIAkASL8ipU6e46qqrrrrqqquu+l+A4Kqrrrrqqquuuuqqq/6HksS/xDb/VpKQBIAkACTx3CTx3M6ePfsMrrrqqquuuuqqq/7no3LVVVddddVVV1111VX/Q9VaH8x/MklIQhL3k4QkXhBJXHXVVVddddVVV/0vQeWqq6666qqrrrrqqqv+h8pM/jNJAkASkgCQxL9kZ2eH++6771auuuqqq6666qqr/uejctVVV1111VVXXXXVVf9DSeI/gyQkASAJSQBI4qqrrrrqqquuuur/GIKrrrrqqquuuuqqq676X842D2SbF0QS95OEJAAkASAJSUhCEs/PsWPHuO+++27lqquuuuqqq6666n8+KlddddVVV1111VVXXfU/VN/3D+Y/iSTuJwlJXHXVVVddddVVV/0fRHDVVVddddVVV1111VX/Q7XWeGFscz/b/GtJQhKSkIQkJCGJ+0niqquuuuqqq6666n8xKlddddVVV1111VVXXfU/mCQkcT/bvCC2AZCEbV4QSdxPEpKQBIAkACTxghw7doz77rvv6Vx11VVXXXXVVVf9z0dw1VVXXXXVVVddddVV/8PZ5j+CJO4nCUkASEIS95PEC2Obq6666qqrrrrqqv8lqFx11VVXXXXVVVddddX/UJIAkMS/lySemyQkIQkASUjiqquuuuqqq6666v8Qgquuuuqqq6666qqrrvpfyDb/FpKQhCQAJCEJSUhCEpIAkMT9JHG/48ePc/bs2Wdw1VVXXXXVVVdd9T8flauuuuqqq6666qqrrvofqpTyYJ4P20ji30sSkpCEJB5IEi+Iba666qqrrrrqqqv+l6By1VVXXXXVVVddddVV/0NJ4l9iG0k8P7Z5QSQhCUkASAJAEs9NEg90/Phxrrrqqquuuuqqq/6XILjqqquuuuqqq6666qr/oWzzn0ESDyQJSQBIQhL/krNnz97KVVddddVVV1111f98VK666qqrrrrqqquuuup/Adu8ILaRxL+GJCQhCUlI4oEkIQlJPLfM5Kqrrrrqqquuuup/CSpXXXXVVVddddVVV131P5Qk/rVs88JI4n6SkIQkJAEgCUm8MCdOnOC+++67lauuuuqqq6666qr/+ahcddVVV1111VVXXXXV/0CZ+SCei21eENsASOIFkQSAJCQBIAlJSAJAEv8S21x11VVXXXXVVVf9L0Hlqquuuuqqq6666qqr/p+ShCQkIYn7SUISL8iJEye46qqrrrrqqquu+l+CylVXXXXVVVddddVVV/0vZRtJ/FtIQhKSkIQkACTxorjvvvtu5aqrrrrqqquuuup/PipXXXXVVVddddVVV131P5gk/iNJQhKSkIQkJCEJAElIAkASDySJq6666qqrrrrqqv9lqFx11VVXXXXVVVddddX/UJL4zyaJiEASDySJF+TEiRNcddVVV1111VVX/S9B5aqrrrrqqquuuuqqq/4Hsv1g/gNJ4n6SkIQkJCEJSQBIQhL3k4QkHui+++67lauuuuqqq6666qr/HahcddVVV1111VVXXXXV/3GSAJCEJO4nCUlIQhIAknh+JAEgiauuuuqqq6666qr/RQiuuuqqq6666qqrrrrqfyHbANjmudnmhZGEJCQhCUlEBJKQhCQk8fxsb29z9uzZW7nqqquuuuqqq67634HKVVddddVVV1111VVX/T8kCUlIQhKSkMQDSeKqq6666qqrrrrqfzkqV1111VVXXXXVVVdd9T9QZj6YF5Ft7ieJF0YSkgCQhCQkIQlJSEISL8ixY8e47777buWqq6666qqrrrrqfweCq6666qqrrrrqqquu+h9IEpJ4braxzb+XJCQhCUlIAkASkpDEVVddddVVV1111f8BVK666qqrrrrqqquuuup/IEn8R5MEgCQkIQlJRASSkIQkHkgSV1111VVXXXXVVf+LUbnqqquuuuqqq6666qr/gSTxn0ESAJIAkIQkJCEJAEkASOK57ezscNVVV1111VVXXfW/CJWrrrrqqquuuuqqq676H0gS/5EkcT9JAEgiIpCEJCQhCQBJ3E8SD3TffffdylVXXXXVVVddddX/DgRXXXXVVVddddVVV131v5Rt/q0kIQlJSCIikIQkJHHVVVddddVVV131fwTBVVddddVVV1111VVX/c/0YP6DSUISkpCEJCQREUhCEpJ4fiQBsLOzw9mzZ5/BVVddddVVV1111f8OVK666qqrrrrqqquuuup/IEn8Z5JERCAJSUhCEpKQhCSuuuqqq6666qqr/g+gctVVV1111VVXXXXVVf8DSUIS/1q2uZ8knh9JAEhCEpKQRETwQJKQxP0kcezYMa666qqrrrrqqqv+FyG46qqrrrrqqquuuuqq/4Ek8aKwzf1s8/xI4n6SAJCEJCICSUhCEpKQxAtim/vuu+9Wrrrqqquuuuqqq/53ILjqqquuuuqqq6666qr/gSLiwbyIbPMvkYQkACQhCUlIIiKICCQhCQBJXHXVVVddddVVV/0fQHDVVVddddVVV1111VX/A9nmhbHNA9nm+ZHEA0lCEpKQhCQkIQlJSEISDySJ++3s7HD27Nlbueqqq6666qqrrvrfgcpVV1111VVXXXXVVVf9DyQJAEn8Z5CEJCQREUhCEg8kiauuuuqqq6666qr/5ahcddVVV1111VVXXXXV/xOSkIQkJCGJiEASkpCEJCQhiefn+PHjXHXVVVddddVVV/0vQuWqq6666qqrrrrqqqv+B5LEfxZJSEISkpBERCAJSTyQJAAkcb/77rvvVq666qqrrrrqqqv+d6By1VVXXXXVVVddddVV/0NJ4j+KJJ6bJCQREUhCEpKQxAtim6uuuuqqq6666qr/RQiuuuqqq6666qqrrrrqf6CIeDDPxTYAtvm3koQkJBERRASSkIQkJAEgCUk8txMnTnDVVVddddVVV131vwjBVVddddVVV1111VVX/Q8kiX+JbV4UkgCQBIAkJCEJSUgiIpAEgCQeSBL3u++++27lqquuuuqqq6666n8PKlddddVVV1111VVXXfV/hG3+JZIAkIQkIoKIQBKSkASAJJ6bJK666qqrrrrqqqv+lyG46qqrrrrqqquuuuqq/0Vs828hCUkASEISkpCEJCQhCUlI4vnZ3t7m7Nmzt3LVVVddddVVV131vwfBVVddddVVV1111VVX/Q/Udd2DeRHYBsA2LwpJSEISkpBERBARSEISkgCQhCQAJCGJq6666qqrrrrqqv9lCK666qqrrrrqqquuuup/oMzkRWWbF0QSDyQJAElEBBGBJCQhCUkASOK5bW9vc999993KVVddddVVV1111f8eVK666qqrrrrqqquuuur/CUkASEISkpBERCAJSQBI4oEkcdVVV1111VVXXfW/FJWrrrrqqquuuuqqq676P04SkgCQhCQkIYmIQBKSkIQkrrrqqquuuuqqq/4PoXLVVVddddVVV1111VX/Q0niBbGNJP4tJCGJiEASEYEkIgJJSEISknig7e1trrrqqquuuuqqq/6XoXLVVVddddVVV1111VX/A0ni30sSDyQJSUgiIpBERCAJSUhCEg8kiQe67777buWqq6666qqrrrrqfw8qV1111VVXXXXVVVdd9T9QKeXB/CeShCQkEREASEISkrjqqquuuuqqq676P4Lgqquuuuqqq6666qqr/g+SxANJQhKSkIQkIoKIQBIRgSTuJ4kHksTOzg5nz559BlddddVVV1111VX/e1C56qqrrrrqqquuuuqq/+MkcT9JSEISkpCEJCQhCUlI4oEkAWCbq6666qqrrrrqqv9lqFx11VVXXXXVVVddddX/UraRxAsjiecmCUlIIiKICAAkIYn7SUIS99vZ2eGqq6666qqrrrrqfxmCq6666qqrrrrqqquu+l/ANs+PbQBscz9JPDdJSEISkpBERCAJSUQEkpCEJCTx3Gxz33333cpVV1111VVXXXXV/x4EV1111VVXXXXVVVdd9T9MZj6YF8I2D2Sbfw1JSEISEUFEIAlJXHXVVVddddVVV/0fQ+Wqq6666qqrrrrqqqv+j5MEgCQkIYmIICKQhCQAJCEJSTw/29vbnD179lauuuqqq6666qqr/vegctVVV1111VVXXXXVVf8PSAJAEpKQhCQigojANpKQBIAkJAEgCUlcddVVV1111VVX/S9E5aqrrrrqqquuuuqqq/4HksS/lyQeSBIAkpBERCAJSUhCEpKQxP0kcb9jx45x1VVXXXXVVVdd9b8Mlauuuuqqq6666qqrrvofJjMfzH8QSTyQJAAkIYmIICKwjST+Jffdd9+tXHXVVVddddVVV/3vQeWqq6666qqrrrrqqqv+F7GNJP41JCEJSUhCEpKICCQhCQBJSEISz49trrrqqquuuuqqq/6XIbjqqquuuuqqq6666qr/YSQBIIkHss39bPNvJYmIQBIRgSQkIQlJAEhCEg90/Phxrrrqqquuuuqqq/6XoXLVVVddddVVV1111VX/h0jiBZGEJCQhCUlIIiKwjSQAJHE/SUhCEvfdd9+tXHXVVVddddVVV/3vQuWqq6666qqrrrrqqqv+D7DNA0nigSQBIAlJSCIiiAgkASAJSTw/krjqqquuuuqqq676X4jgqquu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VVddddVV/0sRXHXVVVddddVVV1111f8Q11xzzYNf4iVe4sGSeGFs8y+RhCQkcT9JSEISkpCEJCTxwtjmvvvuu5Wrrrrqqquuuuqq/30Irrrqqquuuuqqq6666n+I++6771aARz/60byobPMvkYQkJAEgCUkASOKBJHE/SUjiqquuuuqqq6666n8xgquuuuqqq6666qqrrvof5B/+4R9++9Vf/dV5fmzzgkhCEs9NEgCSAJCEJCQhCQBJSEISz88111zD2bNnb+Wqq6666qqrrrrqfx+Cq6666qqrrrrqqquu+h/kt37rt77n0Y9+NKdOneKFsY1tnpsk7icJAEkASEISkpCEJCTxL1kul8+47777buWqq6666qqrrrrqfx+Cq6666qqrrrrqqquu+h/kt37rt747M299i7d4C/6tJCGJB5KEJCQhCUlIQhKSkMTz86hHPYr77rvv6Vx11VVXXXXVVVf970Rw1VVXXXXVVVddddVV/8P86I/+6Oc87GEPu/VN3/RNAbDNv5UkJAEgCUlIQhKSeEEksVgseNSjHsVv/dZvfQ9XXXXVVVddddVV/ztRueqqq6666qqrrrrqqv9hfuu3fuu7z5w586B3eqd3+mxJ/Oqv/ir/FpK4nyQAJCEJSUhCEveTBIAkZrMZj3zkI/mHf/iH3/6t3/qt7+aqq6666qqrrrrqfyeCq6666qqrrrrqqquu+h/ot37rt777H/7hH377Td7kTfiMz/gMTpw4wb+FJCQBIAlJSEIS95PEA9VaeehDH8qJEyf4kR/5kc/hqquuuuqqq6666n8vyvHjx7nqqquuuuqqq6666qr/aY6Oji79wz/8w+/ceuutf/Nar/Vab/3iL/7ibGxs8LSnPQ1JSEISkpBEKYVaK6UUSimUUiilUGul1krf98znczY2Ntje3mZ7e5uNjQ36vkcSmclqtWK1WnHy5Eme8pSn/PbXf/3Xv88//MM//DZXXXXVVVddddVV/3tRjh8/zlVXXXXVVVddddVVV/1PdHh4uHt0dLR76623/s1rvdZrvfXDHvYwXv7lX57FYsHTn/50JCEJgFIKpRRKKZRSKKVQa6WUQtd1dF3HfD5nc3OT7e1ttre32djYoOs6JHHu3Dn29vaICO67775bv+u7vutj/uEf/uG3ueqqq6666qqrrvrfjXL8+HGuuuqqq6666qqrrrrqf6rDw8PdW2+99a9/+7d/+3se8pCHvPQtt9zy4Ic+9KG83Mu9HDfccAOr1Yrd3V1qrZRSKKVQSqGUQimFWiu1Vvq+Zz6fs7m5yfb2Ntvb23Rdx8HBAbfffjur1Yp777331ltvvfWvv/RLv/Rtbr311r/mqquuuuqqq6666n8/9KAHPYirrrrqqquuuuqqq6763+LFXuzFXvud3umdPuvFXuzFXptnunjxIrfddhu33347h4eH1FpZLpesVitmsxmnTp1iY2OD06dPc/3117O1tcV8Psc297vvvvtu/dEf/dHP+a3f+q3v5qqrrrrqqquuuur/DvSgBz2Iq6666qqrrrrqqquu+t/mmmuuefBrv/Zrv9eLv/iLv/aLvdiLvTb/Bvfdd9+tv/Vbv/XdZ8+efcZv/dZvfTdXXXXVVVddddVV//egBz3oQVx11VVXXXXVVVddddX/Ztdcc82DX+zFXuy1X+zFXuy1rrnmmgcDnDlz5sHXXHPNgwHuu+++WwHOnj1763333Xfrfffdd+s//MM//M4//MM//DZXXXXVVVddddVV/7ehBz3oQVx11VVXXXXVVVddddVVV1111VVXXXXVVf8nUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fxT8CxsO/m+tYG3EAAAAASUVORK5CYII=) @@ -70,11 +83,12 @@ sweepSketch = startSketchOn(XY) ```kcl // Scale an imported model. - import "tests/inputs/cube.sldprt" as cube cube - |> scale(y = 2.5) + |> scale( + y = 2.5, + ) ``` ![Rendered example of scale 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAADE7klEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVV/81e7MVe7LVf53Ve57246qr/Y+67775bf/RHf/RzuOqqq6666qqrrvrvgx70oAdx1VVXXXXVVVdd9d/lwz/8w7/rxV7sxV77mmuueTBXXfV/zH333XcrwId8yIc8hKuuuuqqq6666qr/HlSuuuqqq6666qqr/hu9zuu8znsD/NAP/RAXLlzgqqv+L3mjN3qjBz/84Q/nxV7sxV77H/7hH36bq6666qqrrrrqqv96VK666qqrrrrqqqv+m3z4h3/4dwH82Z/9GX/2Z3/GVVf9b2GbF8XJkyd5+MMfzju90zt91md+5mf+NlddddVVV1111VX/9Qiuuuqqq6666qqr/pu82Iu92GsD/Omf/ilXXfW/iSQkIQlJSEISkpCEJCTx1Kc+FYAzZ848+MVe7MVem6uuuuqqq6666qr/egRXXXXVVVddddVV/w1e53Ve572vueaaBz/1qU/laU97GpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlI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trawDYAk/ivZ5rlJ4n8K2zw/krjqednmqv/ZbPM/mW3+O9nmX7K9vQ3AfffddytXXXXVVVddddV/JCpXXXXVVVddddV/qPvuu+9WgK2tLe5nmweSxH812zyQJP6nsc0LIomrrvrvZJv/LWzz3802V1111VVXXXXV/whUrrrqqquuuuqq/xTb29u8ILZ5IEn8V7PNc5PE/1S2eUEkcdVV/162+d/INv8T2ObfY2trC4D77rvvVq666qqrrrrqqv9IVK666qqrrrrqqv9QZ8+evZV/Jds8kCT+O9jmuUnifzrb/EskcdX/b7b53842/1PY5j/S1tYWAGfPnn0GV1111VVXXXXVfyQqV1111VVXXXXVf6j77rvvVoCtrS3+rWzzQJL472Kb5yaJ/21s8y+RxFX/+9jm/yLb/E9im6uuuuqqq6666n8lgquuuuqqq6666j/cfffddyvA1tYW/xFsYxvb2Oa/m21sYxvb2MY2/9vZxja2sY1tbGMb29jGNraxzVX/OWxjG9vYxja2sY1tbGMb29jmfzvb2MY2trGNbf672cY2trHNf7atrS0A7rvvvlu56qqrrrrqqqv+IxFcddVVV1111VX/4e67775bAba2tvjPYBvb2MY2/1PYxja2sY1tbPN/lW1sYxvb2MY2trGNbWxjG9vYxja2sY1t/i+yjW1sYxvb2MY2trGNbWxjG9vYxja2+b/KNraxjW1sY5v/KWxjG9vY5r+Sbba3twE4e/bsrVx11VVXXXXVVf+RqFx11VVXXXXVVf/r2ea5SeJ/Cts8P5L4/842V/3fYpv/6Wzz38k2z21ra4urrrrqqquuuuo/BZWrrrrqqquuuuo/3NmzZ28F2NrawjaS+K9mmweSxP80tnlBJHHVVf+T2eZ/C9v8d7PNi+K+++67lauuuuqqq6666j8Slauuuuqqq6666j/cfffddyvA1tYWALZ5IEn8V7PNc5PE/1S2eUEkcdVV/9ls87+Rbf4nsM2LamtrC4CzZ88+g6uuuuqqq6666j8alauuuuqqq6666r+cbR5IEv8dbPPcJPE/nW1eGElcddW/xDb/29nmfwrb/Fttb28DcN99993KVVddddVVV131H43gqquuuuqqq676D/cP//APvw1w/fXX86KwjW1sY5v/TraxjW1sY5v/bWxjG9vYxja2sY1tbHPV/222sY1tbGMb29jGNrb538Y2trGNbWzz38k2trGNbf49tra2ALjvvvtu5aqrrrrqqquu+o9G5aqrrrrqqquu+h/HNg8kif9Otnl+JPG/lW1eVJK46r+fbf4/sM3/RLa56qqrrrrqqqv+V6Jy1VVXXXXVVVf9h7vvvvtuBdje3uY/gm0eSBL/E9jmuUni/xrb/FtI4qrnZZurrrDN/1S2+a+ytbUFwH333fd0rrrqqquuuuqq/2hUrrrqqquuuuqq/3Vs80CS+J/CNs+PJP6/sc1/JUn8W9jmqv9ctvmfzDb/nba3twE4e/bsM7jqqquuuuqqq/6jUbnqqquuuuqqq/7DnT179hkAW1tb/FewzXOTxP8ktnlBJHHVv59trvrvY5v/LWzz380297PNVVddddVVV131n4bgqquuuuqqq676T3HffffdCrC1tcV/B9vYxja2sc3/VLaxjW1sYxvb2Oaqq/4nsY1tbGMb29jGNv9T2cY2trGNbf472MY2trHNA11//fUA/MM//MNvc9VVV1111VVX/UcjuOqqq6666qqr/lOcPXv2VoCtrS1sYxvb/HeyjW1sY5v/DWxjG9vYxja2sY1trrrqP5ptbGMb29jGNrb5n842trGNbWzz38k2trHNVVddddVVV13134bKVVddddVVV131X8o2DySJ/y62eW6S+N/ENi+MJK666n62+b/CNv/T2ObfYnt7G4D77rvvVq666qqrrrrqqv9oBFddddVVV1111X+K++6771aA66+/nhfGNraxjW3+u9nGNraxjW1s87+VbWxjG9vYxja2sY1tbHPV/262sY1tbGMb29jGNraxzf9WtrGNbWxjm/8JbGMb29jmqquuuuqqq676H4nKVVddddVVV131n+K+++67lX8D2zyQJP4nsM1zk8T/Fbb515DEVf95bPP/lW3+J7LNf4brr78egPvuu+9Wrrrqqquuuuqq/wxUrrrqqquuuuqq/xRnz559BsDW1hb/HrZ5IEn8T2Gb50cS/9fZ5t9LEv8X2eaqf5lt/iezzX+Fra0tAP7hH/7ht7nqqquuuuqqq/4zULnqqquuuuqqq/5T3HfffbcCbG9v8x/JNs9NEv+T2OYFkcRVV9jmqv/bbPO/hW2uuuqqq6666qr/k6hcddVVV1111VX/69nmgSTxP5Vtnh9JXHXV/1a2+d/ENv8T2GZrawuA++6771auuuqqq6666qr/DFSuuuqqq6666qr/FGfPnr0VYGtri/9qtnlukvifzDYvjCSuuuq/i23+t7LN/xS2eW7b29sAnD179hlcddVVV1111VX/GahcddVVV1111VX/Ke67775bAba3t7ENgCT+u9jmuUnifwvbvDCSuOqqfyvb/F9gm/9pbHPVVVddddVVV/23Irjqqquuuuqqq/7T3HfffbcCbG9vA2Ab29jGNv/dbGMb29jGNv9b2cY2trGNbWxjG9vY5qr/n2xjG9vYxja2sY1tbPO/kW1sYxvb2OZ/AtvYxja2+Zdsb28DcN99993KVVddddVVV131n4Hgqquuuuqqq676T3P27NlbAba2tnh+bGMb29jmfwLb2MY2trGNbf4vsI1tbGMb29jGNraxjW2u+t/BNraxjW1sYxvb2MY2tvm/wDa2sY1tbPM/gW1sYxvb2OZfa2trC4CzZ8/eylVXXXXVVVdd9Z+BylVXXXXVVVdd9T+GbR5IEv9T2Ob5kcT/Nbb515LEVf92trkKbPM/mW3+o21vb3PVVVddddVVV/2nIrjqqquuuuqqq/7T3HfffbcCbG9v829hG9vYxjb/E9nGNraxjW1s8/+NbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2OZ/KtvYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trHN/ze2sY1tbGMb2/xPYxvb2MY2/5nuu+++W7nqqquuuuqqq/4zULnqqquuuuqqq/7T3HfffbcCbG1t8R/BNs9NEv8T2eb5kcRVLxrbXPW/m23+t7DNf7Xt7W0A7rvvvlu56qqrrrrqqqv+s1C56qqrrrrqqqv+V7PNc5PE/1S2eUEkcdVV/9vY5n8j2/x329raAuDs2bO3ctVVV1111VVX/WchuOqqq6666qqr/tP8wz/8w+8A3HDDDfxXso1tbGOb/y1sYxvb2MY2trHNVVf9d7GNbWxjG9vYxja2+d/ANraxjW1s89/JNrbZ2toC4L777ruVq6666qqrrrrqPwuVq6666qqrrrrq/zzbPD+S+N/CNv8SSVx11b+Wbf4vsc3/NLa56qqrrrrqqqv+21C56qqrrrrqqqv+05w9e/ZWgK2tLWxzP0n8T2Cb5yaJ/61s8y+RxFX/f9jm/zLb/E9kmxfF9vY2APfdd9+tXHXVVVddddVV/1moXHXVVVddddVV/+Vs80CS+J/CNs9NEv9X2OZFJYmr/uexzf83tvmfzDb/Ftvb2wCcPXv2GVx11VVXXXXVVf9ZqFx11VVXXXXVVf9p7rvvvlsBtre3eWFs89wk8T+FbZ4fSfxfZpt/C0lc9cLZ5qrnZZv/DWxz1VVXXXXVVVf9r0Hlqquuuuqqq676T3Xffffdes011zx4e3ub/f19XlS2eSBJ/E9jm+dHEv+f2ea/kiT+I9jmqv8atvnfwjb/Wa6//noA/uEf/uG3ueqqq6666qqr/rMQXHXVVVddddVV/6nOnj17K8D29jb/HraxjW1sY5v/qWxjG9vYxja2sc1V//FsYxvb2MY2trGNbWxjG9vYxja2sY1tbGObq/7j2cY2trGNbWzzP5ltbGMb21x11VVXXXXVVf/rUbnqqquuuuqqq/7Xss0DSeJ/Otu8IJK46qr/bWzzv5Vt/jttb28DcN99993KVVddddVVV131n4Xgqquuuuqqq676T3XffffdCnD99dfzn802trGNbWzzv4ltbGMb29jGNra56qr/LraxjW1sYxvb2MY2/1vYxja2sY1trrrqqquuuuqq/xeoXHXVVVddddVV/6nuu+++W/lvZJvnJon/bWzzL5HEVVf9a9nm/xrb/E9km/vdcMMNANx33323ctVVV1111VVX/WeictVVV1111VVX/ac6e/bsMwC2t7f5n8I2z48k/jezzYtCElf932eb/w9s8z+VbV6Qra0tAP7hH/7ht7nqqquuuuqqq/4zUbnqqquuuuqqq/5T3XfffbcCbG1tYZsHksT/JLZ5bpL4v8Y2LypJXPU/h23+v7LN/3S2ueqqq6666qqr/sehctVVV1111VVX/bexzXOTxP8ktnl+JPH/gW3+rSRx1fOyzVUvmG3+N7DNv8f29jYA9913361cddVVV1111VX/mahcddVVV1111VX/qc6ePXsrwPb2Ni8K2zyQJP4nss3zI4mrrrDNVVe9ILb538Q2/5G2t7cBOHv27DO46qqrrrrqqqv+M1G56qqrrrrqqqv+U9133323Amxvb/NvYZvnJon/qWzzgkjiqqv+v7HN/za2ueqqq6666qqr/s8guOqqq6666qqr/tPdd999twJsb2/zH8E2trGNbWzzv4FtbGMb29jGNra56qr/rWxjG9vYxja2sY1t/qezjW1sYxvb/FfY3t4G4L777ruVq6666qqrrrrqPxPBVVddddVVV131n+7s2bO3Amxvb/OfxTa2sY1t/rexjW1sYxvb2MY2trnqqv9OtrGNbWxjG9vY5n8b29jGNrb577K9vQ3A2bNnb+Wqq6666qqrrvrPROWqq6666qqrrvo/yTbPjyT+N7LNCyOJq676t7DN/0W2+Z/KNtvb21x11VVXXXXVVf8lCK666qqrrrrqqv909913360A29vb/HezjW1sYxvb/F9gG9vYxja2sY1tbGMb21z1/4dtbGMb29jGNraxjW1s83+BbWxjG9vY5n8S29jGNrZ5oPvuu+9Wrrrqqquuuuqq/0xUrrrqqquuuuqq/3T33XffrQBbW1vYRhL/k9jm+ZHE/zW2+deQxFX/c9jm/zvb/E9nmxdme3sbgPvuu+9Wrrrqqquuuuqq/2xUrrrqqquuuuqq/3K2eSBJ/E9km+cmif9PbPNvJYmrnpNtrnrR2OZ/A9v8a21vbwNw9uzZW7nqqquuuuqqq/6zUbnqqquuuuqqq/7TnT179hkAN9xwA8+PbZ6bJP4nss0LIomrns02V131wtjmfxvb/Httb28DcN99993KVVddddVVV131n43KVVddddVVV131n+6+++67lX8l2zw3SfxPZpvnRxJXXfX/mW3+N7LNVVddddVVV131vx6Vq6666qqrrrrqP93Zs2dvBdje3ubfwzYPJIn/DWzzgkjiqqv+L7DN/3a2+a+wvb0NwH333XcrV1111VVXXXXVfzYqV1111VVXXXXV/1q2eW6S+N/ENi+MJK666n8C2/xfYpv/Ltvb2wCcPXv2GVx11VVXXXXVVf/ZqFx11VVXXXXVVf/p7rvvvlsBtre3+c9mm+cmif+tbPMvkcRVV/172Ob/KttcddVVV1111VX/rxFcddVVV1111VX/Je67775bAba3t/mvZhvb2MY2trHN/xW2sY1tbGMb29jGNraxzVX/P9nGNraxjW1sYxvb2Ob/CtvYxja2sc3/JLaxzQ033ADAP/zDP/w2V1111VVXXXXVfzaCq6666qqrrrrqv8R99913K8D29jb/U9jGNraxjW3+L7ONbWxjG9vYxja2sY1tbHPV/1y2sY1tbGMb29jGNraxjW1s83+VbWxjG9vY5n8a29jGNra56qqrrrrqqqv+W1C56qqrrrrqqqv+S9nGNgCS+J/GNs+PJP4/sc2/lSSueuFsc9WLxjb/W9jmRbG9vQ3AfffddytXXXXVVVddddV/NipXXXXVVVddddV/ibNnz94KsL29zf1s80CS+J/KNi+IJK56NttcddW/hm3+t7HNVVddddVVV131vwKVq6666qqrrrrqv8R99913K8D29jYviG2emyT+p7PN8yOJq6666tls87+Vbf4j3HDDDQCcPXv2GVx11VVXXXXVVf8VqFx11VVXXXXVVf8lzp49eyvAzs4O/xq2eW6S+N/ANi+IJK666v8i2/xvZ5v/LNvb2wD8/d///W9z1VVXXXXVVVf9V6By1VVXXXXVVVf9l7jvvvtuBdje3ubfyzbPTRL/m9jmhZHEVVf9T2Sb/0tsc9VVV1111VVX/Z9G5aqrrrrqqquu+j/BNs9NEv9b2eZfIomrrvqPZpv/q2zz3217exuA++677+lcddVVV1111VX/FahcddVVV1111VX/Je67775bAba3t/mvYpvnJon/K2zzL5HEVVcB2Ob/E9v8T7SzswPA2bNnn8FVV1111VVXXfVfgcpVV1111VVXXfVfant7m/9Otnl+JPF/kW3+NSRx1f8etvn/zjb/G9gGwDZXXXXVVVddddV/KYKrrrrqqquuuuq/xNmzZ59x33333Qqwvb3N/zS2sY1tbGMb2/x/Yxvb2MY2trGNbWxjG9vYxja2sc1V/3a2sY1tbGMb29jGNraxjW1sYxvb2Ob/E9vYxja2sY1t/qeyjW1sY5v7bW9vA3D27Nlbueqqq6666qqr/itQueqqq6666qqr/sucPXv21muuuebBW1tb7O3tASCJ/8ls8/xI4qpns81/Nkn8V7PNVf+1bPO/jW1eVDs7OwDcd999t3LVVVddddVVV/1XoHLVVVddddVVV/23ss1zk8T/dLZ5fiRx1X8O21z1f4Nt/jezzb/V9vY2V1111VVXXXXVfymCq6666qqrrrrqv8x99913K8DOzg4vjG1sYxvb2OZ/C9vYxja2sY1tbGObq676/8I2trGNbWxjG9v8b2Ib29jGNrb5j3DffffdylVXXXXVVVdd9V+BylVXXXXVVVdd9V/mvvvuuxVge3ubfy3bPDdJ/G9jmxdEEldd9b+Jbf4vsc1/pu3tbQDuu+++W7nqqquuuuqqq/6rULnqqquuuuqqq/7Xss1zk8T/Vrb5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qquuuuqq/zZnz569FWBnZ4f/yWxjG9vYxja2sc1VV13172cb29jGNraxjW3+N7KNbWyzs7MDwH333XcrV1111VVXXXXVfwcqV1111VVXXXXVf5v77rvvVoCdnR3+t7LNCyKJq6666grb/F9kmxdkZ2cHgLNnzz6Dq6666qqrrrrqvwuVq6666qqrrrrqv51tbPNAkvjfzjYvjCSuuur/Ctv8X2ebf42dnR0A7rvvvlu56qqrrrrqqqv+u1C56qqrrrrqqqv+25w9e/ZWgJ2dHZ6bbZ6bJP4vsc2/RBJXXfXfzTb/n9jmP8LOzg4A9913361cddVVV1111VX/XahcddVVV1111VX/be67775bAXZ2dnhR2Ob5kcT/VbZ5UUjiqqv+tWzz/51trrrqqquuuuqq/9OoXHXVVVddddVV/23uu+++WwF2dnb497DN8yOJ/y9s868hiav+77HNVc+fbf6rbW9vA3Dfffc9nauuuuqqq6666r8Llauuuuqqq6666v8s2zw/kvj/zjb/VpK46j+Pba76t7PN/xQ7OzsAnD179hlcddVVV1111VX/XahcddVVV1111VX/bc6ePfsMgJ2dHf4r2eb5kcRV/zLb/GeRxP8Gtrnqv5dtrrrqqquuuuqqq14EVK666qqrrrrqqv9W9913363XXHPNg3d2dtjb2+O/k21eEElc9Z/PNldddT/b/G920003AfAP//APv81VV1111VVXXfXfheCqq6666qqrrvpvdfbs2VsBdnZ2+J/MNraxjW1sYxvbXHXVVf92trGNbWxjG9vY5n8r29jmqquuuuqqq676H4HKVVddddVVV1111b+TbV4YSVx11f9Xtvm/zDYvyM7ODgD33XffrVx11VVXXXXVVf9dCK666qqrrrrqqv9W9913360A29vb2MY2tvm/xDa2sY1tbGMb29jmqqv+N7ONbWxjG9vYxja2+b/ENraxjW1sc9VVV1111VVX/Y9H5aqrrrrqqquu+m9133333Qqws7PDA9nmuUni/yLb/EskcdVV/5Vs8/+Vbf69dnZ2ALjvvvtu5aqrrrrqqquu+u9E5aqrrrrqqquu+h9hZ2eHf4ltnh9J/F9nmxeVJK666gWxzVXPZpv/DDfddBMAZ8+evZWrrrrqqquuuuq/E5Wrrrrqqquuuuq/1T/8wz/8DsDOzg7/VrZ5fiTx/5Ft/rUkcdX/Pra56kVjm/8O9913361cddVVV1111VX/nahcddVVV1111VX/Z9nm+ZHEVc/JNv8ekrjqX882V/3Hss3/BDs7OwDcd999t3LVVVddddVVV/13onLVVVddddVVV/23Onv27K0AOzs7/FexzQsiiav+9Wxz1VX/VWzzP93Ozg4AZ8+efQZXXXXVVVddddV/JypXXXXVVVddddVVD2Cb50cSV1111X8d21x11VVXXXXVVVf9B6By1VVXXXXVVVf9t7rvvvtuBdjZ2eF/Mtu8MJK46qqr/nVs83+RbXZ2dgC47777buWqq6666qqrrvrvRHDVVVddddVVV/23u++++24F2NnZ4X8r29jGNraxjW1sY5urrvr/yDa2sY1tbGMb29jm/wLb2MY2trENwM7ODgBnz569lauuuuqqq6666r8TwVVXXXXVVVdd9d/u7NmztwJsb29jm/+LbGMb29jGNraxjW1sc9VV/5vYxja2sY1tbGMb29jm/xrb2MY2trHNVVddddVVV131Px6Vq6666qqrrrrqf4ydnR0AbPP8SOL/Mtv8SyRx1VX/mWzz/51t/r12dnYAuO+++27lqquuuuqqq67670Rw1VVXXXXVVVf9t/v7v//73wbY2dnhhbGNbWxjG9vY5v8T29jGNraxjW1sYxvb2MY2V111P9vYxja2sY1tbGMb29jGNv/f2MY2trGNbf69dnZ2ALjvvvtu5aqrrrrqqquu+u9G5aqrrrrqqquu+l/PNs+PJP4/s82/hSSu+p/LNlf969nmv8rOzg4AZ8+evZWrrrrqqquuuuq/G5Wrrrrqqquuuuq/3dmzZ58BcOzYMf4j2eb5kcRVL5ht/qNI4iqwzVX/+WzzP8HOzg4A9913361cddVVV1111VX/3ahcddVVV1111VX/7e67775bAXZ2dvivYJsXRBJX/cexzVVX/UezzVVXXXXVVVddddWLiMpVV1111VVXXfXf7uzZs7cC7Ozs8N/NNi+IJK666qr/Grb532pnZweA++6771auuuqqq6666qr/blSuuuqqq6666qqrXkS2eUEkcdVVV73obPN/1bFjxwA4e/bsM7jqqquuuuqqq/67Ubnqqquuuuqqq/7b3XfffbcC7Ozs8L+Vbf4lkrjqqv8vbPP/hW0eyDZXXXXVVVddddX/GARXXXXVVVddddX/CPfdd9+tANvb2/xfZRvb2MY2trGNbWxjm6uu+t/ANraxjW1sYxvb2MY2/xfZxja2sY1tbPPcbr75ZgD+4R/+4be56qqrrrrqqqv+uxFcddVVV1111VX/I5w9e/ZWgGPHjmEb29jGNrb5/8I2trGNbWxjG9vYxja2ueqq/wy2sY1tbGMb29jGNraxzf8HtrGNbWxjm6uuuuqqq6666n8lKlddddVVV1111f8Ktnl+JPH/kW1eVJK46v8n21z1wtnmP9rOzg4A9913361cddVVV1111VX/3Qiuuuqqq6666qr/Ee67775bAXZ2dvjXsI1tbGMb29jmqmezjW1sYxvb2MY2trGNbWxjG9vYxjZX/c9gG9vYxja2sY1tbGMb29jGNraxzVXPZhvb2MY2trHNVVddddVVV131fx6Vq6666qqrrrrqf4T77rvvVoCdnR3+I9jmBZHEVS8a2/xHk8T/Zba56r+Hbf677ezsAHDffffdylVXXXXVVVdd9T8Blauuuuqqq6666n+UnZ0d/rPZ5gWRxFX/uWxz1VX/Hrb5n+qmm24C4OzZs7dy1VVXXXXVVVf9T0Dlqquuuuqqq676H+Ef/uEffgfg2LFj/HeyzQsiiauuuuo/n23+t7vvvvtu5aqrrrrqqquu+p+AylVXXXXVVVddddWLyDYvjCSuuuqqF41t/i86duwYV1111VVXXXXV/yhUrrrqqquuuuqq/xHOnj17K8DOzg7/W9nmhZHEVVf9f2Cb/29sA7CzswPAP/zDP/wOV1111VVXXXXV/wRUrrrqqquuuuqqq/6L2OZfIomrrvqfzDb/n9nmqquuuuqqq676X4XKVVddddVVV131P8J99913K8DOzg62eSBJ/H9hmxeVJK666j+Kba56Trb519rZ2QHgvvvuu5Wrrrrqqquuuup/AoKrrrrqqquuuup/jPvuu+9WgJ2dHR7INraxjW1sY5v/72xjG9vYxja2sY1tbGMb29jmqv9fbGMb29jGNraxjW1sYxvb2Ob/M9vYxja2sY1t/i12dnYAOHv27K1cddVVV1111VX/ExBcddVVV1111VX/Y5w9e/ZWgGPHjvGisI1tbGMb29jGNlc9L9vYxja2sY1tbGMb29jGNraxjW1sc9V/D9vYxja2sY1tbGMb29jGNraxjW1sc9Vzso1tbGMb29jGNlddddVVV1111f9pVK666qqrrrrqqv+TbPP8SOKqfz3b/GeRxP9Wtrnqfxbb/Hc6duwYAPfdd9+tXHXVVVddddVV/xMQXHXVVVddddVV/2P8/d///W8D3HTTTfxnsY1tbGMb29jGNlf997CNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sYxvb2MY2V/33sI1tbGMb29jGNv+ddnZ2ALjvvvtu5aqrrrrqqquu+p+CylVXXXXVVVddddUz2eYFkcRVV131X8c2/9scO3YMgLNnz97KVVddddVVV131PwWVq6666qqrrrrqf4yzZ88+A+DYsWP8T2ObF0YSV1111YvONv/X7OzsAHDffffdylVXXXXVVVdd9T8Flauuuuqqq6666n+M++6771aAnZ0d/rexzb9EEldd9f+Bbf4/ss1VV1111VVXXfU/DpWrrrrqqquuuup/jLNnz94KcOzYMf4vss2/RBJXXfU/mW3+v7PN83Ps2DEA7rvvvlu56qqrrrrqqqv+p6By1VVXXXXVVVf9j2Mb2wBI4v8T27yoJHHVVf8RbHPV82ebF9XOzg4AZ8+efQZXXXXVVVddddX/FFSuuuqqq6666qr/Me67775bAY4dO8b9bPP8SOL/O9v8a0jiqv8fbHPVv45trrrqqquuuuqq/5MIrrrqqquuuuqq/1Huu+++WwF2dnZ4YWxjG9vYxja2sc1Vz59tbGMb29jGNraxjW1sYxvb2MY2trHNVf91bGMb29jGNraxjW1sYxvb2MY2trGNba56/mxjG9vYxja2sc1/hJtvvhmAf/iHf/htrrrqqquuuuqq/ymoXHXVVVddddVV/6Pcd999t15zzTUPPnbsGHt7e/xb2Ob5kcRV/3a2+c8mif/pbHPV/2y2ueqqq6666qqrrnomKlddddVVV1111f8btnlBJHHVfz/bXHXVi8I2/9McO3YMgPvuu+9Wrrrqqquuuuqq/ymoXHXVVVddddVV/6OcPXv2VoCdnR3+K9nmhZHEVVdd9V/HNlddddVVV1111VX/AahcddVVV1111VX/o9x33323Ahw7doz/SWzzwkjiqquuetHZ5v+SnZ0dAM6ePfsMrrrqqquuuuqq/0moXHXVVVddddVVV/0HsM0LI4mrrvr/xDb/n9x8880A3Hfffbdy1VVXXXXVVVf9T0Llqquuuuqqq676H+Uf/uEffhvg5ptv5v8S27woJHHVVf+T2eaqK2zz3O67775bueqqq6666qqr/iehctVVV1111VVXXfU/iG1eVJK46qr/KLa56vmzzb9kZ2eHq6666qqrrrrqfyQqV1111VVXXXXV/yj33XffrQA7OzvY5vmRxFVgm38NSVz1/4NtrvrXs82/1bFjxwD4h3/4h9/mqquuuuqqq676n4TKVVddddVVV131v45tnh9JXPWC2ebfQxJX/dewzVX/eWxz1VVXXXXVVVf9v0Hlqquuuuqqq676H+Xs2bPPADh27Bj/WrZ5QSRx1b+Pbf6rSOJ/Gttc9b+Hbf4rHTt2DICzZ8/eylVXXXXVVVdd9T8JwVVXXXXVVVdd9T/OfffddyvAsWPH+I9iG9vYxja2sY1trvqfxza2sY1tbGMb29jGNraxjW1sYxvb2MY2trGNbWxjG9vYxja2sY1tbGMb29jGNraxjW1sc9X/PLaxjW1sYxvb2Oa/2s7ODgD33XffrVx11VVXXXXVVf+TEFx11VVXXXXVVf/jnD179laAnZ0d/ivYxja2sY1tbGObq6666r+PbWxjG9vYxja2sc1VV1111VVXXXXVi4DKVVddddVVV1111QthmxdGElddddW/jW3+rzh27BgA9913361cddVVV1111VX/kxBcddVVV1111VX/4/z93//9bwPcfPPN/E9nG9vYxja2sY1tbGObq676/8o2trGNbWxjG9vY5v+KY8eOAXDffffdylVXXXXVVVdd9T8Nlauuuuqqq6666qr/ZLZ5UUjiqqv+N7DNVc+2vb0NwNmzZ2/lqquuuuqqq676n4bKVVddddVVV131P87Zs2efAXDs2DH+P7HNi0oSV131H8k2V71wtnl+jh07BsB99913K1ddddVVV1111f80VK666qqrrrrqqv9x7rvvvlsBdnZ2sM39JHHVFbb515DEVf+/2OaqfxvbXHXVVVddddVV/2dQueqqq6666qqr/sc6duwYD2Sb50cSV71wtvn3ksRV/zVsc9V/Ltv8Rzl27BgA9913361cddVVV1111VX/01C56qqrrrrqqqv+xzl79uyt/CvY5gWRxFX/MWzzX0ES/1PZ5qr/PWzzX+HYsWMAnD179hlcddVVV1111VX/01C56qqrrrrqqqv+x7nvvvtuBTh27Bif+ImfyFVXXXXVVVddddVVV1111b8RetCDHsRVV1111VVXXfU/00/8xE+Yq6666qr/BT7zMz/zdf7hH/7ht7nqqquuuuqqq/6nQQ960IO46qqrrrrqqquuuuqqq6666qqrrrrqqqv+T6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6v4h8Bz9EsBiEq5icAAAAASUVORK5CYII=) @@ -82,22 +96,27 @@ cube ```kcl // Sweep two sketches along the same path. - sketch001 = startSketchOn(XY) rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) - |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) - |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61) - |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001)) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 50.61, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfile(sketch002, at = [0, 0]) - |> yLine(length = 231.81) - |> tangentialArc(radius = 80, angle = -90) - |> xLine(length = 384.93) + |> yLine(length = 231.81) + |> tangentialArc(radius = 80, angle = -90) + |> xLine(length = 384.93) parts = sweep([rectangleSketch, circleSketch], path = sweepPath) diff --git a/docs/kcl-std/translate.md b/docs/kcl-std/functions/std-transform-translate.md similarity index 99% rename from docs/kcl-std/translate.md rename to docs/kcl-std/functions/std-transform-translate.md index 3a8e9357f..07348a614 100644 --- a/docs/kcl-std/translate.md +++ b/docs/kcl-std/functions/std-transform-translate.md @@ -9,31 +9,33 @@ Move a solid or a sketch. ```kcl translate( - @objects: [Solid] | [Sketch] | ImportedGeometry, - x?: number, - y?: number, - z?: number, + @objects: [Solid; 1+] | [Sketch; 1+] | ImportedGeometry, + x?: number(Length), + y?: number(Length), + z?: number(Length), global?: bool, -): [Solid] | [Sketch] | ImportedGeometry +): [Solid; 1+] | [Sketch; 1+] | ImportedGeometry ``` -This is really useful for assembling parts together. You can create a part and then move it to the correct location. +This is really useful for assembling parts together. You can create a part +and then move it to the correct location. -Translate is really useful for sketches if you want to move a sketch and then rotate it using the `rotate` function to create a loft. +Translate is really useful for sketches if you want to move a sketch +and then rotate it using the `rotate` function to create a loft. ### Arguments | Name | Type | Description | Required | |----------|------|-------------|----------| -| `objects` | [`[Solid]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) | The solid, sketch, or set of solids or sketches to move. | Yes | -| `x` | [`number`](/docs/kcl-std/types/std-types-number) | The amount to move the solid or sketch along the x axis. Defaults to 0 if not provided. | No | -| `y` | [`number`](/docs/kcl-std/types/std-types-number) | The amount to move the solid or sketch along the y axis. Defaults to 0 if not provided. | No | -| `z` | [`number`](/docs/kcl-std/types/std-types-number) | The amount to move the solid or sketch along the z axis. Defaults to 0 if not provided. | No | +| `objects` | [`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) | The solid, sketch, or set of solids or sketches to move. | Yes | +| `x` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The amount to move the solid or sketch along the x axis. | No | +| `y` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The amount to move the solid or sketch along the y axis. | No | +| `z` | [`number(Length)`](/docs/kcl-std/types/std-types-number) | The amount to move the solid or sketch along the z axis. | No | | `global` | [`bool`](/docs/kcl-std/types/std-types-bool) | If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. | No | ### Returns -[`[Solid]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) - Data for a solid, sketch, or an imported geometry. +[`[Solid; 1+]`](/docs/kcl-std/types/std-types-Solid) or [`[Sketch; 1+]`](/docs/kcl-std/types/std-types-Sketch) or [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) ### Examples @@ -43,22 +45,32 @@ Translate is really useful for sketches if you want to move a sketch and then ro // Create a path for the sweep. sweepPath = startSketchOn(XZ) - |> startProfile(at = [0.05, 0.05]) - |> line(end = [0, 7]) - |> tangentialArc(angle = 90, radius = 5) - |> line(end = [-3, 0]) - |> tangentialArc(angle = -90, radius = 5) - |> line(end = [0, 7]) + |> startProfile(at = [0.05, 0.05]) + |> line(end = [0, 7]) + |> tangentialArc(angle = 90, radius = 5) + |> line(end = [-3, 0]) + |> tangentialArc(angle = -90, radius = 5) + |> line(end = [0, 7]) // Create a hole for the pipe. pipeHole = startSketchOn(XY) - |> circle(center = [0, 0], radius = 1.5) + |> circle( + center = [0, 0], + radius = 1.5, + ) sweepSketch = startSketchOn(XY) - |> circle(center = [0, 0], radius = 2) - |> subtract2d(tool = pipeHole) - |> sweep(path = sweepPath) - |> translate(x = 1.0, y = 1.0, z = 2.5) + |> circle( + center = [0, 0], + radius = 2, + ) + |> subtract2d(tool = pipeHole) + |> sweep(path = sweepPath) + |> translate( + x = 1.0, + y = 1.0, + z = 2.5, + ) ``` ![Rendered example of translate 0](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEg5ElEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVS+Sa6655sE805kzZx4McM011zyYZzpz5syDeC7XXHPNg3k+rrnmmgfzAtx333238gLcd999t/JMZ8+efQbPdN99993KM509e/bW++6771auuuqqq6666qqrrrrqqqsAPehBD+Kqq6666qqr/r+55pprHgxw5syZB19zzTUPPnPmzIN4pmuuuebB11xzzYMBzpw58+BrrrnmwbyIbr31Vu63u7vL8ePHeW67u7v8S44fP87u7i7P7fjx4zzQgx/8YF6Yf/iHf/jtM2fOPPjs2bO33nfffbcC/MM//MPvANx33323nj179tb77rvvVq666qqrrrrqqquuuuqq/6vQgx70IK666qqrrrrq/5prrrnmwWfOnHnwNddc82CAM2fOPOjFX/zFX/vMmTMPvuaaax7M83Hrrbeyu7vL7u4uAMePH2d3d5f7PfjBD2Z3d5fd3V2OHz/O8ePHud/x48cBOH78OP9eu7u7HD9+nN3dXY4fPw7A7u4uD7S7u8vu7i73u/XWW7nf7u4uu7u7HD9+nOPHjwNw/Phxjh8/DsDx48d58IMfzP3uu+++WwH+4R/+4bcB/uEf/uF3/uEf/uG377vvvlu56qqrrrrqqquuuuqqq/63Qw960IO46qqrrrrqqv+trrnmmgefOXPmwS/2Yi/2Wtdcc82D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JCQhCUkASEISAJIAkASAJAAkcdVVV1111VVX/ZsQXHXVVVddddVVV1111VX/qWw/SBLPjyQk8a8hiedmGwDbPJBtnh/bPJBtnh/bvDCSkIQkJCEJSUQEkpCEJCICSUhCEpKQhCTuJ4kX1Wq1upWrrrrqqquuuupFQXDVVVddddVVV1111VVX/aeKCJ6bJCQBIAlJSEISkpCEJCQhiecmiRfENg9kG9s8N9s8kG0AbANgmxdEEveThCQkIQlJSEISkpCEJCQhCUlIQhKSkIQk7icJAEkASOK5rVarZ3DVVVddddVVV70oCK666qqrrrrqqquuuuqq/1SSHiyJ50cSDySJ50cSknhhbHM/2zw32zw32/xbSUISAJKQhCQkIQlJSCIikIQkJCEJSTw3SUgCQBIvzDiOt3LVVVddddVVV70oCK666qqrrrrqqquuuuqq/1SSAJCEJCTx3CQhCQBJSEISknggSdxPEs/NNvezzXOzzXOzzf1sA2CbF5Uk7icJSUhCEpKQhCQkIQlJSEISkpCEJO4niftJ4vkZhuFWrrrqqquuuuqqFwXBVVddddVVV1111VVXXfWfShIvjCReGElI4n6SuJ8knptt7meb52ab/wiSkIQkJCEJSUhCEhFBRCAJSUhCEpIAkIQkJCEJSUjiRWGbq6666qqrrrrqRULlqquuuuqqq6666qqrrvpPFREPlsS/RBKSkIQkJPFAkrifJF5UtpHEA9lGEvezjSReVJJ4IElIQhKSALANgCQiAttIQhKSkIQkXhBJ2Oa52WYcx1u56qqrrrrqqqteFARXXXXVVVddddVVV1111f9YkpDE/SRxP0kASOK52eaBbPPcbPP82OZ+trHNA0nifpKQhCQkIQlJSEISkogIJBERSEISkpAEgCSemyRekGEYnsFVV1111VVXXfWionLVVVddddVVV1111VVX/acqpTyY5yIJSbyoJHE/STw3Sfx72UYSLypJAEhCEpKQhCQAJGGbzEQSkpCEJCQBIAkASUhCEpKwzQNJ4n6r1epWrrrqqquuuuqqFxWVq6666qqrrrrqqquuuuq/hCReEEn8SyTx3CTxgthGEvezjSQeyDaS+NeSBIAkACQhiYjguUlCEpKQBIAkJAEgiX+N1Wp1K1ddddVVV1111YuKylVXXXXVVVddddVVV131n04S/5Ek8dwk8Z9N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Yx7zWlx11VVXXXXVVf/RCK666qqrrrrqqquuuuqq/xBnz559xpkzZzh9+jT/FWzzwkjigSTxQJJ4IElIQhKSkIQkJCEJSUhCEpKQhCQAJPHvYZtXe7VXex2uuuqqq6666qr/aARXXXXVVVddddVVV1111X+I3/qt3/ru06dP85Zv+Zb8TyEJSUjifpKQxP0kIQkASUhCEpKQhCQkIQlJSEISkgCQxL/X1tYWV1111VVXXXXVfwqCq6666qqrrrrqqquuuuo/xNmzZ5/xD//wD7/9qEc9ilOnTvFvYZv72eY/myTuJwkASUhCEpKQhCQkIQlJAEhCEveTxAtimxdma2uLq6666qqrrrrqPwXBVVddddVVV1111VVXXfUf5kd+5Ec+5/Tp07zFW7wF/1ls828liecmCUkASAJAEpKQhCQkIQlJSEISAJKQhCReENsA2OYF2dzc5L777ruVq6666qqrrrrqPxrBVVddddVVV1111VVXXfUf5h/+4R9++x/+4R9++1Ve5VV45Vd+Zf6zSUISkvjXkoQk7icJSUhCEpKQhCQkIQlJSEISknhhbGObB7INgG0e6Nprr+W+++57OlddddVVV1111X80gquuuuqqq6666qqrrrrqP9TXf/3Xvw/Am73Zm3Hy5En+vWwDYJsXRhIvCklI4oEkcT9JSEISkpCEJCQhCUlIQhKSkIQkXlS2eW7XXXcdZ8+efQZXXXXVVVddddV/NIKrrrrqqquuuuqqq6666j/Ufffdd+uP/MiPfPapU6f46I/+aO4nif9IknhuknhBJPH8SAJAEpKQhCQkIYmIQBKSkIQkJPHcJPFvcc0113B0dHTrP/zDP/w2V1111VVXXXXVfzSCq6666qqrrrrqqquuuuo/3G//9m9/zz/8wz/89smTJ3m3d3s3/itJ4rlJ4rlJQhIAkpCEJCQBIAlJSCIiiAgkIQkASUhCEveTBIBtXlQPfehDOXv27K333XffrVx11VVXXXXVVf/RCK666qqrrrrqqquuuuqq/3D33XffrV//9V//PgCv9EqvxBu/8RvzX0kSkgCQxP0kASCJ+0niuUlCEpKQhCQkIQlJSEISLyrbPD+bm5s89KEP5bd+67e+h6uuuuqqq6666j8DwVVXXXXVVVddddVVV131n+K+++679TM/8zNfG+CN3/iNeaM3eiP+o9jmRSGJ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q6666r8betCDHsRVV1111VVXXXXVVVdd9T/bNddc8+AXe7EXe+3XeZ3Xea8Xe7EXe+377rvv1muuuebBAJcuXeK2227j9ttvZ39/nzvvvJOIICKICEopRASlFEoplFKotVJrpdZK3/f0fc98Pmc+n7NYLNjc3GRzc5PNzU02NjbY2Nig73sAbHN0dERrjfvdd999t/7Wb/3Wd//Wb/3Wd589e/YZXHXVVVddddVV/1OgBz3oQVx11VVXXXXVVVddddVV/3tcc801D36xF3ux136xF3ux13qd13md9+b52NvbY39/n/39fe666y4igsPDQyKC5XJJKYX1ek3XdXRdx/Hjx+n7nvl8zvb2NltbW2xsbNB1HX3f8/zcd999t/7Wb/3Wd589e/YZv/Vbv/XdXHXVVVddddVV/xOhBz3oQVx11VVXXXXVVVddddVV/3udOXPmQS/+4i/+Oi/2Yi/2Wtdcc82DX+zFXuy1+Xc6ODhga2uL+9133323Apw9e/bWv//7v//tf/iHf/idf/iHf/htrrrqqquuuuqq/+nQgx70IK666qqrrrrqqquuuuqq/zuuueaaB9v2Nddc85BrrrnmwS/2Yi/2Wvfdd9+tL/7iL/7aAGfOnHkwwDXXXPNgnukf/uEffvvMmTMPBjh79uyt991336333XffrQD/8A//8Dv/8A//8NtcddVVV1111VX/G6EHPehBXHXVVVddddVVV1111VVXXXXVVVddddVV/ydRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6v4RwELo/q2UjHdAAAAAElFTkSuQmCC) @@ -66,16 +78,24 @@ sweepSketch = startSketchOn(XY) ```kcl // Move an imported model. - import "tests/inputs/cube.sldprt" as cube // Circle so you actually see the move. startSketchOn(XY) - |> circle(center = [-10, -10], radius = 10) - |> extrude(length = 10) + |> circle( + center = [-10, -10], + radius = 10, + ) + |> extrude( + length = 10, + ) cube - |> translate(x = 10.0, y = 10.0, z = 2.5) + |> translate( + x = 10.0, + y = 10.0, + z = 2.5, + ) ``` ![Rendered example of translate 1](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAEm40lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispV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CUlIQhL3W61W3HrrrVx33XXcdNNNx1/xFV/xrf/sz/7sZw4PD3e56qqrrrrqqv86lOPHj3PVVVddddVV/5Xe8R3f8bPe/M3f/KMBvvu7v5tnPOMZSOKqq6666qp/G0lIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCRx1b+eJCQhifV6za233sr111/PjTfeePwVX/EV3/rP/uzPfubw8HCXq6666qqrrvqvgR70oAdx1VVXXXXVVf9VXud1Xue9P/zDP/y7AL77u7+bW2+9lauuen4kcdW/nW2uuup/Itv8f3T8+HHe5m3ehgc/+MHcd999t37WZ33W69x33323ctVVV1111VX/+dCDHvQgrrrqqquuuuq/wuu8zuu894d/+Id/F8B3f/d3c+utt3LVv44krrrqqitsc9X/b7b53+T48eO8z/u8D8ePH+e+++679bM+67Ne57777ruVq6666qqrrvrPhR70oAdx1VVXXXXVVf/ZXud1Xue9P/zDP/y7AL77u7+bW2+9lf8tJHHVVVdd9cLY5qr/nWzzX+n48eO8z/u8D8ePH+e+++679UM+5EMewlVXXXXVVVf950IPetCDuOqqq6666qr/TC/2Yi/22p/7uZ/7WwA//dM/zV//9V/z7yGJq6666qr/r2xz1f8ctvnXOn78OO/zPu/D8ePHue+++279kA/5kIdw1VVXXXXVVf950IMe9CCuuuqqq6666j/Li73Yi732537u5/4WwM/8zM/w13/911x11VVXXfU/k22u+q9x/Phx3vu935vjx49z33333fohH/IhD+Gqq6666qqr/nOgBz3oQVx11VVXXXXVf4YXe7EXe+3P/dzP/S2An/mZn+Gv//qvueqq/2kk8d/JNldd9X+Zba56/o4fP857v/d7c/z4ce67775bP+RDPuQhXHXVVVddddV/PMrx48e56qqrrrrqqv9oL/ZiL/ban/u5n/tbAL/927/Nn/zJn3DVfy1JSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSOK/myQkIQlJSEISkpCEJCQhCUlIQhKSkIQkJCEJSUhCEpKQhCQkIQlJSEISkpCEJCQh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qquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/Ff8I8JC5rnO8RDQAAAAASUVORK5CYII=) @@ -83,32 +103,32 @@ cube ```kcl // Sweep two sketches along the same path. - sketch001 = startSketchOn(XY) rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) - |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) - |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61) - |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001)) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) + |> angledLine( + angle = segAng(rectangleSegmentA001) - 90, + length = 50.61, + ) + |> angledLine( + angle = segAng(rectangleSegmentA001), + length = -segLen(rectangleSegmentA001), + ) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) sketch002 = startSketchOn(YZ) sweepPath = startProfile(sketch002, at = [0, 0]) - |> yLine(length = 231.81) - |> tangentialArc(radius = 80, angle = -90) - |> xLine(length = 384.93) + |> yLine(length = 231.81) + |> tangentialArc(radius = 80, angle = -90) + |> xLine(length = 384.93) parts = sweep([rectangleSketch, circleSketch], path = sweepPath) // Move the sweeps. -translate( - parts, - x = 1.0, - y = 1.0, - z = 2.5, -) +translate(parts, x = 1.0, y = 1.0, z = 2.5) ``` ![Rendered example of translate 2](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFg80lEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqr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NvezjW0AbGMb29gGwDa2sY1tMhPb2MY2tslMIgIA29gmM7FNZpKZZCaZSWZiG9vY5j+aJK666qqrrvqvYRsA2wDY5n62AbANgG0AbANgm/vZBsA2ALYBsM39bANgGwDb3M82ALYBsM39bANgm/vZBsA297MNgG3uZxsA29zPNs/NNvezzf1sA2Cb+9nmfra5n22uuuqqq676f4PKVVddddVVV70QmcnzY5t/Dds8kG2em21sYxvb2MY2tslMbJOZRASZCYBtMhPbZCaZiW1sYxvb2MY2ALaxjW1eFJKwzfMjiecmiauuuuqqq/7j2QbANgC2AbANgG0AbHM/2wDYBsA2ALa5n20AbANgm/vZBsA2ALa5n20AbANgm/vZBsA297MNgG3uZxsA29zPNvezDYBt7meb+9kGwDb3s839bHM/29zPNvezzVVXXXXVVf/nUbnqqquuuuqqf4FtAGzzQLb517DNA9kGwDa2sY1tbGObzCQzyUwyk8wkM8lMIgKAzCQzyUwyk8wkM8lMMhPb2MY2tvn3ksQLIglJXHXVVVdd9a9nG0m8ILaxjW0AbANgm/vZBsA2ALYBsM39bANgGwDb3M82ALYBsM39bANgGwDb3M82ALa5n20AbHM/2wDY5n62uZ9tAGxzP9vczzYAtrmfbe5nm/vZBsA297PN/Wxz1VVXXXXV/xtUrrrqqquuuupFYBsA2zw32/xr2OZ+tgGwjW1sk5lkJplJZtJaIzNprVFKITOxDUBmkpm01shMMpPMJDPJTDIT29jGNra5n23+NSRhG0k8N0lcddVVV131Lztz5syD+TeyjW0AbANgm/vZBsA2ALa5n20AbANgm/vZBsA2ALa5n20AbHM/2wDYBsA297MNgG3uZxsA29zPNvezDYBt7meb+9nmfrYBsM39bHM/29zPNvezzf1scz/bXHXVVVdd9X8elauuuuqqq656ISTdapsHss1zs82LwjYAtgGwjW1sYxvb2CYzyUwyk8yktUZm0lpDEhEBQGbSWiMzaa2RmbTWyExsYxvb2MY2trGNbV4QSdjmqquuuuqq/zlsYxvbANgGwDYAtrmfbQBscz/bANgGwDb3sw2AbQBscz/bANjmfrYBsM39bANgm/vZBsA297PN/WwDYJv72eZ+trmfbQBscz/b3M8297PN/WxzP9vczzb3s81VV1111VX/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BBFBRBARRASSkIQkJPFAkpAEwGw2ezBXXXXVVf+HXHPNNQ8GOH/+PC+KEydOAHB4eMi/hSSuek7XXXcdAP/wD//w21x11VVXXXXVsxFcddVVV1111X+SiPidzMQ2ALYBsA2AbWxzP9vczzbPzTYPZJsXlW1sYxvbANjmudnGNraxjW1s80CSiAgkERFEBBGBJCQhCUlIQhKSkMT9JCGJWuuDueqqq676P+LMmTMP5rnY5gU5efIkAIeHhzw3SVz1r7e1tQXAfffddytXXXXVVVdd9WwEV1111VVXXfWf51bbZCa2sY1tnh/bPDfb2OaBbPNAtnlhbGOb52ab+9nGNrYBsI1tbGMb29jmfpKQREQQEUQEEUFEEBFIQhLPjyTuV0p5MFddddVV/0dcc801D75w4QLPj22e28mTJwE4PDzk30oS/xJJ/EeQxP80trnf1tYWV1111VVXXfUCEFx11VVXXXXVfyLb2MY2D2Sb58c2z802trmfbR7INraxDYBtbGObfy3bANjGNraxzf0kIQlJRAQRQUQQEUQEkpCEJCQhCQBJSAJAEpKICK666qqr/i85f/48/1Ek8V9FEv8RJPHf5brrrgPgt37rt76bq6666qqrrnpOBFddddVVV131nyQibm2t3Wob29jGNrYBsI1tbANgGwDbPD+2uZ9tnh/bvKhsYxsA29jGNraxjW1sYxvb2OZ+kpBERBARRASSiAgiAgBJAEjifpIAkETXdQ/mqquuuur/iDNnzjzowoULvDC2ud+JEycAODw85AWRxL9EElddddVVV1111QtFcNVVV1111VX/iVprt9rGNg9kmxfGNv8S2/xHsM0D2cY2trGNbWxzP0lIIiKICCKCiCAikIQkJCEJSdxPEgCSkMRsNnsQV1111VX/R1xzzTUP5l/h5MmTABweHvKfTRL/111//fUA/MM//MPvcNVVV1111VXPieCqq6666qqr/hPVWslMAGxjG9sA2OZ+tgGwzf1s89xs80C2eVHYxja2sc3zYxvb2MY2trGNbWzzQJKQhCQigoggIogIJCEJAElIQhLPbTabPZirrrrqqv9Dzp8/z4vCNi8qSfxLJHHVVVddddVVV71ABFddddVVV131n+jo6Oi3bWMb29jmgWxjmxfENraxzf1s80C2sc1zs41tbPPcbANgGwDbANjGNraxjW1sYxvb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5n5nz569lauuuuqqq676j0flqquuuuqqq6666qqrrrrqX+m+++679b777rv11KlTDz5//jynTp0CIDORxItKErb5z2QbAEk8N9sASOJ+tpHE/WwjCQDbSALANpIAsI0kbAMgCdtIwjaSsI0kbCMJ20hisVgAcN99993KVVddddVVV/3HI7jqqquuuuqqq6666qqrrvo3uO+++2595CMfCcCpU6cAyEwiAklEBJKICCQhiYhAEpKQhCQkIQlJSCIikIQkJCEJSUhCEpKQhCQAJCEJSUhCEpKQhCQkIYn7SUISkpCEJAAkIQlJ3E8SkrifJO4niftJAkASkgCQBIAkACQBIAkASZw8eRKAf/iHf/htrrrqqquuuuo/B5Wrrrrqqquuuuqqq6666qp/g3/4h3/47Zd5mZd5bYBTp04BYBtJPD+SsM39JGGbB5KEbf4z2UYSz802AJK4n20kcT/bSALANpIAsI0kbCMJANtIwjaSsI0kbCMJ2ywWCwDuu+++W7nqqquuuuqq/xwEV1111VVXXXXVVVddddVV/wb/8A//8NunTp3iuUkiIpBERCAJSUhCEpKICCQhCUlIIiKQhCQkIQlJSEISkpCEJCQhCUkASEISkpCEJCQhCUlIQhKSkMT9JCEJSUhCEgCSkIQk7icJSQBIQhIAkpAEgCTuJwkASQBIAkAS91ssFgDcd999t3LVVVddddVV/zmoXHXVVVddddVVV1111VVX/Rvcd999t546dYpHPvKRnDx5EgDbSOK5ScI2AJKwzQNJwjb/VrYBkMS/hm0AJPFAtgGQxP1sIwkA20gCwDaSALCNJABsIwnbSMI2krANgCQWiwUAZ8+efQZXXXXVVVdd9Z+DylVXXXXVVVddddVVV1111b/B2bNnn/EP//APv/3IRz7ytU+dOsX9IgLbSMI2DyQJ2zyQJGzzH8E2DySJF4VtACTxQLaRxP1sIwkA2wBIwjYAkrCNJABsIwnbSMI2kgCwzcmTJwG47777buWqq6666qqr/nNQueqqq6666qqrrrrqqquu+jf6+7//+99+mZd5mdfmmWwjiQeShG2eH0nY5j+LbR5IEi+MbSTxQLYBkASAbQAkAWAbSQDYRhK2kQSAbSRhG0nYBkAS9zt79uytXHXVVVddddV/DipXXXXVVVddddVVV1111VX/Rv/wD//wO6//+q/P/SQhCUnYRhK2AZCEbe4nCdu8IJKwjW1sYxvbZCYAkshM/jVscz9JPD+2AZDEA9lGEvezjSQAbCMJANtIwjYAkrCNJGwjCQDbLBYLAO67775bueqqq6666qr/HFSuuuqqq6666qqrrrrqqqv+jc6ePXvrqVOnuJ8kJPHcJGGb+0nCNs9NEraxjW2en4jANpmJJP6tbAMgiefHNgCSuJ9tACQBYBtJANhGEgC2kQSAbSRhG0nYBuDkyZMA/MM//MNvc9VVV1111VX/eahcddVVV1111VVXXXXVVVf9G91333233nfffbdec801D+aZIgLbSMI2z00StnkgSdjGNi+qiCAz+feyzf0k8dxsAyCJ+9lGEgC2AZCEbQAkYRtJANhGEraRBMB8Pgfgvvvuu5Wrrrrqqquu+s9D5aqrrrrqqquuuuqqq6666t/h7Nmzt15zzTUPBpDEc5OEbQAkYZsHkoRt/i0igszkP4ptACTx3GwjifvZRhL3s40kAGwjCdsASMI2krANwGKxAOC+++67lauuuuqqq676z0Plqquuuuqqq6666qqrrrrq3+Hv//7vf/vFXuzFXhuglMLzY5vnxzYPZJvnZpv72eaBbHM/2zw329zPNg9kmweyzQPZ5rnZ5rnZ5vmxzQtim8ViAcDZs2efwVVXXXXVVVf956Fy1VVXXXXVVVddddVVV1317/Dbv/3b33P27NlnfPiHf/h3SeL5kcRVz+tHfuRHPvu3fuu3vpurrrrqqquu+s+DHvSgB3HVVVddddVVV1111VVXXfXvcc011zz4zJkzDwYMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpMB8ZwMiOdkQDwnA+I5GRDPyYB4TgbEczIgnpP/4R/+4Xe46qqrrrrqqv9c6EEPehBXXXXVVVddddVVV1111VVXXXXVVVddddX/SVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9V/CN0N9j6c4O5AwAAAABJRU5ErkJggg==) @@ -116,25 +136,29 @@ translate( ```kcl // Move a sketch. +fn square(@length){ + l = length / 2 + p0 = [-l, -l] + p1 = [-l, l] + p2 = [l, l] + p3 = [l, -l] -fn square(@length) { - l = length / 2 - p0 = [-l, -l] - p1 = [-l, l] - p2 = [l, l] - p3 = [l, -l] - - return startSketchOn(XY) - |> startProfile(at = p0) - |> line(endAbsolute = p1) - |> line(endAbsolute = p2) - |> line(endAbsolute = p3) - |> close() + return startSketchOn(XY) + |> startProfile(at = p0) + |> line(endAbsolute = p1) + |> line(endAbsolute = p2) + |> line(endAbsolute = p3) + |> close() } square(10) - |> translate(x = 5, y = 5) - |> extrude(length = 10) + |> translate( + x = 5, + y = 5, + ) + |> extrude( + length = 10, + ) ``` ![Rendered example of translate 3](data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABQAAAALQCAYAAADPfd1WAAFF/UlEQVR4Ae3AA6AkWZbG8f937o3IzKdyS2Oubdu2bdu2bdu2bWmMnpZKr54yMyLu+Xa3anqmhztr1a8+6EEP4qqrrrrqqquuuuqqq6666qqrrrrqqquu+j+JylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispV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L7G1tcW1117L5uYmL4gkXlSS+M8giReFJP6jSOLfSxIvjCT+rSTxgkji30IS/xqSeH4k8aKSxHOTxL9EEv8SSTyQJF4YSTyQJF4QSbwgkrifJJ4fSdxPEs+PJJ4fSQBI4vmRBIAknpsknpskACTx3CQBIIkHksQDSQJAEs9NEgCSeCBJPJAkACRxP0kASOKBJPFAkgCQxP0kASCJB5LEA0kCQBL3kwSAJB5IEg8kCQBJPJAkACRxP9tIwjYAtgGQBIAkbPNAkgCQxHOTxHOTxP0k8fxI4oEk8YJI4kUhiedHEi+q1hqtNQD+4R/+4be56qqrrrrqqv/ZqFx11VVXXXXV/3D/8A//8Nu/9Vu/9d2v8zqv894v+ZIvyVVXXXXVVf/xbPNAtrnqhfuHf/iH377vvvtu5aqrrrrqqqv+Z6Ny1VVXXXXVVf/D/cM//MPvAOKqq6666qqr/gf50R/90c+57777buWqq6666qqr/mdDD3rQg7jqqquuuuqqq6666qqrrrrqqquuuuqqq/5PonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/VVSuuuqqq6666qqrrrrqqquuuuqqq6666qr/q6hcddVVV1111VVXXXXVVVddddVVV1111VX/V1G56qqrrrrqqquuuuqqq6666qqrrrrqqqv+r6Jy1VVXXXXVVVddddVVV1111VVXXXXVVVf9X0Xlqquuuuqqq6666qqrrrrqqquuuuqqq676v4rKVVddddVVV1111VVXXXXVVVddddVVV131fxWVq6666qqrrrrqqquuuuqqq6666qqrrrrq/yoqV1111VVXXXXVVVddddVVV1111VVXXXXV/1VUrrrqqquuuuqqq6666qqrrrrqqquuuuqq/6uoXHXVVVddddVVV1111VVXXXXVVVddddVV/1dRueqqq6666qqrrrrqqquuuuqqq6666qqr/q+ictVVV1111VVXXXXVVVddddVVV1111VVX/V9F5aqrrrrqqquuuuqqq6666qqrrrrqqquu+r+KylVXXXXVVVddddVVV1111VVXXXXVVVdd9X8Vlauuuuqqq6666qqrrrrqqquuuuqqq6666v8qKlddddVVV1111VVXXXXVVVddddVVV1111f9VVK666qqrrrrqqquuuuqqq6666qqrrrrqqv+rqFx11VVXXXXVVVddddVVV1111VVXXXXVVf9XUbnqqquuuuqqq6666qqrrrrqqquuuuqqq/6vonLVVVddddVVV1111VVXXXXVVVddddVVV/1fReWqq6666qqrrrrqqquuuuqqq6666qqrrvq/ispVV1111VVXXXXVVVddddVVV1111VVXXfV/FZWrrrrqqquuuuqqq6666qqrrrrqqquuuur/KipXXXXVVVddddVVV1111VVXXXXVVVddddX/Vfwj4unhhWwFrmsAAAAASUVORK5CYII=) @@ -144,19 +168,19 @@ square(10) sketch001 = startSketchOn(XY) fn square() { - return startProfile(sketch001, at = [-10, 10]) - |> xLine(length = 20) - |> yLine(length = -20) - |> xLine(length = -20) - |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) - |> close() + return startProfile(sketch001, at = [-10, 10]) + |> xLine(length = 20) + |> yLine(length = -20) + |> xLine(length = -20) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() } profile001 = square() profile002 = square() - |> translate(z = 20) - |> rotate(axis = [0, 0, 1.0], angle = 45) + |> translate(z = 20) + |> rotate(axis = [0, 0, 1.0], angle = 45) loft([profile001, profile002]) ``` diff --git a/docs/kcl-std/index.md b/docs/kcl-std/index.md index aebc6cf8a..679596f84 100644 --- a/docs/kcl-std/index.md +++ b/docs/kcl-std/index.md @@ -9,12 +9,11 @@ layout: manual ### Functions * [**std**](/docs/kcl-std/modules/std) - * [`assert`](/docs/kcl-std/assert) - * [`assertIs`](/docs/kcl-std/assertIs) + * [`assert`](/docs/kcl-std/functions/std-assert) + * [`assertIs`](/docs/kcl-std/functions/std-assertIs) * [`clone`](/docs/kcl-std/functions/std-clone) * [`helix`](/docs/kcl-std/functions/std-helix) * [`offsetPlane`](/docs/kcl-std/functions/std-offsetPlane) - * [`patternLinear2d`](/docs/kcl-std/patternLinear2d) * [**std::appearance**](/docs/kcl-std/modules/std-appearance) * [`appearance::hexString`](/docs/kcl-std/functions/std-appearance-hexString) * [**std::array**](/docs/kcl-std/modules/std-array) @@ -48,46 +47,47 @@ layout: manual * [`sqrt`](/docs/kcl-std/functions/std-math-sqrt) * [`tan`](/docs/kcl-std/functions/std-math-tan) * [**std::sketch**](/docs/kcl-std/modules/std-sketch) - * [`angledLine`](/docs/kcl-std/angledLine) - * [`angledLineThatIntersects`](/docs/kcl-std/angledLineThatIntersects) - * [`arc`](/docs/kcl-std/arc) - * [`bezierCurve`](/docs/kcl-std/bezierCurve) + * [`angledLine`](/docs/kcl-std/functions/std-sketch-angledLine) + * [`angledLineThatIntersects`](/docs/kcl-std/functions/std-sketch-angledLineThatIntersects) + * [`arc`](/docs/kcl-std/functions/std-sketch-arc) + * [`bezierCurve`](/docs/kcl-std/functions/std-sketch-bezierCurve) * [`circle`](/docs/kcl-std/functions/std-sketch-circle) - * [`circleThreePoint`](/docs/kcl-std/circleThreePoint) - * [`close`](/docs/kcl-std/close) - * [`extrude`](/docs/kcl-std/extrude) - * [`getCommonEdge`](/docs/kcl-std/getCommonEdge) - * [`getNextAdjacentEdge`](/docs/kcl-std/getNextAdjacentEdge) - * [`getOppositeEdge`](/docs/kcl-std/getOppositeEdge) - * [`getPreviousAdjacentEdge`](/docs/kcl-std/getPreviousAdjacentEdge) - * [`involuteCircular`](/docs/kcl-std/involuteCircular) - * [`lastSegX`](/docs/kcl-std/lastSegX) - * [`lastSegY`](/docs/kcl-std/lastSegY) - * [`line`](/docs/kcl-std/line) - * [`loft`](/docs/kcl-std/loft) - * [`patternCircular2d`](/docs/kcl-std/patternCircular2d) + * [`circleThreePoint`](/docs/kcl-std/functions/std-sketch-circleThreePoint) + * [`close`](/docs/kcl-std/functions/std-sketch-close) + * [`extrude`](/docs/kcl-std/functions/std-sketch-extrude) + * [`getCommonEdge`](/docs/kcl-std/functions/std-sketch-getCommonEdge) + * [`getNextAdjacentEdge`](/docs/kcl-std/functions/std-sketch-getNextAdjacentEdge) + * [`getOppositeEdge`](/docs/kcl-std/functions/std-sketch-getOppositeEdge) + * [`getPreviousAdjacentEdge`](/docs/kcl-std/functions/std-sketch-getPreviousAdjacentEdge) + * [`involuteCircular`](/docs/kcl-std/functions/std-sketch-involuteCircular) + * [`lastSegX`](/docs/kcl-std/functions/std-sketch-lastSegX) + * [`lastSegY`](/docs/kcl-std/functions/std-sketch-lastSegY) + * [`line`](/docs/kcl-std/functions/std-sketch-line) + * [`loft`](/docs/kcl-std/functions/std-sketch-loft) + * [`patternCircular2d`](/docs/kcl-std/functions/std-sketch-patternCircular2d) + * [`patternLinear2d`](/docs/kcl-std/functions/std-sketch-patternLinear2d) * [`patternTransform2d`](/docs/kcl-std/functions/std-sketch-patternTransform2d) - * [`polygon`](/docs/kcl-std/polygon) - * [`profileStart`](/docs/kcl-std/profileStart) - * [`profileStartX`](/docs/kcl-std/profileStartX) - * [`profileStartY`](/docs/kcl-std/profileStartY) + * [`polygon`](/docs/kcl-std/functions/std-sketch-polygon) + * [`profileStart`](/docs/kcl-std/functions/std-sketch-profileStart) + * [`profileStartX`](/docs/kcl-std/functions/std-sketch-profileStartX) + * [`profileStartY`](/docs/kcl-std/functions/std-sketch-profileStartY) * [`revolve`](/docs/kcl-std/functions/std-sketch-revolve) - * [`segAng`](/docs/kcl-std/segAng) - * [`segEnd`](/docs/kcl-std/segEnd) - * [`segEndX`](/docs/kcl-std/segEndX) - * [`segEndY`](/docs/kcl-std/segEndY) - * [`segLen`](/docs/kcl-std/segLen) - * [`segStart`](/docs/kcl-std/segStart) - * [`segStartX`](/docs/kcl-std/segStartX) - * [`segStartY`](/docs/kcl-std/segStartY) - * [`startProfile`](/docs/kcl-std/startProfile) - * [`startSketchOn`](/docs/kcl-std/startSketchOn) - * [`subtract2d`](/docs/kcl-std/subtract2d) - * [`sweep`](/docs/kcl-std/sweep) - * [`tangentToEnd`](/docs/kcl-std/tangentToEnd) - * [`tangentialArc`](/docs/kcl-std/tangentialArc) - * [`xLine`](/docs/kcl-std/xLine) - * [`yLine`](/docs/kcl-std/yLine) + * [`segAng`](/docs/kcl-std/functions/std-sketch-segAng) + * [`segEnd`](/docs/kcl-std/functions/std-sketch-segEnd) + * [`segEndX`](/docs/kcl-std/functions/std-sketch-segEndX) + * [`segEndY`](/docs/kcl-std/functions/std-sketch-segEndY) + * [`segLen`](/docs/kcl-std/functions/std-sketch-segLen) + * [`segStart`](/docs/kcl-std/functions/std-sketch-segStart) + * [`segStartX`](/docs/kcl-std/functions/std-sketch-segStartX) + * [`segStartY`](/docs/kcl-std/functions/std-sketch-segStartY) + * [`startProfile`](/docs/kcl-std/functions/std-sketch-startProfile) + * [`startSketchOn`](/docs/kcl-std/functions/std-sketch-startSketchOn) + * [`subtract2d`](/docs/kcl-std/functions/std-sketch-subtract2d) + * [`sweep`](/docs/kcl-std/functions/std-sketch-sweep) + * [`tangentToEnd`](/docs/kcl-std/functions/std-sketch-tangentToEnd) + * [`tangentialArc`](/docs/kcl-std/functions/std-sketch-tangentialArc) + * [`xLine`](/docs/kcl-std/functions/std-sketch-xLine) + * [`yLine`](/docs/kcl-std/functions/std-sketch-yLine) * [**std::solid**](/docs/kcl-std/modules/std-solid) * [`appearance`](/docs/kcl-std/functions/std-solid-appearance) * [`chamfer`](/docs/kcl-std/functions/std-solid-chamfer) @@ -102,9 +102,9 @@ layout: manual * [`union`](/docs/kcl-std/functions/std-solid-union) * [**std::transform**](/docs/kcl-std/modules/std-transform) * [`mirror2d`](/docs/kcl-std/functions/std-transform-mirror2d) - * [`rotate`](/docs/kcl-std/rotate) - * [`scale`](/docs/kcl-std/scale) - * [`translate`](/docs/kcl-std/translate) + * [`rotate`](/docs/kcl-std/functions/std-transform-rotate) + * [`scale`](/docs/kcl-std/functions/std-transform-scale) + * [`translate`](/docs/kcl-std/functions/std-transform-translate) * [**std::units**](/docs/kcl-std/modules/std-units) * [`units::toCentimeters`](/docs/kcl-std/functions/std-units-toCentimeters) * [`units::toDegrees`](/docs/kcl-std/functions/std-units-toDegrees) @@ -144,11 +144,7 @@ layout: manual See also the [types overview](/docs/kcl-lang/types) * [**Primitive types**](/docs/kcl-lang/types) - * [`End`](/docs/kcl-lang/types#End) * [`ImportedGeometry`](/docs/kcl-std/types/std-types-ImportedGeometry) - * [`Start`](/docs/kcl-lang/types#Start) - * [`TagDeclarator`](/docs/kcl-lang/types#TagDeclarator) - * [`TagIdentifier`](/docs/kcl-lang/types#TagIdentifier) * [`any`](/docs/kcl-std/types/std-types-any) * [`bool`](/docs/kcl-std/types/std-types-bool) * [`fn`](/docs/kcl-std/types/std-types-fn) diff --git a/docs/kcl-std/modules/std-sketch.md b/docs/kcl-std/modules/std-sketch.md index 61218bd5e..9a0ed6df6 100644 --- a/docs/kcl-std/modules/std-sketch.md +++ b/docs/kcl-std/modules/std-sketch.md @@ -12,45 +12,46 @@ This module contains functions for creating and manipulating sketches, and makin ## Functions and constants -* [`angledLine`](/docs/kcl-std/angledLine) -* [`angledLineThatIntersects`](/docs/kcl-std/angledLineThatIntersects) -* [`arc`](/docs/kcl-std/arc) -* [`bezierCurve`](/docs/kcl-std/bezierCurve) +* [`angledLine`](/docs/kcl-std/functions/std-sketch-angledLine) +* [`angledLineThatIntersects`](/docs/kcl-std/functions/std-sketch-angledLineThatIntersects) +* [`arc`](/docs/kcl-std/functions/std-sketch-arc) +* [`bezierCurve`](/docs/kcl-std/functions/std-sketch-bezierCurve) * [`circle`](/docs/kcl-std/functions/std-sketch-circle) -* [`circleThreePoint`](/docs/kcl-std/circleThreePoint) -* [`close`](/docs/kcl-std/close) +* [`circleThreePoint`](/docs/kcl-std/functions/std-sketch-circleThreePoint) +* [`close`](/docs/kcl-std/functions/std-sketch-close) * [`ellipse`](/doc/kcl-std/ellipse) -* [`extrude`](/docs/kcl-std/extrude) -* [`getCommonEdge`](/docs/kcl-std/getCommonEdge) -* [`getNextAdjacentEdge`](/docs/kcl-std/getNextAdjacentEdge) -* [`getOppositeEdge`](/docs/kcl-std/getOppositeEdge) -* [`getPreviousAdjacentEdge`](/docs/kcl-std/getPreviousAdjacentEdge) -* [`involuteCircular`](/docs/kcl-std/involuteCircular) -* [`lastSegX`](/docs/kcl-std/lastSegX) -* [`lastSegY`](/docs/kcl-std/lastSegY) -* [`line`](/docs/kcl-std/line) -* [`loft`](/docs/kcl-std/loft) -* [`patternCircular2d`](/docs/kcl-std/patternCircular2d) +* [`extrude`](/docs/kcl-std/functions/std-sketch-extrude) +* [`getCommonEdge`](/docs/kcl-std/functions/std-sketch-getCommonEdge) +* [`getNextAdjacentEdge`](/docs/kcl-std/functions/std-sketch-getNextAdjacentEdge) +* [`getOppositeEdge`](/docs/kcl-std/functions/std-sketch-getOppositeEdge) +* [`getPreviousAdjacentEdge`](/docs/kcl-std/functions/std-sketch-getPreviousAdjacentEdge) +* [`involuteCircular`](/docs/kcl-std/functions/std-sketch-involuteCircular) +* [`lastSegX`](/docs/kcl-std/functions/std-sketch-lastSegX) +* [`lastSegY`](/docs/kcl-std/functions/std-sketch-lastSegY) +* [`line`](/docs/kcl-std/functions/std-sketch-line) +* [`loft`](/docs/kcl-std/functions/std-sketch-loft) +* [`patternCircular2d`](/docs/kcl-std/functions/std-sketch-patternCircular2d) +* [`patternLinear2d`](/docs/kcl-std/functions/std-sketch-patternLinear2d) * [`patternTransform2d`](/docs/kcl-std/functions/std-sketch-patternTransform2d) -* [`polygon`](/docs/kcl-std/polygon) -* [`profileStart`](/docs/kcl-std/profileStart) -* [`profileStartX`](/docs/kcl-std/profileStartX) -* [`profileStartY`](/docs/kcl-std/profileStartY) +* [`polygon`](/docs/kcl-std/functions/std-sketch-polygon) +* [`profileStart`](/docs/kcl-std/functions/std-sketch-profileStart) +* [`profileStartX`](/docs/kcl-std/functions/std-sketch-profileStartX) +* [`profileStartY`](/docs/kcl-std/functions/std-sketch-profileStartY) * [`revolve`](/docs/kcl-std/functions/std-sketch-revolve) -* [`segAng`](/docs/kcl-std/segAng) -* [`segEnd`](/docs/kcl-std/segEnd) -* [`segEndX`](/docs/kcl-std/segEndX) -* [`segEndY`](/docs/kcl-std/segEndY) -* [`segLen`](/docs/kcl-std/segLen) -* [`segStart`](/docs/kcl-std/segStart) -* [`segStartX`](/docs/kcl-std/segStartX) -* [`segStartY`](/docs/kcl-std/segStartY) -* [`startProfile`](/docs/kcl-std/startProfile) -* [`startSketchOn`](/docs/kcl-std/startSketchOn) -* [`subtract2d`](/docs/kcl-std/subtract2d) -* [`sweep`](/docs/kcl-std/sweep) -* [`tangentToEnd`](/docs/kcl-std/tangentToEnd) -* [`tangentialArc`](/docs/kcl-std/tangentialArc) -* [`xLine`](/docs/kcl-std/xLine) -* [`yLine`](/docs/kcl-std/yLine) +* [`segAng`](/docs/kcl-std/functions/std-sketch-segAng) +* [`segEnd`](/docs/kcl-std/functions/std-sketch-segEnd) +* [`segEndX`](/docs/kcl-std/functions/std-sketch-segEndX) +* [`segEndY`](/docs/kcl-std/functions/std-sketch-segEndY) +* [`segLen`](/docs/kcl-std/functions/std-sketch-segLen) +* [`segStart`](/docs/kcl-std/functions/std-sketch-segStart) +* [`segStartX`](/docs/kcl-std/functions/std-sketch-segStartX) +* [`segStartY`](/docs/kcl-std/functions/std-sketch-segStartY) +* [`startProfile`](/docs/kcl-std/functions/std-sketch-startProfile) +* [`startSketchOn`](/docs/kcl-std/functions/std-sketch-startSketchOn) +* [`subtract2d`](/docs/kcl-std/functions/std-sketch-subtract2d) +* [`sweep`](/docs/kcl-std/functions/std-sketch-sweep) +* [`tangentToEnd`](/docs/kcl-std/functions/std-sketch-tangentToEnd) +* [`tangentialArc`](/docs/kcl-std/functions/std-sketch-tangentialArc) +* [`xLine`](/docs/kcl-std/functions/std-sketch-xLine) +* [`yLine`](/docs/kcl-std/functions/std-sketch-yLine) diff --git a/docs/kcl-std/modules/std-transform.md b/docs/kcl-std/modules/std-transform.md index 5166cb8e5..e0cac73ad 100644 --- a/docs/kcl-std/modules/std-transform.md +++ b/docs/kcl-std/modules/std-transform.md @@ -13,7 +13,7 @@ This module contains functions for transforming sketches and solids. ## Functions and constants * [`mirror2d`](/docs/kcl-std/functions/std-transform-mirror2d) -* [`rotate`](/docs/kcl-std/rotate) -* [`scale`](/docs/kcl-std/scale) -* [`translate`](/docs/kcl-std/translate) +* [`rotate`](/docs/kcl-std/functions/std-transform-rotate) +* [`scale`](/docs/kcl-std/functions/std-transform-scale) +* [`translate`](/docs/kcl-std/functions/std-transform-translate) diff --git a/docs/kcl-std/modules/std.md b/docs/kcl-std/modules/std.md index ab1739d7e..a1f4b8783 100644 --- a/docs/kcl-std/modules/std.md +++ b/docs/kcl-std/modules/std.md @@ -36,10 +36,9 @@ You might also want the [KCL language reference](/docs/kcl-lang) or the [KCL gui * [`Y`](/docs/kcl-std/consts/std-Y) * [`YZ`](/docs/kcl-std/consts/std-YZ) * [`Z`](/docs/kcl-std/consts/std-Z) -* [`assert`](/docs/kcl-std/assert) -* [`assertIs`](/docs/kcl-std/assertIs) +* [`assert`](/docs/kcl-std/functions/std-assert) +* [`assertIs`](/docs/kcl-std/functions/std-assertIs) * [`clone`](/docs/kcl-std/functions/std-clone) * [`helix`](/docs/kcl-std/functions/std-helix) * [`offsetPlane`](/docs/kcl-std/functions/std-offsetPlane) -* [`patternLinear2d`](/docs/kcl-std/patternLinear2d) diff --git a/docs/kcl-std/std.json b/docs/kcl-std/std.json deleted file mode 100644 index 971a37e8d..000000000 --- a/docs/kcl-std/std.json +++ /dev/null @@ -1,241060 +0,0 @@ -[ - { - "name": "angledLine", - "summary": "Draw a line segment relative to the current origin using the polar measure of some angle and distance.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "angle", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double", - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which angle should the line be drawn at?", - "labelRequired": true - }, - { - "name": "length", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given.", - "labelRequired": true - }, - { - "name": "lengthX", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given.", - "labelRequired": true - }, - { - "name": "lengthY", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given.", - "labelRequired": true - }, - { - "name": "endAbsoluteX", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given.", - "labelRequired": true - }, - { - "name": "endAbsoluteY", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> yLine(endAbsolute = 15)\n |> angledLine(angle = 30, length = 15)\n |> line(end = [8, -10])\n |> yLine(endAbsolute = 0)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - }, - { - "name": "angledLineThatIntersects", - "summary": "Draw an angled line from the current origin, constructing a line segment such that the newly created line intersects the desired target line segment.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "angle", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which angle should the line be drawn at?", - "labelRequired": true - }, - { - "name": "intersectTag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The tag of the line to intersect with", - "labelRequired": true - }, - { - "name": "offset", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "The offset from the intersecting line. Defaults to 0.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(endAbsolute = [5, 10])\n |> line(endAbsolute = [-10, 10], tag = $lineToIntersect)\n |> line(endAbsolute = [0, 20])\n |> angledLineThatIntersects(angle = 80, intersectTag = lineToIntersect, offset = 10)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - }, - { - "name": "arc", - "summary": "Draw a curved line segment along an imaginary circle.", - "description": "The arc is constructed such that the current position of the sketch is placed along an imaginary circle of the specified radius, at angleStart degrees. The resulting arc is the segment of the imaginary circle from that origin point to angleEnd, radius away from the center of the imaginary circle.\n\nUnless this makes a lot of sense and feels like what you're looking for to construct your shape, you're likely looking for tangentialArc.", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "angleStart", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "Where along the circle should this arc start?", - "labelRequired": true - }, - { - "name": "angleEnd", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "Where along the circle should this arc end?", - "labelRequired": true - }, - { - "name": "radius", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "How large should the circle be?", - "labelRequired": true - }, - { - "name": "interiorAbsolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd`", - "labelRequired": true - }, - { - "name": "endAbsolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd`", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> arc(angleStart = 0, angleEnd = 280, radius = 16)\n |> close()\nexample = extrude(exampleSketch, length = 10)", - false - ], - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> arc(endAbsolute = [10, 0], interiorAbsolute = [5, 5])\n |> close()\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - }, - { - "name": "assert", - "summary": "Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. If you provide multiple conditions, they will all be checked and all must be met.", - "description": "", - "tags": [], - "args": [ - { - "name": "actual", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "description": "Value to check. It will be compared with one of the comparison arguments.", - "labelRequired": false - }, - { - "name": "isGreaterThan", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Comparison argument. If given, checks the `actual` value is greater than this.", - "labelRequired": true - }, - { - "name": "isLessThan", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Comparison argument. If given, checks the `actual` value is less than this.", - "labelRequired": true - }, - { - "name": "isGreaterThanOrEqual", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Comparison argument. If given, checks the `actual` value is greater than or equal to this.", - "labelRequired": true - }, - { - "name": "isLessThanOrEqual", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Comparison argument. If given, checks the `actual` value is less than or equal to this.", - "labelRequired": true - }, - { - "name": "isEqualTo", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "Comparison argument. If given, checks the `actual` value is less than or equal to this.", - "labelRequired": true - }, - { - "name": "tolerance", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places.", - "labelRequired": true - }, - { - "name": "error", - "type": "string", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_String", - "type": "string", - "nullable": true, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "If the value was false, the program will terminate with this error message", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "()", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Null", - "type": "null" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "n = 10\nassert(n, isEqualTo = 10)\nassert(\n n,\n isGreaterThanOrEqual = 0,\n isLessThan = 100,\n error = \"number should be between 0 and 100\",\n)\nassert(\n 1.0000000000012,\n isEqualTo = 1,\n tolerance = 0.0001,\n error = \"number should be almost exactly 1\",\n)", - false - ] - ] - }, - { - "name": "assertIs", - "summary": "Asserts that a value is the boolean value true.", - "description": "", - "tags": [], - "args": [ - { - "name": "actual", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Boolean", - "type": "boolean" - }, - "required": true, - "includeInSnippet": true, - "description": "Value to check. If this is the boolean value true, assert passes. Otherwise it fails.", - "labelRequired": false - }, - { - "name": "error", - "type": "string", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_String", - "type": "string", - "nullable": true - }, - "required": false, - "description": "If the value was false, the program will terminate with this error message", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "()", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Null", - "type": "null" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "kclIsFun = true\nassertIs(kclIsFun)", - false - ] - ] - }, - { - "name": "bezierCurve", - "summary": "Draw a smooth, continuous, curved line segment from the current origin to the desired (x, y), using a number of control points to shape the curve's shape.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "control1", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "First control point for the cubic", - "labelRequired": true - }, - { - "name": "control2", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Second control point for the cubic", - "labelRequired": true - }, - { - "name": "end", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "How far away (along the X and Y axes) should this line go?", - "labelRequired": true - }, - { - "name": "control1Absolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "First control point for the cubic. Absolute point.", - "labelRequired": true - }, - { - "name": "control2Absolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Second control point for the cubic. Absolute point.", - "labelRequired": true - }, - { - "name": "endAbsolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Coordinate on the plane at which this line should end.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Example using relative control points.\nexampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [0, 10])\n |> bezierCurve(control1 = [5, 0], control2 = [5, 10], end = [10, 10])\n |> line(endAbsolute = [10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ], - [ - "// Example using absolute control points.\nstartSketchOn(XY)\n |> startProfile(at = [300, 300])\n |> bezierCurve(control1Absolute = [600, 300], control2Absolute = [-300, -100], endAbsolute = [600, 600])\n |> close()\n |> extrude(length = 10)", - false - ] - ] - }, - { - "name": "circleThreePoint", - "summary": "Construct a circle derived from 3 points.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketchSurfaceOrGroup", - "type": "SketchOrSurface", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SketchOrSurface", - "description": "A sketch surface or a sketch.", - "anyOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - }, - { - "$ref": "#/components/schemas/Sketch" - } - ], - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Plane or surface to sketch on.", - "labelRequired": false - }, - { - "name": "p1", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "1st point to derive the circle.", - "labelRequired": true - }, - { - "name": "p2", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "2nd point to derive the circle.", - "labelRequired": true - }, - { - "name": "p3", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "3rd point to derive the circle.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Identifier for the circle to reference elsewhere.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XY)\n |> circleThreePoint(p1 = [10, 10], p2 = [20, 8], p3 = [15, 5])\n |> extrude(length = 5)", - false - ] - ] - }, - { - "name": "close", - "summary": "Construct a line segment from the current origin back to the profile's origin, ensuring the resulting 2-dimensional sketch is not open-ended.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The sketch you want to close", - "labelRequired": false - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 10])\n |> line(end = [10, 0])\n |> close()\n |> extrude(length = 10)", - false - ], - [ - "exampleSketch = startSketchOn(-XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - }, - { - "name": "extrude", - "summary": "Extend a 2-dimensional sketch through a third dimension in order to create new 3-dimensional volume, or if extruded into an existing volume, cut into an existing solid.", - "description": "You can provide more than one sketch to extrude, and they will all be extruded in the same direction.", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketches", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch or sketches should be extruded", - "labelRequired": false - }, - { - "name": "length", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "How far to extrude the given sketches", - "labelRequired": true - }, - { - "name": "symmetric", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch.", - "labelRequired": true - }, - { - "name": "bidirectionalLength", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored.", - "labelRequired": true - }, - { - "name": "tagStart", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "A named tag for the face at the start of the extrusion, i.e. the original sketch", - "labelRequired": true - }, - { - "name": "tagEnd", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "[Solid]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Solid", - "type": "array", - "items": { - "$ref": "#/components/schemas/Solid" - }, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "example = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> arc(angleStart = 120, angleEnd = 0, radius = 5)\n |> line(end = [5, 0])\n |> line(end = [0, 10])\n |> bezierCurve(control1 = [-10, 0], control2 = [2, 10], end = [-5, 10])\n |> line(end = [-5, -2])\n |> close()\n |> extrude(length = 10)", - false - ], - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [-10, 0])\n |> arc(angleStart = 120, angleEnd = -60, radius = 5)\n |> line(end = [10, 0])\n |> line(end = [5, 0])\n |> bezierCurve(control1 = [-3, 0], control2 = [2, 10], end = [-5, 10])\n |> line(end = [-4, 10])\n |> line(end = [-5, -2])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ], - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [-10, 0])\n |> arc(angleStart = 120, angleEnd = -60, radius = 5)\n |> line(end = [10, 0])\n |> line(end = [5, 0])\n |> bezierCurve(control1 = [-3, 0], control2 = [2, 10], end = [-5, 10])\n |> line(end = [-4, 10])\n |> line(end = [-5, -2])\n |> close()\n\nexample = extrude(exampleSketch, length = 20, symmetric = true)", - false - ], - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [-10, 0])\n |> arc(angleStart = 120, angleEnd = -60, radius = 5)\n |> line(end = [10, 0])\n |> line(end = [5, 0])\n |> bezierCurve(control1 = [-3, 0], control2 = [2, 10], end = [-5, 10])\n |> line(end = [-4, 10])\n |> line(end = [-5, -2])\n |> close()\n\nexample = extrude(exampleSketch, length = 10, bidirectionalLength = 50)", - false - ] - ] - }, - { - "name": "getCommonEdge", - "summary": "Get the shared edge between two faces.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "faces", - "type": "[TagIdentifier]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_TagIdentifier", - "type": "array", - "items": { - "$ref": "#/components/schemas/TagIdentifier" - }, - "definitions": { - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The tags of the faces you want to find the common edge between", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Uuid", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Uuid", - "type": "string", - "format": "uuid" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Get an edge shared between two faces, created after a chamfer.\n\n\nscale = 20\npart001 = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [0, scale])\n |> line(end = [scale, 0])\n |> line(end = [0, -scale])\n |> close(tag = $line0)\n |> extrude(length = 20, tagEnd = $end0)\n // We tag the chamfer to reference it later.\n |> chamfer(length = 10, tags = [getOppositeEdge(line0)], tag = $chamfer0)\n\n// Get the shared edge between the chamfer and the extrusion.\ncommonEdge = getCommonEdge(faces = [chamfer0, end0])\n\n// Chamfer the shared edge.\n// TODO: uncomment this when ssi for fillets lands\n// chamfer(part001, length = 5, tags = [commonEdge])", - false - ] - ] - }, - { - "name": "getNextAdjacentEdge", - "summary": "Get the next adjacent edge to the edge given.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "edge", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The tag of the edge you want to find the next adjacent edge of.", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "Uuid", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Uuid", - "type": "string", - "format": "uuid" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> angledLine(angle = 60, length = 10)\n |> angledLine(angle = 120, length = 10)\n |> line(end = [-10, 0])\n |> angledLine(angle = 240, length = 10, tag = $referenceEdge)\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n |> fillet(radius = 3, tags = [getNextAdjacentEdge(referenceEdge)])", - false - ] - ] - }, - { - "name": "getOppositeEdge", - "summary": "Get the opposite edge to the edge given.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "edge", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The tag of the edge you want to find the opposite edge of.", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "Uuid", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Uuid", - "type": "string", - "format": "uuid" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> angledLine(angle = 60, length = 10)\n |> angledLine(angle = 120, length = 10)\n |> line(end = [-10, 0])\n |> angledLine(angle = 240, length = 10, tag = $referenceEdge)\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n |> fillet(radius = 3, tags = [getOppositeEdge(referenceEdge)])", - false - ] - ] - }, - { - "name": "getPreviousAdjacentEdge", - "summary": "Get the previous adjacent edge to the edge given.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "edge", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The tag of the edge you want to find the previous adjacent edge of.", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "Uuid", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Uuid", - "type": "string", - "format": "uuid" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> angledLine(angle = 60, length = 10)\n |> angledLine(angle = 120, length = 10)\n |> line(end = [-10, 0])\n |> angledLine(angle = 240, length = 10, tag = $referenceEdge)\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n |> fillet(radius = 3, tags = [getPreviousAdjacentEdge(referenceEdge)])", - false - ] - ] - }, - { - "name": "involuteCircular", - "summary": "Extend the current sketch with a new involute circular curve.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "startRadius", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The involute is described between two circles, start_radius is the radius of the inner circle.", - "labelRequired": true - }, - { - "name": "endRadius", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The involute is described between two circles, end_radius is the radius of the outer circle.", - "labelRequired": true - }, - { - "name": "angle", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve.", - "labelRequired": true - }, - { - "name": "reverse", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. Defaults to false.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "a = 10\nb = 14\nstartSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> involuteCircular(startRadius = a, endRadius = b, angle = 60)\n |> involuteCircular(\n startRadius = a,\n endRadius = b,\n angle = 60,\n reverse = true,\n )", - false - ] - ] - }, - { - "name": "lastSegX", - "summary": "Extract the 'x' axis value of the last line segment in the provided 2-d sketch.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The sketch whose line segment is being queried", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [5, 0])\n |> line(end = [20, 5])\n |> line(end = [lastSegX(%), 0])\n |> line(end = [-15, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "lastSegY", - "summary": "Extract the 'y' axis value of the last line segment in the provided 2-d sketch.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The sketch whose line segment is being queried", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [5, 0])\n |> line(end = [20, 5])\n |> line(end = [0, lastSegY(%)])\n |> line(end = [-15, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "line", - "summary": "Extend the current sketch with a new straight line.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "endAbsolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Which absolute point should this line go to? Incompatible with `end`.", - "labelRequired": true - }, - { - "name": "end", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "How far away (along the X and Y axes) should this line go? Incompatible with `endAbsolute`.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "triangle = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n // The END argument means it ends at exactly [10, 0].\n // This is an absolute measurement, it is NOT relative to\n // the start of the sketch.\n |> line(endAbsolute = [10, 0])\n |> line(endAbsolute = [0, 10])\n |> line(endAbsolute = [-10, 0], tag = $thirdLineOfTriangle)\n |> close()\n |> extrude(length = 5)\n\nbox = startSketchOn(XZ)\n |> startProfile(at = [10, 10])\n // The 'to' argument means move the pen this much.\n // So, [10, 0] is a relative distance away from the current point.\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> line(end = [-10, 0], tag = $thirdLineOfBox)\n |> close()\n |> extrude(length = 5)", - false - ] - ] - }, - { - "name": "loft", - "summary": "Create a 3D surface or solid by interpolating between two or more sketches.", - "description": "The sketches need to closed and on the same plane.", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketches", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketches to loft. Must include at least 2 sketches.", - "labelRequired": false - }, - { - "name": "vDegree", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "NonZeroU32", - "type": "integer", - "format": "uint32", - "minimum": 1.0, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified.", - "labelRequired": true - }, - { - "name": "bezApproximateRational", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Boolean", - "type": "boolean", - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary.", - "labelRequired": true - }, - { - "name": "baseCurveIndex", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0, - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "This can be set to override the automatically determined topological base curve, which is usually the first section encountered.", - "labelRequired": true - }, - { - "name": "tolerance", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "Tolerance for the loft operation.", - "labelRequired": true - }, - { - "name": "tagStart", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "A named tag for the face at the start of the loft, i.e. the original sketch", - "labelRequired": true - }, - { - "name": "tagEnd", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "A named tag for the face at the end of the loft, i.e. the last sketch", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Solid", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Solid", - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - }, - "definitions": { - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Loft a square and a triangle.\nsquareSketch = startSketchOn(XY)\n |> startProfile(at = [-100, 200])\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ntriangleSketch = startSketchOn(offsetPlane(XY, offset = 75))\n |> startProfile(at = [0, 125])\n |> line(end = [-15, -30])\n |> line(end = [30, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\nloft([triangleSketch, squareSketch])", - false - ], - [ - "// Loft a square, a circle, and another circle.\nsquareSketch = startSketchOn(XY)\n |> startProfile(at = [-100, 200])\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch0 = startSketchOn(offsetPlane(XY, offset = 75))\n |> circle(center = [0, 100], radius = 50)\n\ncircleSketch1 = startSketchOn(offsetPlane(XY, offset = 150))\n |> circle(center = [0, 100], radius = 20)\n\nloft([\n squareSketch,\n circleSketch0,\n circleSketch1\n])", - false - ], - [ - "// Loft a square, a circle, and another circle with options.\nsquareSketch = startSketchOn(XY)\n |> startProfile(at = [-100, 200])\n |> line(end = [200, 0])\n |> line(end = [0, -200])\n |> line(end = [-200, 0])\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch0 = startSketchOn(offsetPlane(XY, offset = 75))\n |> circle(center = [0, 100], radius = 50)\n\ncircleSketch1 = startSketchOn(offsetPlane(XY, offset = 150))\n |> circle(center = [0, 100], radius = 20)\n\nloft(\n [\n squareSketch,\n circleSketch0,\n circleSketch1\n ],\n baseCurveIndex = 0,\n bezApproximateRational = false,\n tolerance = 0.000001,\n vDegree = 2,\n)", - false - ] - ] - }, - { - "name": "patternCircular2d", - "summary": "Repeat a 2-dimensional sketch some number of times along a partial or complete circle some specified number of times. Each object may additionally be rotated along the circle, ensuring orientation of the solid with respect to the center of the circle is maintained.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketchSet", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch(es) to pattern", - "labelRequired": false - }, - { - "name": "instances", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect.", - "labelRequired": true - }, - { - "name": "center", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "snippetValueArray": [ - "0", - "0" - ], - "description": "The center about which to make the pattern. This is a 2D vector.", - "labelRequired": true - }, - { - "name": "arcDegrees", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "The arc angle (in degrees) to place the repetitions. Must be greater than 0. Defaults to 360.", - "labelRequired": true - }, - { - "name": "rotateDuplicates", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "Whether or not to rotate the duplicates as they are copied. Defaults to true.", - "labelRequired": true - }, - { - "name": "useOriginal", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [.5, 25])\n |> line(end = [0, 5])\n |> line(end = [-1, 0])\n |> line(end = [0, -5])\n |> close()\n |> patternCircular2d(\n center = [0, 0],\n instances = 13,\n arcDegrees = 360,\n rotateDuplicates = true,\n )\n\nexample = extrude(exampleSketch, length = 1)", - false - ] - ] - }, - { - "name": "patternLinear2d", - "summary": "Repeat a 2-dimensional sketch along some dimension, with a dynamic amount of distance between each repetition, some specified number of times.", - "description": "", - "tags": [], - "args": [ - { - "name": "sketches", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The sketch(es) to duplicate", - "labelRequired": false - }, - { - "name": "instances", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "uint32", - "type": "integer", - "format": "uint32", - "minimum": 0.0, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect.", - "labelRequired": true - }, - { - "name": "distance", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Distance between each repetition. Also known as 'spacing'.", - "labelRequired": true - }, - { - "name": "axis", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "snippetValueArray": [ - "1", - "0" - ], - "description": "The axis of the pattern. A 2D vector.", - "labelRequired": true - }, - { - "name": "useOriginal", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": false, - "description": "If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// / Pattern using a named axis.\n\n\nexampleSketch = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 1)\n |> patternLinear2d(axis = X, instances = 7, distance = 4)\n\nexample = extrude(exampleSketch, length = 1)", - false - ], - [ - "// / Pattern using a raw axis.\n\n\nexampleSketch = startSketchOn(XZ)\n |> circle(center = [0, 0], radius = 1)\n |> patternLinear2d(axis = [1, 0], instances = 7, distance = 4)\n\nexample = extrude(exampleSketch, length = 1)", - false - ] - ] - }, - { - "name": "polygon", - "summary": "Create a regular polygon with the specified number of sides that is either inscribed or circumscribed around a circle of the specified radius.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketchSurfaceOrGroup", - "type": "SketchOrSurface", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SketchOrSurface", - "description": "A sketch surface or a sketch.", - "anyOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - }, - { - "$ref": "#/components/schemas/Sketch" - } - ], - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Plane or surface to sketch on", - "labelRequired": false - }, - { - "name": "radius", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double", - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The radius of the polygon", - "labelRequired": true - }, - { - "name": "numSides", - "type": "u64", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "uint64", - "type": "integer", - "format": "uint64", - "minimum": 0.0, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The number of sides in the polygon", - "labelRequired": true - }, - { - "name": "center", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "snippetValueArray": [ - "0", - "0" - ], - "description": "The center point of the polygon", - "labelRequired": true - }, - { - "name": "inscribed", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Create a regular hexagon inscribed in a circle of radius 10\nhex = startSketchOn(XY)\n |> polygon(\n radius = 10,\n numSides = 6,\n center = [0, 0],\n inscribed = true,\n )\n\nexample = extrude(hex, length = 5)", - false - ], - [ - "// Create a square circumscribed around a circle of radius 5\nsquare = startSketchOn(XY)\n |> polygon(\n radius = 5.0,\n numSides = 4,\n center = [10, 10],\n inscribed = false,\n )\nexample = extrude(square, length = 5)", - false - ] - ] - }, - { - "name": "profileStart", - "summary": "Extract the provided 2-dimensional sketch's profile's origin value.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "profile", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Profile whose start is being used", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "[number]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_double", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "sketch001 = startSketchOn(XY)\n |> startProfile(at = [5, 2])\n |> angledLine(angle = 120, length = 50, tag = $seg01)\n |> angledLine(angle = segAng(seg01) + 120, length = 50)\n |> line(end = profileStart(%))\n |> close()\n |> extrude(length = 20)", - false - ] - ] - }, - { - "name": "profileStartX", - "summary": "Extract the provided 2-dimensional sketch's profile's origin's 'x' value.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "profile", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Profile whose start is being used", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "sketch001 = startSketchOn(XY)\n |> startProfile(at = [5, 2])\n |> angledLine(angle = -26.6, length = 50)\n |> angledLine(angle = 90, length = 50)\n |> angledLine(angle = 30, endAbsoluteX = profileStartX(%))", - false - ] - ] - }, - { - "name": "profileStartY", - "summary": "Extract the provided 2-dimensional sketch's profile's origin's 'y' value.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "profile", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Profile whose start is being used", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "sketch001 = startSketchOn(XY)\n |> startProfile(at = [5, 2])\n |> angledLine(angle = -60, length = 14)\n |> angledLine(angle = 30, endAbsoluteY = profileStartY(%))", - false - ] - ] - }, - { - "name": "rotate", - "summary": "Rotate a solid or a sketch.", - "description": "This is really useful for assembling parts together. You can create a part and then rotate it to the correct orientation.\n\nFor sketches, you can use this to rotate a sketch and then loft it with another sketch.\n\n### Using Roll, Pitch, and Yaw\n\nWhen rotating a part in 3D space, \"roll,\" \"pitch,\" and \"yaw\" refer to the three rotational axes used to describe its orientation: roll is rotation around the longitudinal axis (front-to-back), pitch is rotation around the lateral axis (wing-to-wing), and yaw is rotation around the vertical axis (up-down); essentially, it's like tilting the part on its side (roll), tipping the nose up or down (pitch), and turning it left or right (yaw).\n\nSo, in the context of a 3D model:\n\n- **Roll**: Imagine spinning a pencil on its tip - that's a roll movement.\n\n- **Pitch**: Think of a seesaw motion, where the object tilts up or down along its side axis.\n\n- **Yaw**: Like turning your head left or right, this is a rotation around the vertical axis\n\n### Using an Axis and Angle\n\nWhen rotating a part around an axis, you specify the axis of rotation and the angle of rotation.", - "tags": [ - "transform" - ], - "args": [ - { - "name": "objects", - "type": "SolidOrSketchOrImportedGeometry", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SolidOrSketchOrImportedGeometry", - "description": "Data for a solid, sketch, or an imported geometry.", - "oneOf": [ - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "importedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Solid" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "solidSet" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "sketchSet" - ] - } - } - } - ], - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The solid, sketch, or set of solids or sketches to rotate.", - "labelRequired": false - }, - { - "name": "roll", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The roll angle in degrees. Must be between -360 and 360. Default is 0 if not given.", - "labelRequired": true - }, - { - "name": "pitch", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The pitch angle in degrees. Must be between -360 and 360. Default is 0 if not given.", - "labelRequired": true - }, - { - "name": "yaw", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The yaw angle in degrees. Must be between -360 and 360. Default is 0 if not given.", - "labelRequired": true - }, - { - "name": "axis", - "type": "[number]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_3_of_double", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 3, - "minItems": 3, - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "The axis to rotate around. Must be used with `angle`.", - "labelRequired": true - }, - { - "name": "angle", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "The angle to rotate in degrees. Must be used with `axis`. Must be between -360 and 360.", - "labelRequired": true - }, - { - "name": "global", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "SolidOrSketchOrImportedGeometry", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SolidOrSketchOrImportedGeometry", - "description": "Data for a solid, sketch, or an imported geometry.", - "oneOf": [ - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "importedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Solid" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "solidSet" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "sketchSet" - ] - } - } - } - ], - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Rotate a pipe with roll, pitch, and yaw.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> rotate(roll = 10, pitch = 10, yaw = 90)", - false - ], - [ - "// Rotate a pipe with just roll.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> rotate(roll = 10)", - false - ], - [ - "// Rotate a pipe about a named axis with an angle.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> rotate(axis = Z, angle = 90)", - false - ], - [ - "// Rotate an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\ncube\n |> rotate(axis = [0, 0, 1.0], angle = 9)", - false - ], - [ - "// Rotate a pipe about a raw axis with an angle.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> rotate(axis = [0, 0, 1.0], angle = 90)", - false - ], - [ - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfile(sketch001, at = [-200, 23.86])\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Rotate the sweeps.\nrotate(parts, axis = [0, 0, 1.0], angle = 90)", - false - ], - [ - "// Translate and rotate a sketch to create a loft.\nsketch001 = startSketchOn(XY)\n\nfn square() {\n return startProfile(sketch001, at = [-10, 10])\n |> xLine(length = 20)\n |> yLine(length = -20)\n |> xLine(length = -20)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n}\n\nprofile001 = square()\n\nprofile002 = square()\n |> translate(x = 0, y = 0, z = 20)\n |> rotate(axis = [0, 0, 1.0], angle = 45)\n\nloft([profile001, profile002])", - false - ] - ] - }, - { - "name": "scale", - "summary": "Scale a solid or a sketch.", - "description": "This is really useful for resizing parts. You can create a part and then scale it to the correct size.\n\nFor sketches, you can use this to scale a sketch and then loft it with another sketch.\n\nBy default the transform is applied in local sketch axis, therefore the origin will not move.\n\nIf you want to apply the transform in global space, set `global` to `true`. The origin of the model will move. If the model is not centered on origin and you scale globally it will look like the model moves and gets bigger at the same time. Say you have a square `(1,1) - (1,2) - (2,2) - (2,1)` and you scale by 2 globally it will become `(2,2) - (2,4)`...etc so the origin has moved from `(1.5, 1.5)` to `(2,2)`.", - "tags": [ - "transform" - ], - "args": [ - { - "name": "objects", - "type": "SolidOrSketchOrImportedGeometry", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SolidOrSketchOrImportedGeometry", - "description": "Data for a solid, sketch, or an imported geometry.", - "oneOf": [ - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "importedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Solid" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "solidSet" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "sketchSet" - ] - } - } - } - ], - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The solid, sketch, or set of solids or sketches to scale.", - "labelRequired": false - }, - { - "name": "x", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The scale factor for the x axis. Default is 1 if not provided.", - "labelRequired": true - }, - { - "name": "y", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The scale factor for the y axis. Default is 1 if not provided.", - "labelRequired": true - }, - { - "name": "z", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_double", - "type": "number", - "format": "double", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The scale factor for the z axis. Default is 1 if not provided.", - "labelRequired": true - }, - { - "name": "global", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "SolidOrSketchOrImportedGeometry", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SolidOrSketchOrImportedGeometry", - "description": "Data for a solid, sketch, or an imported geometry.", - "oneOf": [ - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "importedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Solid" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "solidSet" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "sketchSet" - ] - } - } - } - ], - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Scale a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> scale(z = 2.5)", - false - ], - [ - "// Scale an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\ncube\n |> scale(y = 2.5)", - false - ], - [ - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfile(sketch001, at = [-200, 23.86])\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Scale the sweep.\nscale(parts, z = 0.5)", - false - ] - ] - }, - { - "name": "segAng", - "summary": "Compute the angle (in degrees) of the provided line segment.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> line(end = [5, 10], tag = $seg01)\n |> line(end = [-10, 0])\n |> angledLine(angle = segAng(seg01), length = 10)\n |> line(end = [-10, 0])\n |> angledLine(angle = segAng(seg01), length = -15)\n |> close()\n\nexample = extrude(exampleSketch, length = 4)", - false - ] - ] - }, - { - "name": "segEnd", - "summary": "Compute the ending point of the provided line segment.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "w = 15\ncube = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> circle(radius = radius, center = segEnd(tag))\n |> extrude(length = radius)\n}\n\ncylinder(radius = 1, tag = line1)\ncylinder(radius = 2, tag = line2)\ncylinder(radius = 3, tag = line3)\ncylinder(radius = 4, tag = line4)", - false - ] - ] - }, - { - "name": "segEndX", - "summary": "Compute the ending point of the provided line segment along the 'x' axis.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [20, 0], tag = $thing)\n |> line(end = [0, 5])\n |> line(end = [segEndX(thing), 0])\n |> line(end = [-20, 10])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "segEndY", - "summary": "Compute the ending point of the provided line segment along the 'y' axis.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [20, 0])\n |> line(end = [0, 3], tag = $thing)\n |> line(end = [-10, 0])\n |> line(end = [0, segEndY(thing)])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "segLen", - "summary": "Compute the length of the provided line segment.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> angledLine(angle = 60, length = 10, tag = $thing)\n |> tangentialArc(angle = -120, radius = 5)\n |> angledLine(angle = -60, length = segLen(thing))\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "segStart", - "summary": "Compute the starting point of the provided line segment.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "w = 15\ncube = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [w, 0], tag = $line1)\n |> line(end = [0, w], tag = $line2)\n |> line(end = [-w, 0], tag = $line3)\n |> line(end = [0, -w], tag = $line4)\n |> close()\n |> extrude(length = 5)\n\nfn cylinder(radius, tag) {\n return startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> circle(radius = radius, center = segStart(tag))\n |> extrude(length = radius)\n}\n\ncylinder(radius = 1, tag = line1)\ncylinder(radius = 2, tag = line2)\ncylinder(radius = 3, tag = line3)\ncylinder(radius = 4, tag = line4)", - false - ] - ] - }, - { - "name": "segStartX", - "summary": "Compute the starting point of the provided line segment along the 'x' axis.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [20, 0], tag = $thing)\n |> line(end = [0, 5])\n |> line(end = [20 - segStartX(thing), 0])\n |> line(end = [-20, 10])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "segStartY", - "summary": "Compute the starting point of the provided line segment along the 'y' axis.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TyF64", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [20, 0])\n |> line(end = [0, 3], tag = $thing)\n |> line(end = [-10, 0])\n |> line(end = [0, 20 - segStartY(thing)])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "startProfile", - "summary": "Start a new profile at a given point.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketchSurface", - "type": "SketchSurface", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SketchSurface", - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ], - "definitions": { - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "What to start the profile on", - "labelRequired": false - }, - { - "name": "at", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "definitions": { - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "snippetValueArray": [ - "0", - "0" - ], - "description": "Where to start the profile. An absolute point.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Tag this first starting point", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ], - [ - "exampleSketch = startSketchOn(-XZ)\n |> startProfile(at = [10, 10])\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ], - [ - "exampleSketch = startSketchOn(-XZ)\n |> startProfile(at = [-10, 23])\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)", - false - ] - ] - }, - { - "name": "startSketchOn", - "summary": "Start a new 2-dimensional sketch on a specific plane or face.", - "description": "### Sketch on Face Behavior\n\nThere are some important behaviors to understand when sketching on a face:\n\nThe resulting sketch will _include_ the face and thus Solid that was sketched on. So say you were to export the resulting Sketch / Solid from a sketch on a face, you would get both the artifact of the sketch on the face and the parent face / Solid itself.\n\nThis is important to understand because if you were to then sketch on the resulting Solid, it would again include the face and parent Solid that was sketched on. This could go on indefinitely.\n\nThe point is if you want to export the result of a sketch on a face, you only need to export the final Solid that was created from the sketch on the face, since it will include all the parent faces and Solids.", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "planeOrSolid", - "type": "SketchData", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SketchData", - "description": "Data for start sketch on. You can start a sketch on a plane or an solid.", - "anyOf": [ - { - "$ref": "#/components/schemas/PlaneData" - }, - { - "$ref": "#/components/schemas/Plane" - }, - { - "$ref": "#/components/schemas/Solid" - } - ], - "definitions": { - "PlaneData": { - "description": "Orientation data that can be used to construct a plane, not a plane in itself.", - "oneOf": [ - { - "description": "The XY plane.", - "type": "string", - "enum": [ - "XY" - ] - }, - { - "description": "The opposite side of the XY plane.", - "type": "string", - "enum": [ - "-XY" - ] - }, - { - "description": "The XZ plane.", - "type": "string", - "enum": [ - "XZ" - ] - }, - { - "description": "The opposite side of the XZ plane.", - "type": "string", - "enum": [ - "-XZ" - ] - }, - { - "description": "The YZ plane.", - "type": "string", - "enum": [ - "YZ" - ] - }, - { - "description": "The opposite side of the YZ plane.", - "type": "string", - "enum": [ - "-YZ" - ] - }, - { - "description": "A defined plane.", - "type": "object", - "required": [ - "plane" - ], - "properties": { - "plane": { - "$ref": "#/components/schemas/PlaneInfo" - } - }, - "additionalProperties": false - } - ] - }, - "PlaneInfo": { - "type": "object", - "required": [ - "origin", - "xAxis", - "yAxis" - ], - "properties": { - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Plane": { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The plane or solid to sketch on", - "labelRequired": false - }, - { - "name": "face", - "type": "FaceTag", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_FaceTag", - "allOf": [ - { - "$ref": "#/components/schemas/FaceTag" - } - ], - "nullable": true, - "definitions": { - "PlaneData": { - "description": "Orientation data that can be used to construct a plane, not a plane in itself.", - "oneOf": [ - { - "description": "The XY plane.", - "type": "string", - "enum": [ - "XY" - ] - }, - { - "description": "The opposite side of the XY plane.", - "type": "string", - "enum": [ - "-XY" - ] - }, - { - "description": "The XZ plane.", - "type": "string", - "enum": [ - "XZ" - ] - }, - { - "description": "The opposite side of the XZ plane.", - "type": "string", - "enum": [ - "-XZ" - ] - }, - { - "description": "The YZ plane.", - "type": "string", - "enum": [ - "YZ" - ] - }, - { - "description": "The opposite side of the YZ plane.", - "type": "string", - "enum": [ - "-YZ" - ] - }, - { - "description": "A defined plane.", - "type": "object", - "required": [ - "plane" - ], - "properties": { - "plane": { - "$ref": "#/components/schemas/PlaneInfo" - } - }, - "additionalProperties": false - } - ] - }, - "PlaneInfo": { - "type": "object", - "required": [ - "origin", - "xAxis", - "yAxis" - ], - "properties": { - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Plane": { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "FaceTag": { - "description": "A tag for a face.", - "anyOf": [ - { - "$ref": "#/components/schemas/StartOrEnd" - }, - { - "description": "A tag for the face.", - "allOf": [ - { - "$ref": "#/components/schemas/TagIdentifier" - } - ] - } - ] - }, - "StartOrEnd": { - "oneOf": [ - { - "description": "The start face as in before you extruded. This could also be known as the bottom face. But we do not call it bottom because it would be the top face if you extruded it in the opposite direction or flipped the camera.", - "type": "string", - "enum": [ - "start" - ] - }, - { - "description": "The end face after you extruded. This could also be known as the top face. But we do not call it top because it would be the bottom face if you extruded it in the opposite direction or flipped the camera.", - "type": "string", - "enum": [ - "end" - ] - } - ] - } - } - }, - "required": false, - "description": "Identify a face of a solid if a solid is specified as the input argument (`plane_or_solid`)", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "SketchSurface", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SketchSurface", - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ], - "definitions": { - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5)\n\nexampleSketch002 = startSketchOn(example, face = END)\n |> startProfile(at = [1, 1])\n |> line(end = [8, 0])\n |> line(end = [0, 8])\n |> line(end = [-8, 0])\n |> close()\n\nexample002 = extrude(exampleSketch002, length = 5)\n\nexampleSketch003 = startSketchOn(example002, face = END)\n |> startProfile(at = [2, 2])\n |> line(end = [6, 0])\n |> line(end = [0, 6])\n |> line(end = [-6, 0])\n |> close()\n\nexample003 = extrude(exampleSketch003, length = 5)", - false - ], - [ - "// Sketch on the end of an extruded face by tagging the end face.\n\n\nexampleSketch = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> line(end = [0, 10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 5, tagEnd = $end01)\n\nexampleSketch002 = startSketchOn(example, face = end01)\n |> startProfile(at = [1, 1])\n |> line(end = [8, 0])\n |> line(end = [0, 8])\n |> line(end = [-8, 0])\n |> close()\n\nexample002 = extrude(exampleSketch002, length = 5, tagEnd = $end02)\n\nexampleSketch003 = startSketchOn(example002, face = end02)\n |> startProfile(at = [2, 2])\n |> line(end = [6, 0])\n |> line(end = [0, 6])\n |> line(end = [-6, 0])\n |> close()\n\nexample003 = extrude(exampleSketch003, length = 5)", - false - ], - [ - "exampleSketch = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0])\n |> line(end = [0, 10], tag = $sketchingFace)\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)\n\nexampleSketch002 = startSketchOn(example, face = sketchingFace)\n |> startProfile(at = [1, 1])\n |> line(end = [8, 0])\n |> line(end = [0, 8])\n |> line(end = [-8, 0])\n |> close(tag = $sketchingFace002)\n\nexample002 = extrude(exampleSketch002, length = 10)\n\nexampleSketch003 = startSketchOn(example002, face = sketchingFace002)\n |> startProfile(at = [-8, 12])\n |> line(end = [0, 6])\n |> line(end = [6, 0])\n |> line(end = [0, -6])\n |> close()\n\nexample003 = extrude(exampleSketch003, length = 5)", - false - ], - [ - "exampleSketch = startSketchOn(XY)\n |> startProfile(at = [4, 12])\n |> line(end = [2, 0])\n |> line(end = [0, -6])\n |> line(end = [4, -6])\n |> line(end = [0, -6])\n |> line(end = [-3.75, -4.5])\n |> line(end = [0, -5.5])\n |> line(end = [-2, 0])\n |> close()\n\nexample = revolve(exampleSketch, axis = Y, angle = 180)\n\nexampleSketch002 = startSketchOn(example, face = END)\n |> startProfile(at = [4.5, -5])\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n\nexample002 = extrude(exampleSketch002, length = 5)", - false - ], - [ - "// Sketch on the end of a revolved face by tagging the end face.\n\n\nexampleSketch = startSketchOn(XY)\n |> startProfile(at = [4, 12])\n |> line(end = [2, 0])\n |> line(end = [0, -6])\n |> line(end = [4, -6])\n |> line(end = [0, -6])\n |> line(end = [-3.75, -4.5])\n |> line(end = [0, -5.5])\n |> line(end = [-2, 0])\n |> close()\n\nexample = revolve(\n exampleSketch,\n axis = Y,\n angle = 180,\n tagEnd = $end01,\n)\n\nexampleSketch002 = startSketchOn(example, face = end01)\n |> startProfile(at = [4.5, -5])\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n\nexample002 = extrude(exampleSketch002, length = 5)", - false - ], - [ - "a1 = startSketchOn({\n origin = { x = 0, y = 0, z = 0 },\n xAxis = { x = 1, y = 0, z = 0 },\n yAxis = { x = 0, y = 1, z = 0 },\n zAxis = { x = 0, y = 0, z = 1 }\n })\n |> startProfile(at = [0, 0])\n |> line(end = [100.0, 0])\n |> yLine(length = -100.0)\n |> xLine(length = -100.0)\n |> yLine(length = 100.0)\n |> close()\n |> extrude(length = 3.14)", - false - ] - ] - }, - { - "name": "subtract2d", - "summary": "Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "tool", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The shape(s) which should be cut out of the sketch.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> line(end = [0, 5])\n |> line(end = [5, 0])\n |> line(end = [0, -5])\n |> close()\n |> subtract2d(tool = circle(center = [1, 1], radius = .25))\n |> subtract2d(tool = circle(center = [1, 4], radius = .25))\n\nexample = extrude(exampleSketch, length = 1)", - false - ], - [ - "fn squareHoleSketch() {\n squareSketch = startSketchOn(-XZ)\n |> startProfile(at = [-1, -1])\n |> line(end = [2, 0])\n |> line(end = [0, 2])\n |> line(end = [-2, 0])\n |> close()\n return squareSketch\n}\n\nexampleSketch = startSketchOn(-XZ)\n |> circle(center = [0, 0], radius = 3)\n |> subtract2d(tool = squareHoleSketch())\nexample = extrude(exampleSketch, length = 1)", - false - ] - ] - }, - { - "name": "sweep", - "summary": "Extrude a sketch along a path.", - "description": "This, like extrude, is able to create a 3-dimensional solid from a 2-dimensional sketch. However, unlike extrude, this creates a solid by using the extent of the sketch as its path. This is useful for creating more complex shapes that can't be created with a simple extrusion.\n\nYou can provide more than one sketch to sweep, and they will all be swept along the same path.", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketches", - "type": "[Sketch]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Sketch", - "type": "array", - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The sketch or set of sketches that should be swept in space", - "labelRequired": false - }, - { - "name": "path", - "type": "SweepPath", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SweepPath", - "description": "A path to sweep along.", - "anyOf": [ - { - "$ref": "#/components/schemas/Sketch" - }, - { - "$ref": "#/components/schemas/Helix" - } - ], - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "Helix": { - "description": "A helix.", - "type": "object", - "required": [ - "angleStart", - "artifactId", - "ccw", - "revolutions", - "units", - "value" - ], - "properties": { - "value": { - "description": "The id of the helix.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "revolutions": { - "description": "Number of revolutions.", - "type": "number", - "format": "double" - }, - "angleStart": { - "description": "Start angle (in degrees).", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "Is the helix rotation counter clockwise?", - "type": "boolean" - }, - "cylinderId": { - "description": "The cylinder the helix was created on.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The path to sweep the sketch along", - "labelRequired": true - }, - { - "name": "sectional", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "Helix": { - "description": "A helix.", - "type": "object", - "required": [ - "angleStart", - "artifactId", - "ccw", - "revolutions", - "units", - "value" - ], - "properties": { - "value": { - "description": "The id of the helix.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "revolutions": { - "description": "Number of revolutions.", - "type": "number", - "format": "double" - }, - "angleStart": { - "description": "Start angle (in degrees).", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "Is the helix rotation counter clockwise?", - "type": "boolean" - }, - "cylinderId": { - "description": "The cylinder the helix was created on.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - } - }, - "required": false, - "description": "If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components.", - "labelRequired": true - }, - { - "name": "tolerance", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "Helix": { - "description": "A helix.", - "type": "object", - "required": [ - "angleStart", - "artifactId", - "ccw", - "revolutions", - "units", - "value" - ], - "properties": { - "value": { - "description": "The id of the helix.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "revolutions": { - "description": "Number of revolutions.", - "type": "number", - "format": "double" - }, - "angleStart": { - "description": "Start angle (in degrees).", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "Is the helix rotation counter clockwise?", - "type": "boolean" - }, - "cylinderId": { - "description": "The cylinder the helix was created on.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - } - }, - "required": false, - "description": "Tolerance for this operation", - "labelRequired": true - }, - { - "name": "relativeTo", - "type": "string", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_String", - "type": "string", - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "Helix": { - "description": "A helix.", - "type": "object", - "required": [ - "angleStart", - "artifactId", - "ccw", - "revolutions", - "units", - "value" - ], - "properties": { - "value": { - "description": "The id of the helix.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "revolutions": { - "description": "Number of revolutions.", - "type": "number", - "format": "double" - }, - "angleStart": { - "description": "Start angle (in degrees).", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "Is the helix rotation counter clockwise?", - "type": "boolean" - }, - "cylinderId": { - "description": "The cylinder the helix was created on.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - } - }, - "required": false, - "description": "What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to trajectoryCurve.", - "labelRequired": true - }, - { - "name": "tagStart", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "Helix": { - "description": "A helix.", - "type": "object", - "required": [ - "angleStart", - "artifactId", - "ccw", - "revolutions", - "units", - "value" - ], - "properties": { - "value": { - "description": "The id of the helix.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "revolutions": { - "description": "Number of revolutions.", - "type": "number", - "format": "double" - }, - "angleStart": { - "description": "Start angle (in degrees).", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "Is the helix rotation counter clockwise?", - "type": "boolean" - }, - "cylinderId": { - "description": "The cylinder the helix was created on.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - } - }, - "required": false, - "description": "A named tag for the face at the start of the sweep, i.e. the original sketch", - "labelRequired": true - }, - { - "name": "tagEnd", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "Helix": { - "description": "A helix.", - "type": "object", - "required": [ - "angleStart", - "artifactId", - "ccw", - "revolutions", - "units", - "value" - ], - "properties": { - "value": { - "description": "The id of the helix.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "revolutions": { - "description": "Number of revolutions.", - "type": "number", - "format": "double" - }, - "angleStart": { - "description": "Start angle (in degrees).", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "Is the helix rotation counter clockwise?", - "type": "boolean" - }, - "cylinderId": { - "description": "The cylinder the helix was created on.", - "type": "string", - "format": "uuid", - "nullable": true - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - } - }, - "required": false, - "description": "A named tag for the face at the end of the sweep", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "[Solid]", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Array_of_Solid", - "type": "array", - "items": { - "$ref": "#/components/schemas/Solid" - }, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Create a pipe using a sweep.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)", - false - ], - [ - "// Create a spring by sweeping around a helix path.\n\n// Create a helix around the Z axis.\nhelixPath = helix(\n angleStart = 0,\n ccw = true,\n revolutions = 4,\n length = 10,\n radius = 5,\n axis = Z,\n)\n\n// Create a spring by sweeping around the helix path.\nspringSketch = startSketchOn(XZ)\n |> circle(center = [5, 0], radius = 1)\n |> sweep(path = helixPath)", - false - ], - [ - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfile(sketch001, at = [-200, 23.86])\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nsweep([rectangleSketch, circleSketch], path = sweepPath)", - false - ], - [ - "// Sectionally sweep one sketch along the path\n\n\nsketch001 = startSketchOn(XY)\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nsweep(circleSketch, path = sweepPath, sectional = true)", - false - ] - ] - }, - { - "name": "tangentToEnd", - "summary": "Returns the angle coming out of the end of the segment in degrees.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "tag", - "type": "TagIdentifier", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "TagIdentifier", - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The line segment being queried by its tag", - "labelRequired": false - } - ], - "returnValue": { - "name": "", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "double", - "type": "number", - "format": "double" - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Horizontal pill.\npillSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [20, 0])\n |> tangentialArc(end = [0, 10], tag = $arc1)\n |> angledLine(angle = tangentToEnd(arc1), length = 20)\n |> tangentialArc(end = [0, -10])\n |> close()\n\npillExtrude = extrude(pillSketch, length = 10)", - false - ], - [ - "// Vertical pill. Use absolute coordinate for arc.\npillSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [0, 20])\n |> tangentialArc(endAbsolute = [10, 20], tag = $arc1)\n |> angledLine(angle = tangentToEnd(arc1), length = 20)\n |> tangentialArc(end = [-10, 0])\n |> close()\n\npillExtrude = extrude(pillSketch, length = 10)", - false - ], - [ - "rectangleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> line(end = [10, 0], tag = $seg1)\n |> angledLine(angle = tangentToEnd(seg1), length = 10)\n |> line(end = [0, 10])\n |> line(end = [-20, 0])\n |> close()\n\nrectangleExtrude = extrude(rectangleSketch, length = 10)", - false - ], - [ - "bottom = startSketchOn(XY)\n |> startProfile(at = [0, 0])\n |> arc(endAbsolute = [10, 10], interiorAbsolute = [5, 1], tag = $arc1)\n |> angledLine(angle = tangentToEnd(arc1), length = 20)\n |> close()", - false - ], - [ - "circSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 3, tag = $circ)\n\ntriangleSketch = startSketchOn(XY)\n |> startProfile(at = [-5, 0])\n |> angledLine(angle = tangentToEnd(circ), length = 10)\n |> line(end = [-15, 0])\n |> close()", - false - ] - ] - }, - { - "name": "tangentialArc", - "summary": "Starting at the current sketch's origin, draw a curved line segment along some part of an imaginary circle until it reaches the desired (x, y) coordinates.", - "description": "When using radius and angle, draw a curved line segment along part of an imaginary circle. The arc is constructed such that the last line segment is placed tangent to the imaginary circle of the specified radius. The resulting arc is the segment of the imaginary circle from that tangent point for 'angle' degrees along the imaginary circle.", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "endAbsolute", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`.", - "labelRequired": true - }, - { - "name": "end", - "type": "Point2d", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Array_size_2_of_TyF64", - "type": "array", - "items": { - "$ref": "#/components/schemas/TyF64" - }, - "maxItems": 2, - "minItems": 2, - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`.", - "labelRequired": true - }, - { - "name": "radius", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`.", - "labelRequired": true - }, - { - "name": "angle", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this arc", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> angledLine(angle = 45, length = 10)\n |> tangentialArc(end = [0, -10])\n |> line(end = [-10, 0])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ], - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> angledLine(angle = 60, length = 10)\n |> tangentialArc(endAbsolute = [15, 15])\n |> line(end = [10, -15])\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ], - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> angledLine(angle = 60, length = 10)\n |> tangentialArc(radius = 10, angle = -120)\n |> angledLine(angle = -60, length = 10)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - }, - { - "name": "translate", - "summary": "Move a solid or a sketch.", - "description": "This is really useful for assembling parts together. You can create a part and then move it to the correct location.\n\nTranslate is really useful for sketches if you want to move a sketch and then rotate it using the `rotate` function to create a loft.", - "tags": [ - "transform" - ], - "args": [ - { - "name": "objects", - "type": "SolidOrSketchOrImportedGeometry", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SolidOrSketchOrImportedGeometry", - "description": "Data for a solid, sketch, or an imported geometry.", - "oneOf": [ - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "importedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Solid" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "solidSet" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "sketchSet" - ] - } - } - } - ], - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "The solid, sketch, or set of solids or sketches to move.", - "labelRequired": false - }, - { - "name": "x", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The amount to move the solid or sketch along the x axis. Defaults to 0 if not provided.", - "labelRequired": true - }, - { - "name": "y", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The amount to move the solid or sketch along the y axis. Defaults to 0 if not provided.", - "labelRequired": true - }, - { - "name": "z", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "The amount to move the solid or sketch along the z axis. Defaults to 0 if not provided.", - "labelRequired": true - }, - { - "name": "global", - "type": "bool", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_Boolean", - "type": "boolean", - "nullable": true, - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move.", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "SolidOrSketchOrImportedGeometry", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "SolidOrSketchOrImportedGeometry", - "description": "Data for a solid, sketch, or an imported geometry.", - "oneOf": [ - { - "description": "Data for an imported geometry.", - "type": "object", - "required": [ - "id", - "type", - "value" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "importedGeometry" - ] - }, - "id": { - "description": "The ID of the imported geometry.", - "type": "string", - "format": "uuid" - }, - "value": { - "description": "The original file paths.", - "type": "array", - "items": { - "type": "string" - } - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Solid" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "solidSet" - ] - } - } - }, - { - "type": [ - "object", - "array" - ], - "items": { - "$ref": "#/components/schemas/Sketch" - }, - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "sketchSet" - ] - } - } - } - ], - "definitions": { - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "// Move a pipe.\n\n// Create a path for the sweep.\nsweepPath = startSketchOn(XZ)\n |> startProfile(at = [0.05, 0.05])\n |> line(end = [0, 7])\n |> tangentialArc(angle = 90, radius = 5)\n |> line(end = [-3, 0])\n |> tangentialArc(angle = -90, radius = 5)\n |> line(end = [0, 7])\n\n// Create a hole for the pipe.\npipeHole = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 1.5)\n\nsweepSketch = startSketchOn(XY)\n |> circle(center = [0, 0], radius = 2)\n |> subtract2d(tool = pipeHole)\n |> sweep(path = sweepPath)\n |> translate(x = 1.0, y = 1.0, z = 2.5)", - false - ], - [ - "// Move an imported model.\n\n\nimport \"tests/inputs/cube.sldprt\" as cube\n\n// Circle so you actually see the move.\nstartSketchOn(XY)\n |> circle(center = [-10, -10], radius = 10)\n |> extrude(length = 10)\n\ncube\n |> translate(x = 10.0, y = 10.0, z = 2.5)", - false - ], - [ - "// Sweep two sketches along the same path.\n\n\nsketch001 = startSketchOn(XY)\nrectangleSketch = startProfile(sketch001, at = [-200, 23.86])\n |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001)\n |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 50.61)\n |> angledLine(angle = segAng(rectangleSegmentA001), length = -segLen(rectangleSegmentA001))\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n\ncircleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63)\n\nsketch002 = startSketchOn(YZ)\nsweepPath = startProfile(sketch002, at = [0, 0])\n |> yLine(length = 231.81)\n |> tangentialArc(radius = 80, angle = -90)\n |> xLine(length = 384.93)\n\nparts = sweep([rectangleSketch, circleSketch], path = sweepPath)\n\n// Move the sweeps.\ntranslate(\n parts,\n x = 1.0,\n y = 1.0,\n z = 2.5,\n)", - false - ], - [ - "// Move a sketch.\n\n\nfn square(@length) {\n l = length / 2\n p0 = [-l, -l]\n p1 = [-l, l]\n p2 = [l, l]\n p3 = [l, -l]\n\n return startSketchOn(XY)\n |> startProfile(at = p0)\n |> line(endAbsolute = p1)\n |> line(endAbsolute = p2)\n |> line(endAbsolute = p3)\n |> close()\n}\n\nsquare(10)\n |> translate(x = 5, y = 5)\n |> extrude(length = 10)", - false - ], - [ - "// Translate and rotate a sketch to create a loft.\nsketch001 = startSketchOn(XY)\n\nfn square() {\n return startProfile(sketch001, at = [-10, 10])\n |> xLine(length = 20)\n |> yLine(length = -20)\n |> xLine(length = -20)\n |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n |> close()\n}\n\nprofile001 = square()\n\nprofile002 = square()\n |> translate(z = 20)\n |> rotate(axis = [0, 0, 1.0], angle = 45)\n\nloft([profile001, profile002])", - false - ] - ] - }, - { - "name": "xLine", - "summary": "Draw a line relative to the current origin to a specified distance away from the current position along the 'x' axis.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "length", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "How far away along the X axis should this line go? Incompatible with `endAbsolute`.", - "labelRequired": true - }, - { - "name": "endAbsolute", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Which absolute X value should this line go to? Incompatible with `length`.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> xLine(length = 15)\n |> angledLine(angle = 80, length = 15)\n |> line(end = [8, -10])\n |> xLine(length = 10)\n |> angledLine(angle = 120, length = 30)\n |> xLine(length = -15)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - }, - { - "name": "yLine", - "summary": "Draw a line relative to the current origin to a specified distance away from the current position along the 'y' axis.", - "description": "", - "tags": [ - "sketch" - ], - "args": [ - { - "name": "sketch", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "description": "Which sketch should this path be added to?", - "labelRequired": false - }, - { - "name": "length", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "includeInSnippet": true, - "description": "How far away along the Y axis should this line go? Incompatible with `endAbsolute`.", - "labelRequired": true - }, - { - "name": "endAbsolute", - "type": "number", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TyF64", - "allOf": [ - { - "$ref": "#/components/schemas/TyF64" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Which absolute Y value should this line go to? Incompatible with `length`.", - "labelRequired": true - }, - { - "name": "tag", - "type": "TagNode", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Nullable_TagDeclarator", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": false, - "description": "Create a new tag which refers to this line", - "labelRequired": true - } - ], - "returnValue": { - "name": "", - "type": "Sketch", - "schema": { - "$schema": "https://spec.openapis.org/oas/3.0/schema/2019-04-02#/definitions/Schema", - "title": "Sketch", - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - }, - "definitions": { - "Path": { - "description": "A path.", - "oneOf": [ - { - "description": "A path that goes to a point.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ToPoint" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment that goes to a point", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArcTo" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A arc that is tangential to the last path segment", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "TangentialArc" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "ccw": { - "description": "arc's direction", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "a complete arc", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Circle" - ] - }, - "center": { - "description": "the arc's center", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "the arc's radius", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "arc's direction This is used to compute the tangential angle.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "CircleThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the circle", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "p1", - "p2", - "p3", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "ArcThreePoint" - ] - }, - "p1": { - "description": "Point 1 of the arc (base on the end of previous segment)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p2": { - "description": "Point 2 of the arc (interiorAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "p3": { - "description": "Point 3 of the arc (endAbsolute kwarg)", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A path that is horizontal.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units", - "x" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Horizontal" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "An angled line to.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "AngledLineTo" - ] - }, - "x": { - "description": "The x coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "y": { - "description": "The y coordinate.", - "type": "number", - "format": "double", - "nullable": true - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Base" - ] - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - { - "description": "A circular arc, not necessarily tangential to the current point.", - "type": "object", - "required": [ - "__geoMeta", - "ccw", - "center", - "from", - "radius", - "to", - "type", - "units" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Arc" - ] - }, - "center": { - "description": "Center of the circle that this arc is drawn on.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "radius": { - "description": "Radius of the circle that this arc is drawn on.", - "type": "number", - "format": "double" - }, - "ccw": { - "description": "True if the arc is counterclockwise.", - "type": "boolean" - }, - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - } - ] - }, - "UnitLen": { - "description": "A unit of length.", - "oneOf": [ - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Mm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Cm" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "M" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Inches" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Feet" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Yards" - ] - } - } - }, - { - "type": "object", - "required": [ - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "Unknown" - ] - } - } - } - ] - }, - "TagDeclarator": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - }, - "digest": { - "type": "array", - "items": { - "type": "integer", - "format": "uint8", - "minimum": 0.0 - }, - "maxItems": 32, - "minItems": 32, - "nullable": true - }, - "start": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "end": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - } - } - }, - "GeoMeta": { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "id", - "sourceRange" - ], - "properties": { - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - "SourceRange": { - "description": "The first two items are the start and end points (byte offsets from the start of the file). The third item is whether the source range belongs to the 'main' file, i.e., the file currently being rendered/displayed in the editor.", - "type": "array", - "items": { - "type": "integer", - "format": "uint", - "minimum": 0.0 - }, - "maxItems": 3, - "minItems": 3 - }, - "SketchSurface": { - "description": "A sketch type.", - "oneOf": [ - { - "type": "object", - "required": [ - "artifactId", - "id", - "origin", - "type", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "plane" - ] - }, - "id": { - "description": "The id of the plane.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "$ref": "#/components/schemas/PlaneType" - }, - "origin": { - "description": "Origin of the plane.", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "xAxis": { - "description": "What should the plane's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the plane's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - } - } - }, - { - "description": "A face.", - "type": "object", - "required": [ - "artifactId", - "id", - "solid", - "type", - "units", - "value", - "xAxis", - "yAxis" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "face" - ] - }, - "id": { - "description": "The id of the face.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The tag of the face.", - "type": "string" - }, - "xAxis": { - "description": "What should the face's X axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "yAxis": { - "description": "What should the face's Y axis be?", - "allOf": [ - { - "$ref": "#/components/schemas/Point3d" - } - ] - }, - "solid": { - "description": "The solid the face is on.", - "allOf": [ - { - "$ref": "#/components/schemas/Solid" - } - ] - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - } - ] - }, - "ArtifactId": { - "type": "string", - "format": "uuid" - }, - "PlaneType": { - "description": "Type for a plane.", - "oneOf": [ - { - "type": "string", - "enum": [ - "XY", - "XZ", - "YZ" - ] - }, - { - "description": "A custom plane.", - "type": "string", - "enum": [ - "Custom" - ] - }, - { - "description": "A custom plane which has not been sent to the engine. It must be sent before it is used.", - "type": "string", - "enum": [ - "Uninit" - ] - } - ] - }, - "Point3d": { - "type": "object", - "required": [ - "units", - "x", - "y", - "z" - ], - "properties": { - "x": { - "type": "number", - "format": "double" - }, - "y": { - "type": "number", - "format": "double" - }, - "z": { - "type": "number", - "format": "double" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "Solid": { - "type": "object", - "required": [ - "artifactId", - "height", - "id", - "sectional", - "sketch", - "units", - "value" - ], - "properties": { - "id": { - "description": "The id of the solid.", - "type": "string", - "format": "uuid" - }, - "artifactId": { - "description": "The artifact ID of the solid. Unlike `id`, this doesn't change.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "value": { - "description": "The extrude surfaces.", - "type": "array", - "items": { - "$ref": "#/components/schemas/ExtrudeSurface" - } - }, - "sketch": { - "description": "The sketch.", - "allOf": [ - { - "$ref": "#/components/schemas/Sketch" - } - ] - }, - "height": { - "description": "The height of the solid.", - "type": "number", - "format": "double" - }, - "startCapId": { - "description": "The id of the extrusion start cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "endCapId": { - "description": "The id of the extrusion end cap", - "type": "string", - "format": "uuid", - "nullable": true - }, - "edgeCuts": { - "description": "Chamfers or fillets on this solid.", - "type": "array", - "items": { - "$ref": "#/components/schemas/EdgeCut" - } - }, - "units": { - "description": "The units of the solid.", - "allOf": [ - { - "$ref": "#/components/schemas/UnitLen" - } - ] - }, - "sectional": { - "description": "Is this a sectional solid?", - "type": "boolean" - } - } - }, - "ExtrudeSurface": { - "description": "An extrude surface.", - "oneOf": [ - { - "description": "An extrude plane.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudePlane" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "An extruded arc.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "extrudeArc" - ] - }, - "faceId": { - "description": "The face id for the extrude plane.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "faceId": { - "description": "The id for the chamfer surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - }, - { - "description": "Geometry metadata.", - "type": "object", - "required": [ - "faceId", - "id", - "sourceRange", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "faceId": { - "description": "The id for the fillet surface.", - "type": "string", - "format": "uuid" - }, - "tag": { - "description": "The tag.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "id": { - "description": "The id of the geometry.", - "type": "string", - "format": "uuid" - }, - "sourceRange": { - "description": "The source range.", - "allOf": [ - { - "$ref": "#/components/schemas/SourceRange" - } - ] - } - } - } - ] - }, - "Sketch": { - "type": "object", - "required": [ - "artifactId", - "id", - "on", - "originalId", - "paths", - "start", - "units" - ], - "properties": { - "id": { - "description": "The id of the sketch (this will change when the engine's reference to it changes).", - "type": "string", - "format": "uuid" - }, - "paths": { - "description": "The paths in the sketch.", - "type": "array", - "items": { - "$ref": "#/components/schemas/Path" - } - }, - "on": { - "description": "What the sketch is on (can be a plane or a face).", - "allOf": [ - { - "$ref": "#/components/schemas/SketchSurface" - } - ] - }, - "start": { - "description": "The starting path.", - "allOf": [ - { - "$ref": "#/components/schemas/BasePath" - } - ] - }, - "tags": { - "description": "Tag identifiers that have been declared in this sketch.", - "type": "object", - "additionalProperties": { - "$ref": "#/components/schemas/TagIdentifier" - } - }, - "artifactId": { - "description": "The original id of the sketch. This stays the same even if the sketch is is sketched on face etc.", - "allOf": [ - { - "$ref": "#/components/schemas/ArtifactId" - } - ] - }, - "originalId": { - "type": "string", - "format": "uuid" - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - } - } - }, - "BasePath": { - "description": "A base path.", - "type": "object", - "required": [ - "__geoMeta", - "from", - "to", - "units" - ], - "properties": { - "from": { - "description": "The from point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "to": { - "description": "The to point.", - "type": "array", - "items": { - "type": "number", - "format": "double" - }, - "maxItems": 2, - "minItems": 2 - }, - "units": { - "$ref": "#/components/schemas/UnitLen" - }, - "tag": { - "description": "The tag of the path.", - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - }, - "__geoMeta": { - "description": "Metadata.", - "allOf": [ - { - "$ref": "#/components/schemas/GeoMeta" - } - ] - } - } - }, - "TagIdentifier": { - "type": "object", - "required": [ - "value" - ], - "properties": { - "value": { - "type": "string" - } - } - }, - "EdgeCut": { - "description": "A fillet or a chamfer.", - "oneOf": [ - { - "description": "A fillet.", - "type": "object", - "required": [ - "edgeId", - "id", - "radius", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "fillet" - ] - }, - "id": { - "description": "The id of the engine command that called this fillet.", - "type": "string", - "format": "uuid" - }, - "radius": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to fillet.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - }, - { - "description": "A chamfer.", - "type": "object", - "required": [ - "edgeId", - "id", - "length", - "type" - ], - "properties": { - "type": { - "type": "string", - "enum": [ - "chamfer" - ] - }, - "id": { - "description": "The id of the engine command that called this chamfer.", - "type": "string", - "format": "uuid" - }, - "length": { - "$ref": "#/components/schemas/TyF64" - }, - "edgeId": { - "description": "The engine id of the edge to chamfer.", - "type": "string", - "format": "uuid" - }, - "tag": { - "allOf": [ - { - "$ref": "#/components/schemas/TagDeclarator" - } - ], - "nullable": true - } - } - } - ] - }, - "TyF64": { - "type": "number", - "format": "double" - } - } - }, - "required": true, - "includeInSnippet": true, - "labelRequired": true - }, - "unpublished": false, - "deprecated": false, - "examples": [ - [ - "exampleSketch = startSketchOn(XZ)\n |> startProfile(at = [0, 0])\n |> yLine(length = 15)\n |> angledLine(angle = 30, length = 15)\n |> line(end = [8, -10])\n |> yLine(length = -5)\n |> close()\n\nexample = extrude(exampleSketch, length = 10)", - false - ] - ] - } -] \ No newline at end of file diff --git a/docs/kcl-std/types/std-types-any.md b/docs/kcl-std/types/std-types-any.md index 011c17fed..5ebc963a2 100644 --- a/docs/kcl-std/types/std-types-any.md +++ b/docs/kcl-std/types/std-types-any.md @@ -1,14 +1,13 @@ --- title: "any" subtitle: "Type in std::types" -excerpt: "" +excerpt: "The [`any`](/docs/kcl-std/types/std-types-any) type is the type of all possible values in KCL. I.e., if a function accepts an argument with type [`any`](/docs/kcl-std/types/std-types-any), then it can accept any value." layout: manual --- +The [`any`](/docs/kcl-std/types/std-types-any) type is the type of all possible values in KCL. I.e., if a function accepts an argument with type [`any`](/docs/kcl-std/types/std-types-any), then it can accept any value. -The [`any`](/docs/kcl-std/types/std-types-any) type is the type of all possible values in KCL. I.e., if a function accepts an argument -with type [`any`](/docs/kcl-std/types/std-types-any), then it can accept any value. ### Examples diff --git a/e2e/playwright/app-header-tests.spec.ts b/e2e/playwright/app-header-tests.spec.ts index 96f8eb9b9..5f01fc3ef 100644 --- a/e2e/playwright/app-header-tests.spec.ts +++ b/e2e/playwright/app-header-tests.spec.ts @@ -5,7 +5,7 @@ import * as fsp from 'fs/promises' test.describe('Electron app header tests', () => { test( 'Open Command Palette button has correct shortcut', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page }, testInfo) => { await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -30,7 +30,7 @@ test.describe('Electron app header tests', () => { test( 'User settings has correct shortcut', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, toolbar }, testInfo) => { await page.setBodyDimensions({ width: 1200, height: 500 }) diff --git a/e2e/playwright/auth.spec.ts b/e2e/playwright/auth.spec.ts index f9c290964..c60f465ad 100644 --- a/e2e/playwright/auth.spec.ts +++ b/e2e/playwright/auth.spec.ts @@ -4,7 +4,7 @@ import { expect, test } from '@e2e/playwright/zoo-test' test.describe('Authentication tests', () => { test( `The user can sign out and back in`, - { tag: ['@electron'] }, + { tag: ['@desktop'] }, async ({ page, homePage, signInPage, toolbar, tronApp }) => { if (!tronApp) { fail() diff --git a/e2e/playwright/code-pane-and-errors.spec.ts b/e2e/playwright/code-pane-and-errors.spec.ts index b4b5d05ec..889231cea 100644 --- a/e2e/playwright/code-pane-and-errors.spec.ts +++ b/e2e/playwright/code-pane-and-errors.spec.ts @@ -265,6 +265,7 @@ middle(0) }) await expect( page.getByText(`assert failed: Expected 0 to be greater than 0 but it wasn't +assert() check() middle()`) ).toBeVisible() @@ -275,7 +276,7 @@ middle()`) test( 'Opening multiple panes persists when switching projects', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { // Setup multiple projects. await context.folderSetupFn(async (dir) => { @@ -346,7 +347,7 @@ test( test( 'external change of file contents are reflected in editor', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const PROJECT_DIR_NAME = 'lee-was-here' const { dir: projectsDir } = await context.folderSetupFn(async (dir) => { diff --git a/e2e/playwright/command-bar-tests.spec.ts b/e2e/playwright/command-bar-tests.spec.ts index 9a69a7557..980c25ccd 100644 --- a/e2e/playwright/command-bar-tests.spec.ts +++ b/e2e/playwright/command-bar-tests.spec.ts @@ -534,7 +534,7 @@ profile001 = startProfile(sketch001, at = [-484.34, 484.95]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() ` - const targetURL = `?create-file&name=test&units=mm&code=${encodeURIComponent(btoa(code))}&ask-open-desktop` + const targetURL = `?create-file=true&name=test&units=mm&code=${encodeURIComponent(btoa(code))}&ask-open-desktop=true` await page.goto(page.url() + targetURL) expect(page.url()).toContain(targetURL) }) diff --git a/e2e/playwright/desktop-export.spec.ts b/e2e/playwright/desktop-export.spec.ts index 78fcff677..469437e3c 100644 --- a/e2e/playwright/desktop-export.spec.ts +++ b/e2e/playwright/desktop-export.spec.ts @@ -10,7 +10,7 @@ import { expect, test } from '@e2e/playwright/zoo-test' test( 'export works on the first try', - { tag: ['@electron', '@macos', '@windows', '@skipLocalEngine'] }, + { tag: ['@desktop', '@macos', '@windows', '@skipLocalEngine'] }, async ({ page, context, scene, tronApp, cmdBar }, testInfo) => { if (!tronApp) { fail() diff --git a/e2e/playwright/editor-tests.spec.ts b/e2e/playwright/editor-tests.spec.ts index 0d21eb4ee..c04393f75 100644 --- a/e2e/playwright/editor-tests.spec.ts +++ b/e2e/playwright/editor-tests.spec.ts @@ -964,8 +964,6 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) await page.waitForTimeout(100) await page.keyboard.press('Enter') // accepting the auto complete, not a new line - await page.keyboard.press('Tab') - await page.waitForTimeout(100) await page.keyboard.press('Tab') await page.waitForTimeout(100) await page.keyboard.type('12') @@ -984,8 +982,6 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) await page.keyboard.press('ArrowDown') await page.keyboard.press('Enter') // finish line with comment - await page.keyboard.press('Tab') - await page.waitForTimeout(100) await page.keyboard.type('5') await page.waitForTimeout(100) await page.keyboard.press('Tab') @@ -1001,8 +997,8 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) await expect(page.locator('.cm-content')).toHaveText( `@settings(defaultLengthUnit = in) sketch001 = startSketchOn(XZ) - |> startProfile(%, at = [0, 12]) - |> xLine(%, length = 5) // lin`.replaceAll('\n', '') + |> startProfile(at = [0, 12]) + |> xLine(length = 5) // lin`.replaceAll('\n', '') ) // expect there to be no KCL errors @@ -1040,8 +1036,6 @@ sketch001 = startSketchOn(XZ) await page.waitForTimeout(100) await page.keyboard.press('Tab') // accepting the auto complete, not a new line - await page.keyboard.press('Tab') - await page.waitForTimeout(100) await page.keyboard.press('Tab') await page.keyboard.type('12') await page.waitForTimeout(100) @@ -1057,7 +1051,6 @@ sketch001 = startSketchOn(XZ) await page.waitForTimeout(100) // press arrow down then tab to accept xLine await page.keyboard.press('ArrowDown') - await page.keyboard.press('Tab') // finish line with comment await page.keyboard.press('Tab') await page.waitForTimeout(100) @@ -1076,8 +1069,8 @@ sketch001 = startSketchOn(XZ) await expect(page.locator('.cm-content')).toHaveText( `@settings(defaultLengthUnit = in) sketch001 = startSketchOn(XZ) - |> startProfile(%, at = [0, 12]) - |> xLine(%, length = 5) // lin`.replaceAll('\n', '') + |> startProfile(at = [0, 12]) + |> xLine(length = 5) // lin`.replaceAll('\n', '') ) }) }) @@ -1337,7 +1330,7 @@ sketch001 = startSketchOn(XZ) test( `Can import a local OBJ file`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, context }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'cube') diff --git a/e2e/playwright/feature-tree-pane.spec.ts b/e2e/playwright/feature-tree-pane.spec.ts index 210eea92e..fe452c5b3 100644 --- a/e2e/playwright/feature-tree-pane.spec.ts +++ b/e2e/playwright/feature-tree-pane.spec.ts @@ -57,7 +57,7 @@ sketch003 = startSketchOn(plane001) test.describe('Feature Tree pane', () => { test( 'User can go to definition and go to function definition', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, homePage, scene, editor, toolbar, cmdBar, page }) => { await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'test-sample') @@ -150,7 +150,7 @@ test.describe('Feature Tree pane', () => { test( `User can edit sketch (but not on offset plane yet) from the feature tree`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, homePage, scene, editor, toolbar, page }) => { await context.addInitScript((initialCode) => { localStorage.setItem('persistCode', initialCode) diff --git a/e2e/playwright/file-tree.spec.ts b/e2e/playwright/file-tree.spec.ts index 7ec6e1999..d9f62e2a8 100644 --- a/e2e/playwright/file-tree.spec.ts +++ b/e2e/playwright/file-tree.spec.ts @@ -13,7 +13,7 @@ import { expect, test } from '@e2e/playwright/zoo-test' test.describe('integrations tests', () => { test( 'Creating a new file or switching file while in sketchMode should exit sketchMode', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, context, homePage, scene, editor, toolbar, cmdBar }) => { await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'test-sample') @@ -100,7 +100,7 @@ test.describe('when using the file tree to', () => { test( `rename ${fromFile} to ${toFile}, and doesn't crash on reload and settings load`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page }, testInfo) => { const { panesOpen, pasteCodeInEditor, renameFile, editorTextMatches } = await getUtils(page, test) @@ -142,7 +142,7 @@ test.describe('when using the file tree to', () => { test( `create many new files of the same name, incrementing their names`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page }, testInfo) => { const { panesOpen, createNewFile } = await getUtils(page, test) @@ -174,7 +174,7 @@ test.describe('when using the file tree to', () => { test( 'create a new file with the same name as an existing file cancels the operation', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, homePage, scene, editor, toolbar }, testInfo) => { const projectName = 'cube' const mainFile = 'main.kcl' @@ -240,7 +240,7 @@ test.describe('when using the file tree to', () => { test( `create new folders and that doesn't trigger a navigation`, - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ page, homePage, scene, toolbar, cmdBar }) => { await homePage.goToModelingScene() await scene.settled(cmdBar) @@ -260,7 +260,7 @@ test.describe('when using the file tree to', () => { test( 'deleting all files recreates a default main.kcl with no code', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page }, testInfo) => { const { panesOpen, pasteCodeInEditor, deleteFile, editorTextMatches } = await getUtils(page, test) @@ -291,7 +291,7 @@ test.describe('when using the file tree to', () => { test( 'loading small file, then large, then back to small', { - tag: '@electron', + tag: '@desktop', }, async ({ page }, testInfo) => { const { @@ -361,7 +361,7 @@ test.describe('when using the file tree to', () => { test.describe('Renaming in the file tree', () => { test( 'A file you have open', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const { dir } = await context.folderSetupFn(async (dir) => { await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) @@ -450,7 +450,7 @@ test.describe('Renaming in the file tree', () => { test( 'A file you do not have open', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const { dir } = await context.folderSetupFn(async (dir) => { await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) @@ -536,7 +536,7 @@ test.describe('Renaming in the file tree', () => { test( `A folder you're not inside`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const { dir } = await context.folderSetupFn(async (dir) => { await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) @@ -618,7 +618,7 @@ test.describe('Renaming in the file tree', () => { test( `A folder you are inside`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, context }, testInfo) => { const { dir } = await context.folderSetupFn(async (dir) => { await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) @@ -721,7 +721,7 @@ test.describe('Renaming in the file tree', () => { test.describe('Deleting items from the file pane', () => { test( `delete file when main.kcl exists, navigate to main.kcl`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, context }, testInfo) => { await context.folderSetupFn(async (dir) => { const testDir = join(dir, 'testProject') @@ -786,7 +786,7 @@ test.describe('Deleting items from the file pane', () => { test( `Delete folder we are not in, don't navigate`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) @@ -840,7 +840,7 @@ test.describe('Deleting items from the file pane', () => { test( `Delete folder we are in, navigate to main.kcl`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { await fsp.mkdir(join(dir, 'Test Project'), { recursive: true }) @@ -906,7 +906,7 @@ test.describe('Deleting items from the file pane', () => { // Copied from tests above. test( `external deletion of project navigates back home`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const TEST_PROJECT_NAME = 'Test Project' const { dir: projectsDirName } = await context.folderSetupFn( @@ -970,7 +970,7 @@ test.describe('Deleting items from the file pane', () => { // Similar to the above test( `external deletion of file in sub-directory updates the file tree and recreates it on code editor typing`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const TEST_PROJECT_NAME = 'Test Project' const { dir: projectsDirName } = await context.folderSetupFn( @@ -1045,7 +1045,7 @@ test.describe('Deleting items from the file pane', () => { test.describe('Undo and redo do not keep history when navigating between files', () => { test( `open a file, change something, open a different file, hitting undo should do nothing`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const testDir = join(dir, 'testProject') @@ -1112,7 +1112,7 @@ test.describe('Undo and redo do not keep history when navigating between files', test( `open a file, change something, undo it, open a different file, hitting redo should do nothing`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const testDir = join(dir, 'testProject') @@ -1212,7 +1212,7 @@ test.describe('Undo and redo do not keep history when navigating between files', test( `cloned file has an incremented name and same contents`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, context, homePage }, testInfo) => { const { panesOpen, cloneFile } = await getUtils(page, test) diff --git a/e2e/playwright/import-ui.spec.ts b/e2e/playwright/import-ui.spec.ts index b4a18c474..b9e1316d8 100644 --- a/e2e/playwright/import-ui.spec.ts +++ b/e2e/playwright/import-ui.spec.ts @@ -5,7 +5,7 @@ import * as fsp from 'fs/promises' test.describe('Import UI tests', () => { test( 'shows toast when trying to sketch on imported face, and hovering over imported geometry should NOT highlight any code', - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, homePage, toolbar, scene, editor, cmdBar }) => { await context.folderSetupFn(async (dir) => { const projectDir = path.join(dir, 'import-test') diff --git a/e2e/playwright/machines.spec.ts b/e2e/playwright/machines.spec.ts index 3c5894a50..baff74c49 100644 --- a/e2e/playwright/machines.spec.ts +++ b/e2e/playwright/machines.spec.ts @@ -6,7 +6,7 @@ import { expect, test } from '@e2e/playwright/zoo-test' test( 'When machine-api server not found butt is disabled and shows the reason', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, scene, cmdBar }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'bracket') @@ -43,7 +43,7 @@ test( test( 'When machine-api server not found home screen & project status shows the reason', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, scene, cmdBar }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'bracket') diff --git a/e2e/playwright/native-file-menu.spec.ts b/e2e/playwright/native-file-menu.spec.ts index 1c963695b..8d6e6626d 100644 --- a/e2e/playwright/native-file-menu.spec.ts +++ b/e2e/playwright/native-file-menu.spec.ts @@ -13,7 +13,7 @@ import { expect, test } from '@e2e/playwright/zoo-test' */ test.describe( 'Native file menu', - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, () => { test('Home page', async ({ tronApp, cmdBar, page, homePage }) => { if (!tronApp) fail() diff --git a/e2e/playwright/point-click-assemblies.spec.ts b/e2e/playwright/point-click-assemblies.spec.ts index b0e16958d..03d626a21 100644 --- a/e2e/playwright/point-click-assemblies.spec.ts +++ b/e2e/playwright/point-click-assemblies.spec.ts @@ -43,7 +43,7 @@ async function insertPartIntoAssembly( test.describe('Point-and-click assemblies tests', () => { test( `Insert kcl parts into assembly as whole module import`, - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, @@ -188,7 +188,7 @@ test.describe('Point-and-click assemblies tests', () => { await page.waitForTimeout(10000) await editor.expectEditor.toContain( ` - import "nested/twice/main.kcl" as main + import "nested/twice/main.kcl" as main `, { shouldNormalise: true } ) @@ -198,7 +198,7 @@ test.describe('Point-and-click assemblies tests', () => { test( `Can still translate, rotate, and delete inserted parts even with non standard code`, - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, @@ -394,7 +394,7 @@ test.describe('Point-and-click assemblies tests', () => { test( `Insert the bracket part into an assembly and transform it`, - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, @@ -585,7 +585,7 @@ test.describe('Point-and-click assemblies tests', () => { test( `Insert foreign parts into assembly and delete them`, - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, @@ -736,7 +736,7 @@ test.describe('Point-and-click assemblies tests', () => { test( 'Assembly gets reexecuted when imported models are updated externally', - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, homePage, scene, toolbar, cmdBar, tronApp }) => { if (!tronApp) { fail() @@ -826,7 +826,7 @@ foreign test( `Point-and-click clone`, - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page, diff --git a/e2e/playwright/point-click.spec.ts b/e2e/playwright/point-click.spec.ts index 3625ecd06..063fbaab1 100644 --- a/e2e/playwright/point-click.spec.ts +++ b/e2e/playwright/point-click.spec.ts @@ -1766,7 +1766,7 @@ loft001 = loft([sketch001, sketch002]) sketch001 = startSketchOn(YZ) profile001 = circle(sketch001, center = [0, 0], radius = 500) sketch002 = startSketchOn(XZ) - |> startProfile(at = [0, 0]) +profile002 = startProfile(sketch002, at = [0, 0]) |> xLine(length = -500) |> tangentialArc(endAbsolute = [-2000, 500])`, }, @@ -1782,7 +1782,7 @@ profile001 = startProfile(sketch001, at = [-400, -400]) |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) |> close() sketch002 = startSketchOn(XZ) - |> startProfile(at = [0, 0]) +profile002 = startProfile(sketch002, at = [0, 0]) |> xLine(length = -500) |> tangentialArc(endAbsolute = [-2000, 500])`, }, @@ -1810,9 +1810,9 @@ sketch002 = startSketchOn(XZ) testPoint.x - 50, testPoint.y ) - const sweepDeclaration = 'sweep001 = sweep(profile001, path = sketch002)' + const sweepDeclaration = 'sweep001 = sweep(profile001, path = profile002)' const editedSweepDeclaration = - 'sweep001 = sweep(profile001, path = sketch002, sectional = true)' + 'sweep001 = sweep(profile001, path = profile002, sectional = true)' await test.step(`Look for sketch001`, async () => { await toolbar.closePane('code') diff --git a/e2e/playwright/projects.spec.ts b/e2e/playwright/projects.spec.ts index 63315db80..3974d4b1f 100644 --- a/e2e/playwright/projects.spec.ts +++ b/e2e/playwright/projects.spec.ts @@ -17,7 +17,7 @@ import { expect, test } from '@e2e/playwright/zoo-test' test( 'projects reload if a new one is created, deleted, or renamed externally', - { tag: ['@electron', '@macos', '@windows'] }, + { tag: ['@desktop', '@macos', '@windows'] }, async ({ context, page }, testInfo) => { let externalCreatedProjectName = 'external-created-project' @@ -63,7 +63,7 @@ test( test( 'click help/keybindings from home page', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page }, testInfo) => { await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -81,7 +81,7 @@ test( test( 'click help/keybindings from project page', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ scene, cmdBar, context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') @@ -112,7 +112,7 @@ test( test( 'open a file in a project works and renders, open another file in different project with errors, it should clear the scene', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ scene, cmdBar, context, page, editor }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') @@ -169,7 +169,7 @@ test( // error text on hover await page.hover('.cm-lint-marker-error') - const crypticErrorText = `The arg tag was given, but it was the wrong type` + const crypticErrorText = 'tag requires a value with type `tag`, but found string' await expect(page.getByText(crypticErrorText).first()).toBeVisible() // black pixel means the scene has been cleared. @@ -184,7 +184,7 @@ test( test( 'open a file in a project works and renders, open another file in different project that is empty, it should clear the scene', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ scene, cmdBar, context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') @@ -244,7 +244,7 @@ test( test( 'open a file in a project works and renders, open empty file, it should clear the scene', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') @@ -310,7 +310,7 @@ test( test( 'open a file in a project works and renders, open another file in the same project with errors, it should clear the scene', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ scene, cmdBar, context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') @@ -367,7 +367,7 @@ test( // error text on hover await page.hover('.cm-lint-marker-error') - const crypticErrorText = `The arg tag was given, but it was the wrong type` + const crypticErrorText = 'tag requires a value with type `tag`, but found string' await expect(page.getByText(crypticErrorText).first()).toBeVisible() // black pixel means the scene has been cleared. @@ -382,7 +382,7 @@ test( test( 'when code with error first loads you get errors in console', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, editor }, testInfo) => { await context.folderSetupFn(async (dir) => { await fsp.mkdir(path.join(dir, 'broken-code'), { recursive: true }) @@ -405,7 +405,7 @@ test( // error text on hover await page.hover('.cm-lint-marker-error') - const crypticErrorText = `The arg tag was given, but it was the wrong type` + const crypticErrorText = 'tag requires a value with type `tag`, but found string' await expect(page.getByText(crypticErrorText).first()).toBeVisible() } ) @@ -416,7 +416,7 @@ test.describe('Can export from electron app', () => { for (const method of exportMethods) { test( `Can export using ${method}`, - { tag: ['@electron', '@skipLocalEngine'] }, + { tag: ['@desktop', '@skipLocalEngine'] }, async ({ scene, cmdBar, context, page, tronApp }, testInfo) => { if (!tronApp) { fail() @@ -507,7 +507,7 @@ test.describe('Can export from electron app', () => { }) test( 'Rename and delete projects, also spam arrow keys when renaming', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) @@ -723,7 +723,7 @@ test( test( 'pressing "delete" on home screen should do nothing', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, homePage }, testInfo) => { await context.folderSetupFn(async (dir) => { await fsp.mkdir(`${dir}/router-template-slate`, { recursive: true }) @@ -753,7 +753,7 @@ test( test.describe(`Project management commands`, () => { test( `Rename from project page`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, scene, cmdBar }, testInfo) => { const projectName = `my_project_to_rename` await context.folderSetupFn(async (dir) => { @@ -815,7 +815,7 @@ test.describe(`Project management commands`, () => { test( `Delete from project page`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, scene, cmdBar }, testInfo) => { const projectName = `my_project_to_delete` await context.folderSetupFn(async (dir) => { @@ -869,7 +869,7 @@ test.describe(`Project management commands`, () => { ) test( `Rename from home page`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, homePage, scene, cmdBar }, testInfo) => { const projectName = `my_project_to_rename` await context.folderSetupFn(async (dir) => { @@ -927,7 +927,7 @@ test.describe(`Project management commands`, () => { ) test( `Delete from home page`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, scene, cmdBar }, testInfo) => { const projectName = `my_project_to_delete` await context.folderSetupFn(async (dir) => { @@ -1103,7 +1103,7 @@ test(`Create a few projects using the default project name`, async ({ test( 'File in the file pane should open with a single click', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, homePage, page }, testInfo) => { const projectName = 'router-template-slate' await context.folderSetupFn(async (dir) => { @@ -1145,7 +1145,7 @@ test( test( 'Nested directories in project without main.kcl do not create main.kcl', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ scene, cmdBar, context, page }, testInfo) => { let testDir: string | undefined await context.folderSetupFn(async (dir) => { @@ -1202,7 +1202,7 @@ test( test( 'Deleting projects, can delete individual project, can still create projects after deleting all', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const projectData = [ ['router-template-slate', 'cylinder.kcl'], @@ -1280,7 +1280,7 @@ test( test( 'Can load a file with CRLF line endings', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, scene, cmdBar }, testInfo) => { await context.folderSetupFn(async (dir) => { const routerTemplateDir = path.join(dir, 'router-template-slate') @@ -1312,7 +1312,7 @@ test( test( 'Can sort projects on home page', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const projectData = [ ['router-template-slate', 'cylinder.kcl'], @@ -1419,7 +1419,7 @@ test( test( 'When the project folder is empty, user can create new project and open it.', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page }, testInfo) => { const u = await getUtils(page) await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -1515,7 +1515,7 @@ extrude001 = extrude(sketch001, length = 200)`) test( 'Opening a project should successfully load the stream, (regression test that this also works when switching between projects)', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, cmdBar, homePage, scene }, testInfo) => { await context.folderSetupFn(async (dir) => { await fsp.mkdir(path.join(dir, 'router-template-slate'), { @@ -1628,7 +1628,7 @@ test( test( 'You can change the root projects directory and nothing is lost', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page, tronApp, homePage }, testInfo) => { if (!tronApp) { fail() @@ -1735,7 +1735,7 @@ test( test( 'Search projects on desktop home', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const projectData = [ ['basic bracket', 'focusrite_scarlett_mounting_bracket.kcl'], @@ -1791,7 +1791,7 @@ test( test( 'file pane is scrollable when there are many files', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ scene, cmdBar, context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const testDir = path.join(dir, 'testProject') @@ -1892,7 +1892,7 @@ test( test( 'select all in code editor does not actually select all, just what is visible (regression)', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { // rust/kcl-lib/e2e/executor/inputs/mike_stress_test.kcl @@ -1950,7 +1950,7 @@ test( test( 'Settings persist across restarts', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, toolbar }, testInfo) => { await test.step('We can change a user setting like theme', async () => { await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -1982,7 +1982,7 @@ test( test( 'Original project name persist after onboarding', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, toolbar }, testInfo) => { const nextButton = page.getByTestId('onboarding-next') await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -2022,7 +2022,7 @@ test( test( 'project name with foreign characters should open', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'العربية') @@ -2067,7 +2067,7 @@ test( test( 'import from nested directory', - { tag: ['@electron', '@windows', '@macos'] }, + { tag: ['@desktop', '@windows', '@macos'] }, async ({ scene, cmdBar, context, page }) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') @@ -2116,3 +2116,74 @@ test( }) } ) + +test( + 'segment position changes persist after dragging and reopening project', + { tag: '@desktop' }, + async ({ scene, cmdBar, context, page, editor, toolbar }, testInfo) => { + const projectName = 'segment-drag-test' + + await context.folderSetupFn(async (dir) => { + const projectDir = path.join(dir, projectName) + await fsp.mkdir(projectDir, { recursive: true }) + await fsp.writeFile( + path.join(projectDir, 'main.kcl'), + `sketch001 = startSketchOn(XZ) +profile001 = startProfile(sketch001, at = [0, 0]) + |> line(end = [0, 6]) + |> line(end = [10, 0]) + |> line(end = [-8, -5]) +` + ) + }) + + await page.setBodyDimensions({ width: 1200, height: 600 }) + const u = await getUtils(page) + + await test.step('Opening the project and entering sketch mode', async () => { + await expect(page.getByText(projectName)).toBeVisible() + await page.getByText(projectName).click() + + await scene.settled(cmdBar) + + // go to sketch mode + await (await toolbar.getFeatureTreeOperation('Sketch', 0)).dblclick() + + // Without this, "add axis n grid" action runs after editing the sketch and invokes codeManager.writeToFile() + // so we wait for that action to run first before we start editing the sketch and making sure it's saving + // because of those edits. + await page.waitForTimeout(2000) + }) + + const changedLine = 'line(end = [-6.54, -4.99])' + + await test.step('Dragging the line endpoint to modify it', async () => { + // Get the last line's endpoint position + const lineEnd = await u.getBoundingBox('[data-overlay-index="3"]') + + await page.mouse.move(lineEnd.x, lineEnd.y - 5) + await page.mouse.down() + await page.mouse.move(lineEnd.x + 80, lineEnd.y) + await page.mouse.up() + + await editor.expectEditor.toContain(changedLine) + + // Exit sketch mode + await page.keyboard.press('Escape') + await page.waitForTimeout(100) + }) + + await test.step('Going back to dashboard', async () => { + await page.getByTestId('app-logo').click() + await page.waitForTimeout(1000) + }) + + await test.step('Reopening the project and verifying changes are saved', async () => { + await page.getByText(projectName).click() + await scene.settled(cmdBar) + + // Check if new line coordinates were saved + await editor.expectEditor.toContain(changedLine) + }) + } +) diff --git a/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts b/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts index 3ccf1206c..86f3790d1 100644 --- a/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts +++ b/e2e/playwright/prompt-to-edit-snapshot-tests.spec.ts @@ -63,7 +63,7 @@ test.describe('edit with AI example snapshots', () => { test( `change colour`, // TODO this is more of a snapshot, but atm it needs to be manually run locally to update the files - { tag: ['@electron'] }, + { tag: ['@desktop'] }, async ({ context, homePage, cmdBar, editor, page, scene }) => { const project = 'test-dir' await context.folderSetupFn(async (dir) => { diff --git a/e2e/playwright/regression-tests.spec.ts b/e2e/playwright/regression-tests.spec.ts index 12042f855..c18f8663c 100644 --- a/e2e/playwright/regression-tests.spec.ts +++ b/e2e/playwright/regression-tests.spec.ts @@ -558,7 +558,7 @@ extrude002 = extrude(profile002, length = 150) test( `Network health indicator only appears in modeling view`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'bracket') diff --git a/e2e/playwright/sketch-tests.spec.ts b/e2e/playwright/sketch-tests.spec.ts index 49e8afd83..fb243e19b 100644 --- a/e2e/playwright/sketch-tests.spec.ts +++ b/e2e/playwright/sketch-tests.spec.ts @@ -1733,7 +1733,7 @@ profile003 = startProfile(sketch001, at = [206.63, -56.73]) await page.waitForTimeout(600) }) - const codeFromTangentialArc = ` |> tangentialArc(endAbsolute = [39.49, 88.22])` + const codeFromTangentialArc = ` |> tangentialArc(end = [-10.82, 144.95])` await test.step('check that tangential tool does not snap to other profile starts', async () => { await toolbar.selectTangentialArc() await page.waitForTimeout(1000) @@ -1755,7 +1755,7 @@ profile003 = startProfile(sketch001, at = [206.63, -56.73]) // check pixel is now gray at tanArcLocation to verify code has executed await scene.expectPixelColor([26, 26, 26], tanArcLocation, 15) await editor.expectEditor.not.toContain( - `tangentialArc(endAbsolute = [39.49, 88.22])` + `tangentialArc(end = [-10.82, 144.95])` ) }) @@ -1955,7 +1955,7 @@ profile003 = startProfile(sketch001, at = [206.63, -56.73]) await endArcStartLine() await editor.expectEditor.toContain( - `|> tangentialArc(endAbsolute = [16.61, 4.14])` + `|> tangentialArc(end = [2.98, -7.52])` ) // Add a three-point arc segment @@ -2362,7 +2362,7 @@ profile004 = circleThreePoint(sketch001, p1 = [13.44, -6.8], p2 = [13.39, -2.07] await test.step('add new profile', async () => { await toolbar.rectangleBtn.click() - await page.waitForTimeout(100) + await page.waitForTimeout(200) await rectStart() await editor.expectEditor.toContain( `profile005 = startProfile(sketch001, at = [15.68, -3.84])` @@ -3181,7 +3181,7 @@ test.describe('Redirecting to home page and back to the original file should cle sketch001 = startSketchOn(XZ) profile001 = startProfile(sketch001, at = [0, 0]) |> line(end = [191.39, 191.39]) - |> tangentialArc(endAbsolute = [287.08, 95.69], tag = $seg01) + |> tangentialArc(end = [95.69, -95.7], tag = $seg01) |> angledLine(angle = tangentToEnd(seg01), length = 135.34) |> arc(interiorAbsolute = [191.39, -95.69], endAbsolute = [287.08, -95.69], tag = $seg02) |> angledLine(angle = tangentToEnd(seg02) + turns::HALF_TURN, length = 270.67) diff --git a/e2e/playwright/snapshot-tests.spec.ts b/e2e/playwright/snapshot-tests.spec.ts index 395bbfdbc..a8fc23eed 100644 --- a/e2e/playwright/snapshot-tests.spec.ts +++ b/e2e/playwright/snapshot-tests.spec.ts @@ -375,22 +375,22 @@ test.describe( await expect(u.codeLocator).toHaveText(code) await toolbar.selectTangentialArc() - await page.waitForTimeout(100) + await page.waitForTimeout(200) // click to continue profile await page.mouse.click(813, 392) - await page.waitForTimeout(100) + await page.waitForTimeout(300) await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20) code += ` - |> tangentialArc(endAbsolute = [551.2, -62.01])` + |> tangentialArc(end = [184.31, 184.31])` await expect(u.codeLocator).toHaveText(code) // click tangential arc tool again to unequip it // it will be available directly in the toolbar since it was last equipped await toolbar.tangentialArcBtn.click() - await page.waitForTimeout(100) + await page.waitForTimeout(1000) // screen shot should show the sketch await expect(page).toHaveScreenshot({ @@ -472,20 +472,20 @@ test.describe( await expect(u.codeLocator).toHaveText(code) await toolbar.selectTangentialArc() - await page.waitForTimeout(100) + await page.waitForTimeout(200) // click to continue profile await page.mouse.click(813, 392) - await page.waitForTimeout(100) + await page.waitForTimeout(300) await page.mouse.click(startXPx + PUR * 30, 500 - PUR * 20) code += ` - |> tangentialArc(endAbsolute = [551.2, -62.01])` + |> tangentialArc(end = [184.31, 184.31])` await expect(u.codeLocator).toHaveText(code) await toolbar.tangentialArcBtn.click() - await page.waitForTimeout(100) + await page.waitForTimeout(1000) // screen shot should show the sketch await expect(page).toHaveScreenshot({ @@ -823,7 +823,7 @@ test('theme persists', async ({ page, context, homePage }) => { uploadThroughput: -1, }) - await expect(networkToggle).toContainText('Connected') + await expect(networkToggle).toContainText('Network health (Strong)') await expect(page.getByText('building scene')).not.toBeVisible() diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png index 0570b03ae..4d00a06fe 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png index 64ead35b3..a6b36345b 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Inch-scale-2-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png index b4c1ec75f..13512d16d 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-1-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png index 64ead35b3..68c4e63d1 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Client-side-scene-scale-should-match-engine-scale-Millimeter-scale-2-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-3-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-3-Google-Chrome-linux.png index 7123911c1..e8f73271b 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-3-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-3-Google-Chrome-linux.png differ diff --git a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-4-Google-Chrome-linux.png b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-4-Google-Chrome-linux.png index f227f691a..3456f9486 100644 Binary files a/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-4-Google-Chrome-linux.png and b/e2e/playwright/snapshot-tests.spec.ts-snapshots/Draft-segments-should-look-right-4-Google-Chrome-linux.png differ diff --git a/e2e/playwright/test-network-and-connection-issues.spec.ts b/e2e/playwright/test-network-and-connection-issues.spec.ts index 663c785b4..e14886289 100644 --- a/e2e/playwright/test-network-and-connection-issues.spec.ts +++ b/e2e/playwright/test-network-and-connection-issues.spec.ts @@ -14,8 +14,10 @@ test.describe('Test network related behaviors', () => { 'simulate network down and network little widget', { tag: '@skipLocalEngine' }, async ({ page, homePage }) => { - const networkToggleConnectedText = page.getByText('Connected') - const networkToggleWeakText = page.getByText('Network health (Weak)') + const networkToggleConnectedText = page.getByText( + 'Network health (Strong)' + ) + const networkToggleWeakText = page.getByText('Network health (Ok)') const u = await getUtils(page) await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -61,7 +63,7 @@ test.describe('Test network related behaviors', () => { }) // Expect the network to be down - await expect(networkToggle).toContainText('Problem') + await expect(networkToggle).toContainText('Network health (Offline)') // Click the network widget await networkWidget.click() @@ -98,8 +100,10 @@ test.describe('Test network related behaviors', () => { { tag: '@skipLocalEngine' }, async ({ page, homePage, toolbar, scene, cmdBar }) => { const networkToggle = page.getByTestId('network-toggle') - const networkToggleConnectedText = page.getByText('Connected') - const networkToggleWeakText = page.getByText('Network health (Weak)') + const networkToggleConnectedText = page.getByText( + 'Network health (Strong)' + ) + const networkToggleWeakText = page.getByText('Network health (Ok)') const u = await getUtils(page) await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -156,7 +160,8 @@ test.describe('Test network related behaviors', () => { // Expect the network to be down await networkToggle.hover() - await expect(networkToggle).toContainText('Problem') + + await expect(networkToggle).toContainText('Network health (Offline)') // Ensure we are not in sketch mode await expect( @@ -279,11 +284,13 @@ profile001 = startProfile(sketch001, at = [12.34, -12.34]) test( 'Paused stream freezes view frame, unpause reconnect is seamless to user', - { tag: ['@electron', '@skipLocalEngine'] }, + { tag: ['@desktop', '@skipLocalEngine'] }, async ({ page, homePage, scene, cmdBar, toolbar, tronApp }) => { const networkToggle = page.getByTestId('network-toggle') - const networkToggleConnectedText = page.getByText('Connected') - const networkToggleWeakText = page.getByText('Network health (Weak)') + const networkToggleConnectedText = page.getByText( + 'Network health (Strong)' + ) + const networkToggleWeakText = page.getByText('Network health (Ok)') if (!tronApp) { fail() diff --git a/e2e/playwright/test-utils.ts b/e2e/playwright/test-utils.ts index 1ca56a799..294367bc5 100644 --- a/e2e/playwright/test-utils.ts +++ b/e2e/playwright/test-utils.ts @@ -79,20 +79,6 @@ export function runningOnWindows() { return process.platform === 'win32' } -async function waitForPageLoadWithRetry(page: Page) { - await expect(async () => { - await page.goto('/') - const errorMessage = 'App failed to load - 🔃 Retrying ...' - - await expect( - page.getByRole('button', { name: 'sketch Start Sketch' }), - errorMessage - ).toBeEnabled({ - timeout: 20_000, - }) - }).toPass({ timeout: 70_000, intervals: [1_000] }) -} - // lee: This needs to be replaced by scene.settled() eventually. async function waitForPageLoad(page: Page) { await expect(page.getByRole('button', { name: 'Start Sketch' })).toBeEnabled({ @@ -354,13 +340,8 @@ async function waitForAuthAndLsp(page: Page) { }, timeout: 45_000, }) - if (process.env.CI) { - await waitForPageLoadWithRetry(page) - } else { - await page.goto('/') - await waitForPageLoad(page) - } - + await page.goto('/') + await waitForPageLoad(page) return waitForLspPromise } @@ -383,15 +364,9 @@ export async function getUtils(page: Page, test_?: typeof test) { ) } - // Chrome devtools protocol session only works in Chromium - const browserType = page.context().browser()?.browserType().name() - const cdpSession = - browserType !== 'chromium' ? null : await page.context().newCDPSession(page) - const util = { waitForAuthSkipAppStart: () => waitForAuthAndLsp(page), waitForPageLoad: () => waitForPageLoad(page), - waitForPageLoadWithRetry: () => waitForPageLoadWithRetry(page), removeCurrentCode: () => removeCurrentCode(page), sendCustomCmd: (cmd: EngineCommand) => sendCustomCmd(page, cmd), updateCamPosition: async (xyz: [number, number, number]) => { @@ -509,15 +484,9 @@ export async function getUtils(page: Page, test_?: typeof test) { emulateNetworkConditions: async ( networkOptions: Protocol.Network.emulateNetworkConditionsParameters ) => { - if (cdpSession === null) { - // Use a fail safe if we can't simulate disconnect (on Safari) - return page.evaluate('window.engineCommandManager.tearDown()') - } - - return cdpSession?.send( - 'Network.emulateNetworkConditions', - networkOptions - ) + return networkOptions.offline + ? page.evaluate('window.engineCommandManager.offline()') + : page.evaluate('window.engineCommandManager.online()') }, toNormalizedCode(text: string) { diff --git a/e2e/playwright/testing-camera-movement.spec.ts b/e2e/playwright/testing-camera-movement.spec.ts index 778ceb54b..cfca522c4 100644 --- a/e2e/playwright/testing-camera-movement.spec.ts +++ b/e2e/playwright/testing-camera-movement.spec.ts @@ -3,187 +3,250 @@ import { uuidv4 } from '@src/lib/utils' import { getUtils } from '@e2e/playwright/test-utils' import { expect, test } from '@e2e/playwright/zoo-test' +import type { Page } from '@playwright/test' +import type { SceneFixture } from '@e2e/playwright/fixtures/sceneFixture' test.describe('Testing Camera Movement', () => { - test('Can move camera reliably', async ({ + /** + * hack that we're implemented our own retry instead of using retries built into playwright. + * however each of these camera drags can be flaky, because of udp + * and so putting them together means only one needs to fail to make this test extra flaky. + * this way we can retry within the test + * We could break them out into separate tests, but the longest past of the test is waiting + * for the stream to start, so it can be good to bundle related things together. + */ + const bakeInRetries = async ({ + mouseActions, + afterPosition, + beforePosition, + retryCount = 0, page, - context, - homePage, scene, + }: { + mouseActions: () => Promise + beforePosition: [number, number, number] + afterPosition: [number, number, number] + retryCount?: number + page: Page + scene: SceneFixture }) => { + const acceptableCamError = 5 const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - await homePage.goToModelingScene() - await scene.connectionEstablished() + await test.step('Set up initial camera position', async () => + await scene.moveCameraTo({ + x: beforePosition[0], + y: beforePosition[1], + z: beforePosition[2], + })) - await u.openAndClearDebugPanel() - await u.closeKclCodePanel() - - const camPos: [number, number, number] = [0, 85, 85] - const bakeInRetries = async ( - mouseActions: any, - xyz: [number, number, number], - cnt = 0 - ) => { - // hack that we're implemented our own retry instead of using retries built into playwright. - // however each of these camera drags can be flaky, because of udp - // and so putting them together means only one needs to fail to make this test extra flaky. - // this way we can retry within the test - // We could break them out into separate tests, but the longest past of the test is waiting - // for the stream to start, so it can be good to bundle related things together. - - const camCommand: EngineCommand = { - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'default_camera_look_at', - center: { x: 0, y: 0, z: 0 }, - vantage: { x: camPos[0], y: camPos[1], z: camPos[2] }, - up: { x: 0, y: 0, z: 1 }, - }, - } - const updateCamCommand: EngineCommand = { - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'default_camera_get_settings', - }, - } - await u.sendCustomCmd(camCommand) - await page.waitForTimeout(100) - await u.sendCustomCmd(updateCamCommand) - await page.waitForTimeout(100) - - // rotate - await u.closeDebugPanel() - await page.getByRole('button', { name: 'Start Sketch' }).click() - await page.waitForTimeout(100) - // const yo = page.getByTestId('cam-x-position').inputValue() - - await u.doAndWaitForImageDiff(async () => { + await test.step('Do actions and watch for changes', async () => + u.doAndWaitForImageDiff(async () => { await mouseActions() await u.openAndClearDebugPanel() - await u.closeDebugPanel() await page.waitForTimeout(100) - }, 300) + }, 300)) + + await u.openAndClearDebugPanel() + await expect(page.getByTestId('cam-x-position')).toBeAttached() + + const vals = await Promise.all([ + page.getByTestId('cam-x-position').inputValue(), + page.getByTestId('cam-y-position').inputValue(), + page.getByTestId('cam-z-position').inputValue(), + ]) + const errors = vals.map((v, i) => Math.abs(Number(v) - afterPosition[i])) + let shouldRetry = false + + if (errors.some((e) => e > acceptableCamError)) { + if (retryCount > 2) { + console.log('xVal', vals[0], 'xError', errors[0]) + console.log('yVal', vals[1], 'yError', errors[1]) + console.log('zVal', vals[2], 'zError', errors[2]) + + throw new Error('Camera position not as expected', { + cause: { + vals, + errors, + }, + }) + } + shouldRetry = true + } + if (shouldRetry) { + await bakeInRetries({ + mouseActions, + afterPosition: afterPosition, + beforePosition: beforePosition, + retryCount: retryCount + 1, + page, + scene, + }) + } + } + + test( + 'Can pan and zoom camera reliably', + { + tag: '@web', + }, + async ({ page, homePage, scene, cmdBar }) => { + const u = await getUtils(page) + const camInitialPosition: [number, number, number] = [0, 85, 85] + + await homePage.goToModelingScene() + await scene.settled(cmdBar) await u.openAndClearDebugPanel() - await page.getByTestId('cam-x-position').isVisible() + await u.closeKclCodePanel() - const vals = await Promise.all([ - page.getByTestId('cam-x-position').inputValue(), - page.getByTestId('cam-y-position').inputValue(), - page.getByTestId('cam-z-position').inputValue(), - ]) - const xError = Math.abs(Number(vals[0]) + xyz[0]) - const yError = Math.abs(Number(vals[1]) + xyz[1]) - const zError = Math.abs(Number(vals[2]) + xyz[2]) + await test.step('Pan', async () => { + await bakeInRetries({ + mouseActions: async () => { + await page.keyboard.down('Shift') + await page.mouse.move(600, 200) + await page.mouse.down({ button: 'right' }) + // Gotcha: remove steps:2 from this 700,200 mouse move. This bricked the test on local host engine. + await page.mouse.move(700, 200) + await page.mouse.up({ button: 'right' }) + await page.keyboard.up('Shift') + await page.waitForTimeout(200) + }, + afterPosition: [19, 85, 85], + beforePosition: camInitialPosition, + page, + scene, + }) + }) - let shouldRetry = false + await test.step('Zoom with click and drag', async () => { + await bakeInRetries({ + mouseActions: async () => { + await page.keyboard.down('Control') + await page.mouse.move(700, 400) + await page.mouse.down({ button: 'right' }) + await page.mouse.move(700, 300) + await page.mouse.up({ button: 'right' }) + await page.keyboard.up('Control') + }, + afterPosition: [0, 118, 118], + beforePosition: camInitialPosition, + page, + scene, + }) + }) - if (xError > 5 || yError > 5 || zError > 5) { - if (cnt > 2) { - console.log('xVal', vals[0], 'xError', xError) - console.log('yVal', vals[1], 'yError', yError) - console.log('zVal', vals[2], 'zError', zError) - - throw new Error('Camera position not as expected') + await test.step('Zoom with scrollwheel', async () => { + const refreshCamValuesCmd: EngineCommand = { + type: 'modeling_cmd_req', + cmd_id: uuidv4(), + cmd: { + type: 'default_camera_get_settings', + }, } - shouldRetry = true - } - await page.getByRole('button', { name: 'Exit Sketch' }).click() - await page.waitForTimeout(100) - if (shouldRetry) await bakeInRetries(mouseActions, xyz, cnt + 1) + await bakeInRetries({ + mouseActions: async () => { + await page.mouse.move(700, 400) + await page.mouse.wheel(0, -150) + + // Scroll zooming doesn't update the debug pane's cam position values, + // so we have to force a refresh. + await u.openAndClearDebugPanel() + await u.sendCustomCmd(refreshCamValuesCmd) + await u.waitForCmdReceive('default_camera_get_settings') + await u.closeDebugPanel() + }, + afterPosition: [0, 42.5, 42.5], + beforePosition: camInitialPosition, + page, + scene, + }) + }) } - await bakeInRetries(async () => { - await page.mouse.move(700, 200) - await page.mouse.down({ button: 'right' }) - await page.waitForTimeout(100) + ) - const appLogoBBox = await page.getByTestId('app-logo').boundingBox() - expect(appLogoBBox).not.toBeNull() - if (!appLogoBBox) throw new Error('app logo not found') - await page.mouse.move( - appLogoBBox.x + appLogoBBox.width / 2, - appLogoBBox.y + appLogoBBox.height / 2 - ) - await page.waitForTimeout(100) - await page.mouse.move(600, 303) - await page.waitForTimeout(100) - await page.mouse.up({ button: 'right' }) - }, [4, -10.5, -120]) + test( + 'Can orbit camera reliably', + { + tag: '@web', + }, + async ({ page, homePage, scene, cmdBar }) => { + const u = await getUtils(page) + const initialCamPosition: [number, number, number] = [0, 85, 85] - await bakeInRetries(async () => { - await page.keyboard.down('Shift') - await page.mouse.move(600, 200) - await page.mouse.down({ button: 'right' }) - // Gotcha: remove steps:2 from this 700,200 mouse move. This bricked the test on local host engine. - await page.mouse.move(700, 200) - await page.mouse.up({ button: 'right' }) - await page.keyboard.up('Shift') - }, [-19, -85, -85]) + await homePage.goToModelingScene() + // this turns on the debug pane setting as well + await scene.settled(cmdBar) - const camCommand: EngineCommand = { - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'default_camera_look_at', - center: { x: 0, y: 0, z: 0 }, - vantage: { x: camPos[0], y: camPos[1], z: camPos[2] }, - up: { x: 0, y: 0, z: 1 }, - }, + await u.openAndClearDebugPanel() + await u.closeKclCodePanel() + + await test.step('Test orbit with spherical mode', async () => { + await bakeInRetries({ + mouseActions: async () => { + await page.mouse.move(700, 200) + await page.mouse.down({ button: 'right' }) + await page.waitForTimeout(100) + + const appLogoBBox = await page.getByTestId('app-logo').boundingBox() + expect(appLogoBBox).not.toBeNull() + if (!appLogoBBox) throw new Error('app logo not found') + await page.mouse.move( + appLogoBBox.x + appLogoBBox.width / 2, + appLogoBBox.y + appLogoBBox.height / 2 + ) + await page.waitForTimeout(100) + await page.mouse.move(600, 303) + await page.waitForTimeout(100) + await page.mouse.up({ button: 'right' }) + }, + afterPosition: [-4, 10.5, 120], + beforePosition: initialCamPosition, + page, + scene, + }) + }) + + await test.step('Test orbit with trackball mode', async () => { + await test.step('Set orbitMode to trackball', async () => { + await cmdBar.openCmdBar() + await cmdBar.selectOption({ name: 'camera orbit' }).click() + await cmdBar.selectOption({ name: 'trackball' }).click() + await expect( + page.getByText(`camera orbit to "trackball"`) + ).toBeVisible() + }) + + await bakeInRetries({ + mouseActions: async () => { + await page.mouse.move(700, 200) + await page.mouse.down({ button: 'right' }) + await page.waitForTimeout(100) + + const appLogoBBox = await page.getByTestId('app-logo').boundingBox() + expect(appLogoBBox).not.toBeNull() + if (!appLogoBBox) { + throw new Error('app logo not found') + } + await page.mouse.move( + appLogoBBox.x + appLogoBBox.width / 2, + appLogoBBox.y + appLogoBBox.height / 2 + ) + await page.waitForTimeout(100) + await page.mouse.move(600, 303) + await page.waitForTimeout(100) + await page.mouse.up({ button: 'right' }) + }, + afterPosition: [18.06, -42.79, 110.87], + beforePosition: initialCamPosition, + page, + scene, + }) + }) } - const updateCamCommand: EngineCommand = { - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'default_camera_get_settings', - }, - } - await u.sendCustomCmd(camCommand) - await page.waitForTimeout(100) - await u.sendCustomCmd(updateCamCommand) - await page.waitForTimeout(100) - - await u.clearCommandLogs() - await u.closeDebugPanel() - - await page.getByRole('button', { name: 'Start Sketch' }).click() - await page.waitForTimeout(200) - - // zoom - await u.doAndWaitForImageDiff(async () => { - await page.keyboard.down('Control') - await page.mouse.move(700, 400) - await page.mouse.down({ button: 'right' }) - await page.mouse.move(700, 300) - await page.mouse.up({ button: 'right' }) - await page.keyboard.up('Control') - - await u.openDebugPanel() - await page.waitForTimeout(300) - await u.clearCommandLogs() - - await u.closeDebugPanel() - }, 300) - - // zoom with scroll - await u.openAndClearDebugPanel() - // TODO, it appears we don't get the cam setting back from the engine when the interaction is zoom into `backInRetries` once the information is sent back on zoom - // await expect(Math.abs(Number(await page.getByTestId('cam-x-position').inputValue()) + 12)).toBeLessThan(1.5) - // await expect(Math.abs(Number(await page.getByTestId('cam-y-position').inputValue()) - 85)).toBeLessThan(1.5) - // await expect(Math.abs(Number(await page.getByTestId('cam-z-position').inputValue()) - 85)).toBeLessThan(1.5) - - await page.getByRole('button', { name: 'Exit Sketch' }).click() - - await bakeInRetries(async () => { - await page.mouse.move(700, 400) - await page.mouse.wheel(0, -100) - }, [0, -85, -85]) - }) + ) // TODO: fix after electron migration is merged test('Zoom should be consistent when exiting or entering sketches', async ({ diff --git a/e2e/playwright/testing-constraints.spec.ts b/e2e/playwright/testing-constraints.spec.ts index 43f9b4517..bd2babdd6 100644 --- a/e2e/playwright/testing-constraints.spec.ts +++ b/e2e/playwright/testing-constraints.spec.ts @@ -1120,7 +1120,7 @@ part002 = startSketchOn(XZ) test.describe('Electron constraint tests', () => { test( 'Able to double click label to set constraint', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, context, homePage, scene, editor, toolbar, cmdBar }) => { await context.folderSetupFn(async (dir) => { const bracketDir = path.join(dir, 'test-sample') diff --git a/e2e/playwright/testing-samples-loading.spec.ts b/e2e/playwright/testing-samples-loading.spec.ts index a3a01d290..3c3b9610d 100644 --- a/e2e/playwright/testing-samples-loading.spec.ts +++ b/e2e/playwright/testing-samples-loading.spec.ts @@ -84,7 +84,7 @@ test.describe('Testing loading external models', () => { */ test( 'Desktop: should create new file by default, creates a second file with automatic unique name', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ editor, context, page, scene, cmdBar, toolbar }) => { if (runningOnWindows()) { } @@ -196,7 +196,7 @@ test.describe('Testing loading external models', () => { externalModelCases.map(({ modelName, deconflictedModelName, modelPath }) => { test( `Load external models from local drive - ${modelName}`, - { tag: ['@electron'] }, + { tag: ['@desktop'] }, async ({ page, homePage, scene, toolbar, cmdBar, tronApp }) => { if (!tronApp) { fail() diff --git a/e2e/playwright/testing-segment-overlays.spec.ts b/e2e/playwright/testing-segment-overlays.spec.ts index 33f335bc2..08ffbb721 100644 --- a/e2e/playwright/testing-segment-overlays.spec.ts +++ b/e2e/playwright/testing-segment-overlays.spec.ts @@ -50,6 +50,11 @@ test.describe('Testing segment overlays', () => { y = 0 x = hoverPos.x + Math.cos(ang * deg) * 32 y = hoverPos.y - Math.sin(ang * deg) * 32 + + const constrainedLocator = page.locator( + `[data-constraint-type="${constraintType}"][data-is-constrained="true"]` + ) + await page.mouse.move(x, y) await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator) await page.mouse.move(x, y) @@ -57,9 +62,6 @@ test.describe('Testing segment overlays', () => { await editor.expectEditor.toContain(expectBeforeUnconstrained, { shouldNormalise: true, }) - const constrainedLocator = page.locator( - `[data-constraint-type="${constraintType}"][data-is-constrained="true"]` - ) await expect(constrainedLocator).toBeVisible() await constrainedLocator.hover() await expect( @@ -90,15 +92,12 @@ test.describe('Testing segment overlays', () => { await expect( page.getByTestId('cmd-bar-arg-value').getByRole('textbox') ).toBeFocused() + await page.waitForTimeout(500) await page .getByRole('button', { name: 'arrow right Continue', }) .click() - await expect(page.locator('.cm-content')).toContainText(expectFinal) - await editor.expectEditor.toContain(expectFinal, { - shouldNormalise: true, - }) await editor.expectEditor.toContain(expectFinal, { shouldNormalise: true, }) @@ -163,6 +162,7 @@ test.describe('Testing segment overlays', () => { await expect( page.getByTestId('cmd-bar-arg-value').getByRole('textbox') ).toBeFocused() + await page.waitForTimeout(500) await page .getByRole('button', { name: 'arrow right Continue', @@ -195,10 +195,12 @@ test.describe('Testing segment overlays', () => { }) } test.setTimeout(120000) - test('for segments [line, angledLine, xLineTo]', async ({ + test('for a line segment', async ({ page, editor, homePage, + scene, + cmdBar, }) => { await page.addInitScript(async () => { localStorage.setItem( @@ -206,7 +208,7 @@ test.describe('Testing segment overlays', () => { `@settings(defaultLengthUnit = in) part001 = startSketchOn(XZ) |> startProfile(at = [5 + 0, 20 + 0]) - |> line(end = [0.5, -14 + 0]) + |> line(end = [0.5, -12 + 0]) |> angledLine(angle = 3 + 0, length = 32 + 0) |> line(endAbsolute = [5 + 33, 20 + 11.5 + 0]) |> xLine(endAbsolute = 5 + 9 - 5) @@ -226,18 +228,16 @@ test.describe('Testing segment overlays', () => { await page.setBodyDimensions({ width: 1200, height: 500 }) await homePage.goToModelingScene() + await await scene.settled(cmdBar) // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() await page.getByText('xLine(endAbsolute = 5 + 9 - 5)').click() await page.waitForTimeout(100) await page.getByRole('button', { name: 'Edit Sketch' }).click() await page.waitForTimeout(500) - await expect(page.getByTestId('segment-overlay')).toHaveCount(13) + await expect(page.getByTestId('segment-overlay')).toHaveCount(14) const clickUnconstrained = _clickUnconstrained(page, editor) const clickConstrained = _clickConstrained(page, editor) @@ -261,22 +261,22 @@ test.describe('Testing segment overlays', () => { type: 'default_camera_get_settings', }, }) - await page.waitForTimeout(100) + await page.waitForTimeout(1000) await u.closeDebugPanel() let ang = 0 - const line = await u.getBoundingBox('[data-overlay-index="0"]') - ang = await u.getAngle('[data-overlay-index="0"]') + const line = await u.getBoundingBox('[data-overlay-index="1"]') + ang = await u.getAngle('[data-overlay-index="1"]') console.log('line1', line, ang) await clickConstrained({ hoverPos: { x: line.x, y: line.y }, constraintType: 'yRelative', - expectBeforeUnconstrained: '|> line(end = [0.5, -14 + 0])', - expectAfterUnconstrained: '|> line(end = [0.5, -14])', + expectBeforeUnconstrained: '|> line(end = [0.5, -12 + 0])', + expectAfterUnconstrained: '|> line(end = [0.5, -12])', expectFinal: '|> line(end = [0.5, yRel001])', ang: ang + 180, - locator: '[data-overlay-toolbar-index="0"]', + locator: '[data-overlay-toolbar-index="1"]', }) console.log('line2') await clickUnconstrained({ @@ -286,651 +286,7 @@ test.describe('Testing segment overlays', () => { expectAfterUnconstrained: 'line(end = [xRel001, yRel001])', expectFinal: '|> line(end = [0.5, yRel001])', ang: ang + 180, - locator: '[data-overlay-index="0"]', - }) - - const angledLine = await u.getBoundingBox('[data-overlay-index="1"]') - ang = await u.getAngle('[data-overlay-index="1"]') - console.log('angledLine1') - await clickConstrained({ - hoverPos: { x: angledLine.x, y: angledLine.y }, - constraintType: 'angle', - expectBeforeUnconstrained: 'angledLine(angle = 3 + 0, length = 32 + 0)', - expectAfterUnconstrained: 'angledLine(angle = 3, length = 32 + 0)', - expectFinal: 'angledLine(angle = angle001, length = 32 + 0)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="1"]', - }) - console.log('angledLine2') - await clickConstrained({ - hoverPos: { x: angledLine.x, y: angledLine.y }, - constraintType: 'length', - expectBeforeUnconstrained: - 'angledLine(angle = angle001, length = 32 + 0)', - expectAfterUnconstrained: 'angledLine(angle = angle001, length = 32)', - expectFinal: 'angledLine(angle = angle001, length = len001)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="1"]', - }) - - await page.mouse.move(700, 250) - await page.waitForTimeout(100) - - let lineTo = await u.getBoundingBox('[data-overlay-index="2"]') - ang = await u.getAngle('[data-overlay-index="2"]') - console.log('lineTo1') - await clickConstrained({ - hoverPos: { x: lineTo.x, y: lineTo.y }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: - 'line(endAbsolute = [5 + 33, 20 + 11.5 + 0])', - expectAfterUnconstrained: 'line(endAbsolute = [5 + 33, 31.5])', - expectFinal: 'line(endAbsolute = [5 + 33, yAbs001])', - steps: 8, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="2"]', - }) - console.log('lineTo2') - await clickConstrained({ - hoverPos: { x: lineTo.x, y: lineTo.y }, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: 'line(endAbsolute = [5 + 33, yAbs001])', - expectAfterUnconstrained: 'line(endAbsolute = [38, yAbs001])', - expectFinal: 'line(endAbsolute = [xAbs001, yAbs001])', - steps: 8, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="2"]', - }) - - const xLineTo = await u.getBoundingBox('[data-overlay-index="3"]') - ang = await u.getAngle('[data-overlay-index="3"]') - console.log('xlineTo1') - await clickConstrained({ - hoverPos: { x: xLineTo.x, y: xLineTo.y }, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: 'xLine(endAbsolute = 5 + 9 - 5)', - expectAfterUnconstrained: 'xLine(endAbsolute = 9)', - expectFinal: 'xLine(endAbsolute = xAbs002)', - ang: ang + 180, - steps: 8, - locator: '[data-overlay-toolbar-index="3"]', - }) - }) - - // Broken on main at time of writing! - test('for segments [yLineTo, xLine]', async ({ - page, - editor, - homePage, - }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `@settings(defaultLengthUnit = in) - yRel001 = -14 - xRel001 = 0.5 - angle001 = 3 - len001 = 32 - yAbs001 = 11.5 - xAbs001 = 33 - xAbs002 = 4 - part001 = startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> line(end = [0.5, yRel001]) - |> angledLine(angle = angle001, length = len001) - |> line(endAbsolute = [33, yAbs001]) - |> xLine(endAbsolute = xAbs002) - |> yLine(endAbsolute = -10.77, tag = $a) - |> xLine(length = 26.04) - |> yLine(length = 21.14 + 0) - |> angledLine(angle = 181 + 0, lengthX = 23.14) - ` - ) - }) - const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - - await homePage.goToModelingScene() - - // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - - await page.getByText('xLine(length = 26.04)').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) - - await expect(page.getByTestId('segment-overlay')).toHaveCount(8) - - const clickUnconstrained = _clickUnconstrained(page, editor) - - await page.mouse.move(700, 250) - await page.waitForTimeout(100) - - let ang = 0 - - const yLineTo = await u.getBoundingBox('[data-overlay-index="4"]') - ang = await u.getAngle('[data-overlay-index="4"]') - console.log('ylineTo1') - await clickUnconstrained({ - hoverPos: { x: yLineTo.x, y: yLineTo.y - 200 }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: 'yLine(endAbsolute = -10.77, tag = $a)', - expectAfterUnconstrained: 'yLine(endAbsolute = yAbs002, tag = $a)', - expectFinal: 'yLine(endAbsolute = -10.77, tag = $a)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="4"]', - }) - - const xLine = await u.getBoundingBox('[data-overlay-index="5"]') - ang = await u.getAngle('[data-overlay-index="5"]') - console.log('xline') - await clickUnconstrained({ - hoverPos: { x: xLine.x, y: xLine.y }, - constraintType: 'xRelative', - expectBeforeUnconstrained: 'xLine(length = 26.04)', - expectAfterUnconstrained: 'xLine(length = xRel002)', - expectFinal: 'xLine(length = 26.04)', - steps: 10, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="5"]', - }) - }) - test('for segments [yLine, angledLineOfXLength, angledLineOfYLength]', async ({ - page, - editor, - homePage, - }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `@settings(defaultLengthUnit = in) - part001 = startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> line(end = [0.5, -14 + 0]) - |> angledLine(angle = 3 + 0, length = 32 + 0) - |> line(endAbsolute = [33, 11.5 + 0]) - |> xLine(endAbsolute = 9 - 5) - |> yLine(endAbsolute = -10.77, tag = $a) - |> xLine(length = 26.04) - |> yLine(length = 21.14 + 0) - |> angledLine(angle = 181 + 0, lengthX = 23.14) - |> angledLine(angle = -91, lengthY = 19 + 0) - |> angledLine(angle = 3 + 0, endAbsoluteX = 26) - |> angledLine(angle = 89, endAbsoluteY = 9.14 + 0) - |> angledLineThatIntersects(angle = 4.14, intersectTag = a, offset = 9) - |> tangentialArc(endAbsolute = [3.14 + 13, 3.14]) - ` - ) - localStorage.setItem('disableAxis', 'true') - }) - const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - - await homePage.goToModelingScene() - - // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - await page.waitForTimeout(500) - - await page.getByText('xLine(endAbsolute = 9 - 5)').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) - - await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - - const clickUnconstrained = _clickUnconstrained(page, editor) - const clickConstrained = _clickConstrained(page, editor) - - let ang = 0 - - const yLine = await u.getBoundingBox('[data-overlay-index="6"]') - ang = await u.getAngle('[data-overlay-index="6"]') - console.log('yline1') - await clickConstrained({ - hoverPos: { x: yLine.x, y: yLine.y }, - constraintType: 'yRelative', - expectBeforeUnconstrained: 'yLine(length = 21.14 + 0)', - expectAfterUnconstrained: 'yLine(length = 21.14)', - expectFinal: 'yLine(length = yRel001)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="6"]', - }) - - const angledLineOfXLength = await u.getBoundingBox( - '[data-overlay-index="7"]' - ) - ang = await u.getAngle('[data-overlay-index="7"]') - console.log('angledLineOfXLength1') - await clickConstrained({ - hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y }, - constraintType: 'angle', - expectBeforeUnconstrained: - 'angledLine(angle = 181 + 0, lengthX = 23.14)', - expectAfterUnconstrained: 'angledLine(angle = -179, lengthX = 23.14)', - expectFinal: 'angledLine(angle = angle001, lengthX = 23.14)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="7"]', - }) - console.log('angledLineOfXLength2') - await clickUnconstrained({ - hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y }, - constraintType: 'xRelative', - expectBeforeUnconstrained: - 'angledLine(angle = angle001, lengthX = 23.14)', - expectAfterUnconstrained: - 'angledLine(angle = angle001, lengthX = xRel001)', - expectFinal: 'angledLine(angle = angle001, lengthX = 23.14)', - steps: 7, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="7"]', - }) - - const angledLineOfYLength = await u.getBoundingBox( - '[data-overlay-index="8"]' - ) - ang = await u.getAngle('[data-overlay-index="8"]') - console.log('angledLineOfYLength1') - await clickUnconstrained({ - hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y }, - constraintType: 'angle', - expectBeforeUnconstrained: 'angledLine(angle = -91, lengthY = 19 + 0)', - expectAfterUnconstrained: - 'angledLine(angle = angle002, lengthY = 19 + 0)', - expectFinal: 'angledLine(angle = -91, lengthY = 19 + 0)', - ang: ang + 180, - steps: 6, - locator: '[data-overlay-toolbar-index="8"]', - }) - console.log('angledLineOfYLength2') - await clickConstrained({ - hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y }, - constraintType: 'yRelative', - expectBeforeUnconstrained: 'angledLine(angle = -91, lengthY = 19 + 0)', - expectAfterUnconstrained: 'angledLine(angle = -91, lengthY = 19)', - expectFinal: 'angledLine(angle = -91, lengthY = yRel002)', - ang: ang + 180, - steps: 7, - locator: '[data-overlay-toolbar-index="8"]', - }) - }) - test('for segments [angledLineToX, angledLineToY, angledLineThatIntersects]', async ({ - page, - editor, - homePage, - }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `@settings(defaultLengthUnit = in) - part001 = startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> line(end = [0.5, -14 + 0]) - |> angledLine(angle = 3 + 0, length = 32 + 0) - |> line(endAbsolute = [33, 11.5 + 0]) - |> xLine(endAbsolute = 9 - 5) - |> yLine(endAbsolute = -10.77, tag = $a) - |> xLine(length = 26.04) - |> yLine(length = 21.14 + 0) - |> angledLine(angle = 181 + 0, lengthX = 23.14) - |> angledLine(angle = -91, lengthY = 19 + 0) - |> angledLine(angle = 3 + 0, endAbsoluteX = 26) - |> angledLine(angle = 89, endAbsoluteY = 9.14 + 0) - |> angledLineThatIntersects(angle = 4.14, intersectTag = a, offset = 9) - |> tangentialArc(endAbsolute = [3.14 + 13, 1.14]) - ` - ) - localStorage.setItem('disableAxis', 'true') - }) - const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - - await homePage.goToModelingScene() - - // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - - await page.getByText('xLine(endAbsolute = 9 - 5)').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) - - await expect(page.getByTestId('segment-overlay')).toHaveCount(13) - - const clickUnconstrained = _clickUnconstrained(page, editor) - const clickConstrained = _clickConstrained(page, editor) - - let ang = 0 - - const angledLineToX = await u.getBoundingBox('[data-overlay-index="9"]') - ang = await u.getAngle('[data-overlay-index="9"]') - console.log('angledLineToX') - await clickConstrained({ - hoverPos: { x: angledLineToX.x, y: angledLineToX.y }, - constraintType: 'angle', - expectBeforeUnconstrained: - 'angledLine(angle = 3 + 0, endAbsoluteX = 26)', - expectAfterUnconstrained: 'angledLine(angle = 3, endAbsoluteX = 26)', - expectFinal: 'angledLine(angle = angle001, endAbsoluteX = 26)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="9"]', - }) - console.log('angledLineToX2') - await clickUnconstrained({ - hoverPos: { x: angledLineToX.x, y: angledLineToX.y }, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: - 'angledLine(angle = angle001, endAbsoluteX = 26)', - expectAfterUnconstrained: - 'angledLine(angle = angle001, endAbsoluteX = xAbs001)', - expectFinal: 'angledLine(angle = angle001, endAbsoluteX = 26)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="9"]', - }) - - const angledLineToY = await u.getBoundingBox('[data-overlay-index="10"]') - ang = await u.getAngle('[data-overlay-index="10"]') - console.log('angledLineToY') - await clickUnconstrained({ - hoverPos: { x: angledLineToY.x, y: angledLineToY.y }, - constraintType: 'angle', - expectBeforeUnconstrained: 'angledLine(angle = 89, to = 9.14 + 0)', - expectAfterUnconstrained: 'angledLine(angle = angle002, to = 9.14 + 0)', - expectFinal: 'angledLine(angle = 89, to = 9.14 + 0)', - steps: process.platform === 'darwin' ? 8 : 9, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="10"]', - }) - console.log('angledLineToY2') - await clickConstrained({ - hoverPos: { x: angledLineToY.x, y: angledLineToY.y }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: - 'angledLine(angle = 89, endAbsoluteY = 9.14 + 0)', - expectAfterUnconstrained: 'angledLine(angle = 89, endAbsoluteY = 9.14)', - expectFinal: 'angledLine(angle = 89, endAbsoluteY = yAbs001)', - ang: ang + 180, - locator: '[data-overlay-toolbar-index="10"]', - }) - - const angledLineThatIntersects = await u.getBoundingBox( - '[data-overlay-index="11"]' - ) - ang = await u.getAngle('[data-overlay-index="11"]') - console.log('angledLineThatIntersects') - await clickUnconstrained({ - hoverPos: { - x: angledLineThatIntersects.x, - y: angledLineThatIntersects.y, - }, - constraintType: 'angle', - expectBeforeUnconstrained: `angledLineThatIntersects(angle = 4.14, intersectTag = a, offset = 9)`, - expectAfterUnconstrained: `angledLineThatIntersects(angle = angle003, intersectTag = a,offset = 9)`, - expectFinal: `angledLineThatIntersects(angle = -176, offset = 9, intersectTag = a)`, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="11"]', - }) - console.log('angledLineThatIntersects2') - await clickUnconstrained({ - hoverPos: { - x: angledLineThatIntersects.x, - y: angledLineThatIntersects.y, - }, - constraintType: 'intersectionOffset', - expectBeforeUnconstrained: `angledLineThatIntersects(angle = -176, offset = 9, intersectTag = a)`, - expectAfterUnconstrained: `angledLineThatIntersects(angle = -176, offset = perpDist001, intersectTag = a)`, - expectFinal: `angledLineThatIntersects(angle = -176, offset = 9, intersectTag = a)`, - ang: ang + 180, - locator: '[data-overlay-toolbar-index="11"]', - }) - }) - test('for segment [tangentialArc]', async ({ - page, - editor, - homePage, - scene, - cmdBar, - }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `@settings(defaultLengthUnit = in) - part001 = startSketchOn(XZ) - |> startProfile(at = [0, 0]) - |> line(end = [0.5, -14 + 0]) - |> angledLine(angle = 3 + 0, length = 32 + 0) - |> line(endAbsolute = [33, 11.5 + 0]) - |> xLine(endAbsolute = 9 - 5) - |> yLine(endAbsolute = -10.77, tag = $a) - |> xLine(length = 26.04) - |> yLine(length = 21.14 + 0) - |> angledLine(angle = 181 + 0, lengthX = 23.14) - |> angledLine(angle = -91, lengthY = 19 + 0) - |> angledLine(angle = 3 + 0, endAbsoluteX = 26) - |> angledLine(angle = 89, endAbsoluteY = 9.14 + 0) - |> angledLineThatIntersects(angle = 4.14, intersectTag = a, offset = 9) - |> tangentialArc(endAbsolute = [3.14 + 13, -3.14]) - ` - ) - localStorage.setItem('disableAxis', 'true') - }) - const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - - await homePage.goToModelingScene() - await scene.settled(cmdBar) - - // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - - await page.getByText('xLine(endAbsolute = 9 - 5)').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) - - await expect(page.getByTestId('segment-overlay')).toHaveCount(14) - - const clickUnconstrained = _clickUnconstrained(page, editor) - const clickConstrained = _clickConstrained(page, editor) - - const tangentialArc = await u.getBoundingBox('[data-overlay-index="13"]') - let ang = await u.getAngle('[data-overlay-index="13"]') - console.log('tangentialArc') - await clickConstrained({ - hoverPos: { x: tangentialArc.x, y: tangentialArc.y }, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: - 'tangentialArc(endAbsolute = [3.14 + 13, -3.14])', - expectAfterUnconstrained: 'tangentialArc(endAbsolute = [16.14, -3.14])', - expectFinal: 'tangentialArc(endAbsolute = [xAbs001, -3.14])', - ang: ang + 180, - steps: 6, - locator: '[data-overlay-toolbar-index="13"]', - }) - console.log('tangentialArc2') - await clickUnconstrained({ - hoverPos: { x: tangentialArc.x, y: tangentialArc.y }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: - 'tangentialArc(endAbsolute = [xAbs001, -3.14])', - expectAfterUnconstrained: - 'tangentialArc(endAbsolute = [xAbs001, yAbs001])', - expectFinal: 'tangentialArc(endAbsolute = [xAbs001, -3.14])', - ang: ang + 180, - steps: 10, - locator: '[data-overlay-toolbar-index="13"]', - }) - }) - test('for segment [arcTo]', async ({ - page, - editor, - homePage, - scene, - cmdBar, - }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `@settings(defaultLengthUnit = in) -sketch001 = startSketchOn(XZ) -profile001 = startProfile(sketch001, at = [56.37, 120.33]) - |> line(end = [162.86, 106.48]) - |> arc( - interiorAbsolute = [360.16, 231.76], - endAbsolute = [391.48, 131.54], - ) - |> yLine(length = -131.54) - |> arc(angleStart = 33.53, angleEnd = -141.07, radius = 126.46) -` - ) - localStorage.setItem('disableAxis', 'true') - }) - const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - - await homePage.goToModelingScene() - await scene.connectionEstablished() - await scene.settled(cmdBar) - - // wait for execution done - - await page.getByText('line(end = [162.86, 106.48])').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) - - await expect(page.getByTestId('segment-overlay')).toHaveCount(5) - - const clickUnconstrained = _clickUnconstrained(page, editor) - const clickConstrained = _clickConstrained(page, editor) - - const arcTo = await u.getBoundingBox('[data-overlay-index="1"]') - let ang = await u.getAngle('[data-overlay-index="1"]') - console.log('arcTo interiorAbsolute x') - await clickUnconstrained({ - hoverPos: { x: arcTo.x, y: arcTo.y }, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: `arc(interiorAbsolute = [360.16, 231.76], endAbsolute = [391.48, 131.54])`, - expectAfterUnconstrained: `arc(interiorAbsolute = [360.16, 231.76], endAbsolute = [391.48, 131.54])`, - expectFinal: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [391.48, 131.54])`, - ang: ang, - steps: 6, - locator: '[data-overlay-toolbar-index="1"]', - }) - - console.log('arcTo interiorAbsolute y') - await clickUnconstrained({ - hoverPos: { x: arcTo.x, y: arcTo.y }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [391.48, 131.54])`, - expectAfterUnconstrained: `arc(interiorAbsolute = [xAbs001, yAbs001], endAbsolute = [391.48, 131.54])`, - expectFinal: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [391.48, 131.54])`, - ang: ang, - steps: 10, - locator: '[data-overlay-toolbar-index="1"]', - }) - - console.log('arcTo end x') - await clickConstrained({ - hoverPos: { x: arcTo.x, y: arcTo.y }, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [391.48, 131.54])`, - expectAfterUnconstrained: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [391.48, 131.54])`, - expectFinal: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [xAbs002, 131.54])`, - ang: ang + 180, - steps: 6, - locator: '[data-overlay-toolbar-index="1"]', - }) - - console.log('arcTo end y') - await clickUnconstrained({ - hoverPos: { x: arcTo.x, y: arcTo.y }, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [xAbs002, 131.54])`, - expectAfterUnconstrained: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [xAbs002, yAbs002])`, - expectFinal: `arc(interiorAbsolute = [xAbs001, 231.76], endAbsolute = [xAbs002, 131.54])`, - ang: ang + 180, - steps: 10, - locator: '[data-overlay-toolbar-index="1"]', - }) - }) - test('for segment [circle]', async ({ page, editor, homePage }) => { - await page.addInitScript(async () => { - localStorage.setItem( - 'persistCode', - `@settings(defaultLengthUnit = in) -part001 = startSketchOn(XZ) - |> circle(center = [1 + 0, 0], radius = 8) - ` - ) - localStorage.setItem('disableAxis', 'true') - }) - const u = await getUtils(page) - await page.setBodyDimensions({ width: 1200, height: 500 }) - - await homePage.goToModelingScene() - - // wait for execution done - await u.openDebugPanel() - await u.expectCmdLog('[data-message-type="execution-done"]') - await u.closeDebugPanel() - - await page.getByText('circle(center = [1 + 0, 0], radius = 8)').click() - await page.waitForTimeout(100) - await page.getByRole('button', { name: 'Edit Sketch' }).click() - await page.waitForTimeout(500) - - await expect(page.getByTestId('segment-overlay')).toHaveCount(1) - - const clickUnconstrained = _clickUnconstrained(page, editor) - const clickConstrained = _clickConstrained(page, editor) - - const hoverPos = { x: 789, y: 114 } as const - let ang = await u.getAngle('[data-overlay-index="0"]') - console.log('angl', ang) - console.log('circle center x') - await clickConstrained({ - hoverPos, - constraintType: 'xAbsolute', - expectBeforeUnconstrained: 'circle(center = [1 + 0, 0], radius = 8)', - expectAfterUnconstrained: 'circle(center = [1, 0], radius = 8)', - expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', - ang: ang + 105, - steps: 6, - locator: '[data-overlay-toolbar-index="0"]', - }) - console.log('circle center y') - await clickUnconstrained({ - hoverPos, - constraintType: 'yAbsolute', - expectBeforeUnconstrained: 'circle(center = [xAbs001, 0], radius = 8)', - expectAfterUnconstrained: - 'circle(center = [xAbs001, yAbs001], radius = 8)', - expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', - ang: ang + 180, - steps: 30, - locator: '[data-overlay-toolbar-index="0"]', - }) - console.log('circle radius') - await clickUnconstrained({ - hoverPos, - constraintType: 'radius', - expectBeforeUnconstrained: 'circle(center = [xAbs001, 0], radius = 8)', - expectAfterUnconstrained: - 'circle(center = [xAbs001, 0], radius = radius001)', - expectFinal: 'circle(center = [xAbs001, 0], radius = 8)', - ang: ang + 105, - steps: 10, - locator: '[data-overlay-toolbar-index="0"]', + locator: '[data-overlay-index="1"]', }) }) }) @@ -978,7 +334,7 @@ part001 = startSketchOn(XZ) shouldNormalise: true, }) } - test('all segment types', async ({ + test('a line segment', async ({ page, editor, homePage, @@ -1045,201 +401,6 @@ part001 = startSketchOn(XZ) steps: 6, locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: `arc(interiorAbsolute = [16.25, 5.12], endAbsolute = [21.61, 4.15])`, - stdLibFnName: 'arc', - ang: ang, - steps: 6, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'tangentialArc(endAbsolute = [3.14 + 13, 1.14])', - stdLibFnName: 'tangentialArc', - ang: ang + 180, - steps: 6, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: `angledLineThatIntersects(angle = 4.14, intersectTag = a, offset = 9)`, - stdLibFnName: 'angledLineThatIntersects', - ang: ang + 180, - steps: 7, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLine(angle = 89, endAbsoluteY = 9.14 + 0)', - stdLibFnName: 'angledLineToY', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLine(angle = 3 + 0, endAbsoluteX = 26)', - stdLibFnName: 'angledLineToX', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLine(angle = -91, lengthY = 19 + 0)', - stdLibFnName: 'angledLineOfYLength', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLine(angle = 181 + 0, lengthX = 23.14)', - stdLibFnName: 'angledLineOfXLength', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'yLine(length = 21.14 + 0)', - stdLibFnName: 'yLine', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'xLine(length = 26.04)', - stdLibFnName: 'xLine', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'yLine(endAbsolute = -10.77, tag = $a)', - stdLibFnName: 'yLineTo', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'xLine(endAbsolute = 9 - 5)', - stdLibFnName: 'xLineTo', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await expect(page.getByText('Added variable')).not.toBeVisible() - - const hoverPos = { x: segmentToDelete.x, y: segmentToDelete.y } - await page.mouse.move(0, 0) - await page.waitForTimeout(1000) - await page.mouse.move(hoverPos.x, hoverPos.y) - await wiggleMove( - page, - hoverPos.x, - hoverPos.y, - 20, - 30, - ang, - 10, - 5, - `[data-overlay-toolbar-index="${overlayIndex}"]` - ) - await page.mouse.move(hoverPos.x, hoverPos.y) - - const codeToBeDeleted = 'line(endAbsolute = [33, 11.5 + 0])' - await editor.expectEditor.toContain(codeToBeDeleted, { - shouldNormalise: true, - }) - - await page.getByTestId('overlay-menu').click() - await page.getByText('Delete Segment').click() - - await editor.expectEditor.not.toContain(codeToBeDeleted, { - shouldNormalise: true, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'angledLine(angle = 3 + 0, length = 32 + 0)', - stdLibFnName: 'angledLine', - ang: ang + 180, - locator: `[data-overlay-toolbar-index="${overlayIndex}"]`, - }) - - overlayIndex-- - - segmentToDelete = await getOverlayByIndex(overlayIndex) - ang = await u.getAngle(`[data-overlay-index="${overlayIndex}"]`) - await deleteSegmentSequence({ - hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y }, - codeToBeDeleted: 'line(end = [0.5, -14 + 0])', - stdLibFnName: 'line', - ang: ang + 180, - }) - - await page.waitForTimeout(200) }) }) test.describe('Testing delete with dependent segments', () => { @@ -1381,43 +542,6 @@ part001 = startSketchOn(XZ) before: `line(end = [22 + 0, 2 + 0], tag = $seg01)`, after: `line(end = [22, 2], tag = $seg01)`, }, - - { - before: `angledLine(angle = 5 + 0, length = 23.03 + 0, tag = $seg01)`, - after: `line(end = [22.94, 2.01], tag = $seg01)`, - }, - { - before: `xLine(length = 23 + 0, tag = $seg01)`, - after: `line(end = [23, 0], tag = $seg01)`, - }, - { - before: `yLine(length = -8 + 0, tag = $seg01)`, - after: `line(end = [0, -8], tag = $seg01)`, - }, - { - before: `xLine(endAbsolute = 30 + 0, tag = $seg01)`, - after: `line(end = [25, 0], tag = $seg01)`, - }, - { - before: `yLine(endAbsolute = -4 + 0, tag = $seg01)`, - after: `line(end = [0, -10], tag = $seg01)`, - }, - { - before: `angledLine(angle = 3 + 0, lengthX = 30 + 0, tag = $seg01)`, - after: `line(end = [30, 1.57], tag = $seg01)`, - }, - { - before: `angledLine(angle = 3 + 0, lengthY = 1.5 + 0, tag = $seg01)`, - after: `line(end = [28.62, 1.5], tag = $seg01)`, - }, - { - before: `angledLine(angle = 3 + 0, endAbsoluteX = 30 + 0, tag = $seg01)`, - after: `line(end = [25, 1.31], tag = $seg01)`, - }, - { - before: `angledLine(angle = 3 + 0, endAbsoluteY = 7 + 0, tag = $seg01)`, - after: `line(end = [19.08, 1], tag = $seg01)`, - }, ] for (const { before, after } of cases) { diff --git a/e2e/playwright/testing-settings.spec.ts b/e2e/playwright/testing-settings.spec.ts index 75c206d50..afcfa9874 100644 --- a/e2e/playwright/testing-settings.spec.ts +++ b/e2e/playwright/testing-settings.spec.ts @@ -278,7 +278,7 @@ test.describe( test( `Project settings override user settings on desktop`, - { tag: ['@electron'] }, + { tag: ['@desktop'] }, async ({ context, page }, testInfo) => { const projectName = 'bracket' const { dir: projectDirName } = await context.folderSetupFn( @@ -373,7 +373,7 @@ test.describe( test( `Load desktop app with no settings file`, { - tag: '@electron', + tag: '@desktop', }, async ({ page }, testInfo) => { await page.setBodyDimensions({ width: 1200, height: 500 }) @@ -393,7 +393,7 @@ test.describe( test( `Load desktop app with a settings file, but no project directory setting`, { - tag: '@electron', + tag: '@desktop', }, async ({ context, page, tronApp }, testInfo) => { if (!tronApp) { @@ -425,7 +425,7 @@ test.describe( test( 'user settings reload on external change, on project and modeling view', { - tag: '@electron', + tag: '@desktop', }, async ({ context, page, tronApp }, testInfo) => { if (!tronApp) { @@ -486,7 +486,7 @@ test.describe( test( 'project settings reload on external change', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const { dir: projectDirName } = await context.folderSetupFn( async () => {} @@ -536,7 +536,7 @@ test.describe( test( `Closing settings modal should go back to the original file being viewed`, - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { await context.folderSetupFn(async (dir) => { const bracketDir = join(dir, 'project-000') diff --git a/e2e/playwright/text-to-cad-tests.spec.ts b/e2e/playwright/text-to-cad-tests.spec.ts index 0e3af15b6..a9e6598c6 100644 --- a/e2e/playwright/text-to-cad-tests.spec.ts +++ b/e2e/playwright/text-to-cad-tests.spec.ts @@ -640,7 +640,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> New Project -> Stay in home page -> Reject -> Project should be deleted', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const projectName = 'my-project-name' const prompt = '2x2x2 cube' @@ -678,7 +678,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> New Project -> Stay in home page -> Accept -> should navigate to file', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ context, page }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -724,7 +724,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> Existing Project -> Stay in home page -> Reject -> should delete single file', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const projectName = 'my-project-name' const prompt = '2x2x2 cube' @@ -767,7 +767,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> Existing Project -> Stay in home page -> Accept -> should navigate to file', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -818,7 +818,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> New Project -> Navigate to the project -> Reject -> should go to home page', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const projectName = 'my-project-name' const prompt = '2x2x2 cube' @@ -864,7 +864,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> New Project -> Navigate to the project -> Accept -> should stay in same file', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const projectName = 'my-project-name' const prompt = '2x2x2 cube' @@ -907,7 +907,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> Existing Project -> Navigate to the project -> Reject -> should load main.kcl', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -962,7 +962,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> Existing Project -> Navigate to the project -> Accept -> should load 2x2x2-cube.kcl', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -1019,7 +1019,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> New Project -> Navigate to different project -> Reject -> should stay in project', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ homePage, page }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -1096,7 +1096,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> New Project -> Navigate to different project -> Accept -> should go to new project', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, homePage }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -1165,7 +1165,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> Existing Project -> Navigate to different project -> Reject -> should stay in same project', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, homePage }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' @@ -1240,7 +1240,7 @@ test.describe('Mocked Text-to-CAD API tests', { tag: ['@skipWin'] }, () => { test( 'Home Page -> Text To CAD -> Existing Project -> Navigate to different project -> Accept -> should navigate to new project', - { tag: '@electron' }, + { tag: '@desktop' }, async ({ page, homePage }, testInfo) => { const u = await getUtils(page) const projectName = 'my-project-name' diff --git a/package.json b/package.json index 2c2d7ff84..5b9eb20de 100644 --- a/package.json +++ b/package.json @@ -133,9 +133,9 @@ "test:unit": "vitest run --mode development --exclude **/jest-component-unit-tests/*", "test:unit:components": "jest -c jest-component-unit-tests/jest.config.ts --rootDir jest-component-unit-tests/", "test:e2e:web": "cross-env TARGET=web NODE_ENV=development playwright test --config=playwright.config.ts --project=\"Google Chrome\" --grep=@web", - "test:playwright:electron": "playwright test --config=playwright.electron.config.ts --grep-invert=@snapshot", - "test:playwright:electron:local": "npm run tronb:vite:dev && playwright test --config=playwright.electron.config.ts --grep-invert=@snapshot --grep-invert=\"$(curl --silent https://test-analysis-bot.hawk-dinosaur.ts.net/projects/KittyCAD/modeling-app/tests/disabled/regex)\"", - "test:playwright:electron:local-engine": "npm run tronb:vite:dev && playwright test --config=playwright.electron.config.ts --grep-invert='@snapshot|@skipLocalEngine' --grep-invert=\"$(curl --silent https://test-analysis-bot.hawk-dinosaur.ts.net/projects/KittyCAD/modeling-app/tests/disabled/regex)\"", + "test:e2e:desktop": "cross-env TARGET=desktop playwright test --config=playwright.electron.config.ts --grep-invert=@snapshot", + "test:e2e:desktop:local": "cross-env TARGET=desktop npm run tronb:vite:dev && playwright test --config=playwright.electron.config.ts --grep-invert=@snapshot --grep-invert=\"$(curl --silent https://test-analysis-bot.hawk-dinosaur.ts.net/projects/KittyCAD/modeling-app/tests/disabled/regex)\"", + "test:e2e:desktop:local-engine": "cross-env TARGET=desktop npm run tronb:vite:dev && playwright test --config=playwright.electron.config.ts --grep-invert='@snapshot|@skipLocalEngine' --grep-invert=\"$(curl --silent https://test-analysis-bot.hawk-dinosaur.ts.net/projects/KittyCAD/modeling-app/tests/disabled/regex)\"", "test:unit:local": "npm run simpleserver:bg && npm run test:unit; kill-port 3000" }, "browserslist": { diff --git a/public/announce_release.py b/public/announce_release.py index e09975992..e52c2090a 100644 --- a/public/announce_release.py +++ b/public/announce_release.py @@ -27,7 +27,7 @@ if len(modified_release_body) > max_length: # Message to send to Discord data = { "content": textwrap.dedent(f''' - **{release_version}** is now available! Check out the latest features and improvements here: + **{release_version}** is now available! Check out the latest features and improvements here: {modified_release_body} '''), diff --git a/public/kcl-samples/README.md b/public/kcl-samples/README.md index b6356b16b..2e2a0eed7 100644 --- a/public/kcl-samples/README.md +++ b/public/kcl-samples/README.md @@ -27,6 +27,8 @@ When you submit a PR to add or modify KCL samples, images will be generated and [![axial-fan](screenshots/axial-fan.png)](axial-fan/main.kcl) #### [ball-bearing](ball-bearing/main.kcl) ([screenshot](screenshots/ball-bearing.png)) [![ball-bearing](screenshots/ball-bearing.png)](ball-bearing/main.kcl) +#### [ball-joint-rod-end](ball-joint-rod-end/main.kcl) ([screenshot](screenshots/ball-joint-rod-end.png)) +[![ball-joint-rod-end](screenshots/ball-joint-rod-end.png)](ball-joint-rod-end/main.kcl) #### [bench](bench/main.kcl) ([screenshot](screenshots/bench.png)) [![bench](screenshots/bench.png)](bench/main.kcl) #### [bone-plate](bone-plate/main.kcl) ([screenshot](screenshots/bone-plate.png)) diff --git a/public/kcl-samples/ball-joint-rod-end/main.kcl b/public/kcl-samples/ball-joint-rod-end/main.kcl new file mode 100644 index 000000000..78ede6bb2 --- /dev/null +++ b/public/kcl-samples/ball-joint-rod-end/main.kcl @@ -0,0 +1,105 @@ +// ball joint rod end +// A ball joint rod end is a mechanical linkage component that consists of a spherical ball housed within a socket, connected to a threaded rod, allowing rotational movement in multiple directions while providing a secure connection point between two parts of a mechanical system. Commonly used in steering systems and suspension components. + +// Set Units +@settings(defaultLengthUnit = in, kclVersion = 1.0) + +// variables +ballBoltLength = 6 +ballRadius = 8 +sketchStartAngle = asin(ballBoltLength / ballRadius) +housingThicknessHalf = 4.5 +housingR1 = 11 +housingR2 = 8 +tolerance = 0.1 +shaftR = 8 +distanceBetweenEyeAndShaftEnd = 36 +radiusToFlat = 12 +flatsWidth = 14 +tapperInAng = 45 +holeDForM8Tap = 6.8 +holdDepth = 18 + +// calculated variables +retainingLoopSketchAngle1 = asin(housingThicknessHalf / housingR1) +retainingLoopSketchAngle2 = asin(housingThicknessHalf / housingR2) +pointOnRingPolar = polar(angle = retainingLoopSketchAngle2 + 90, length = housingR2 + tolerance) +polarY = pointOnRingPolar[1] + +intersectPoint = sqrt(pow(housingR1, exp = 2) - pow(shaftR, exp = 2)) + +// start modeling section + +// start with inner ball +ballSketch = startSketchOn(YZ) +ballProfile = startProfile(ballSketch, at = polar(angle = sketchStartAngle + 90, length = ballRadius)) + |> arc(angleStart = sketchStartAngle + 90, angleEnd = 90 - sketchStartAngle, radius = ballRadius) + |> yLine(endAbsolute = 4) + |> xLine(endAbsolute = -ballBoltLength) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +ballRevolve = revolve(ballProfile, angle = 360, axis = X) + |> appearance(%, color = "#519afb") + +// next the retaining loop that keep the ball in place +retainingLoopSketch = startSketchOn(YZ) +retainingLoopProfile = startProfile(retainingLoopSketch, at = polar(angle = retainingLoopSketchAngle1 + 90, length = housingR1)) + |> arc(angleStart = retainingLoopSketchAngle1 + 90, angleEnd = 90 - retainingLoopSketchAngle1, radius = housingR1) + |> yLine(endAbsolute = polarY) + |> arc(angleStart = -retainingLoopSketchAngle2 + 90, angleEnd = 90 + retainingLoopSketchAngle2, radius = housingR2) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +retainingLoopRevolve = revolve(retainingLoopProfile, angle = 360, axis = X) + +intersectPoint2 = polar(angle = -5, length = housingR1 - 0.08) + +// the shaft is modeled in two parts, and intersected together +// starting with a revolve +threadedShaftBodyRevolveSketch = startSketchOn(XZ) +threadedShaftBodyRevolveProfile = startProfile(threadedShaftBodyRevolveSketch, at = [0, -distanceBetweenEyeAndShaftEnd]) + |> xLine(length = shaftR - 0.07, tag = $seg05) // 0.07 dither to make CSG work + |> yLine(endAbsolute = -intersectPoint, tag = $kink) + |> arc(interiorAbsolute = intersectPoint2, endAbsolute = [housingR1 - 0.08, 0]) + // |> line(endAbsolute = [housingR1, 0]) + |> xLine(endAbsolute = 0) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +threadedShaftBodyRevolve = revolve(threadedShaftBodyRevolveProfile, angle = 360, axis = Y) + +// second part of the shalft is a extrude that will add the flats and the filleted taper to get to the retaining ring width +threadedShaftBodySketch = startSketchOn(-YZ) +threadedShaftBodyProfile = startProfile(threadedShaftBodySketch, at = [0, -distanceBetweenEyeAndShaftEnd - 1]) + |> xLine(length = flatsWidth / 2) + |> yLine(endAbsolute = -intersectPoint - 2.5 - 0.11, tag = $longflats) + |> angledLine(tag = $seg01, angle = tapperInAng + 90, endAbsoluteX = housingThicknessHalf - 0.1) + |> yLine(endAbsolute = 0, tag = $seg02) + |> xLine(endAbsolute = -housingThicknessHalf + 0.15) + |> yLine(length = -segLen(seg02), tag = $seg03) + |> angledLine(angle = tapperInAng, endAbsoluteX = -flatsWidth / 2, tag = $seg04) + |> yLine(length = -segLen(longflats)) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) + |> close() +threadedShaftBodyFlats = extrude(threadedShaftBodyProfile, length = 40) + |> translate(x = 20, y = 0, z = 0) + |> fillet(radius = 1.9, tags = [getCommonEdge(faces = [seg01, seg02])]) + |> fillet(radius = 1.5, tags = [getCommonEdge(faces = [seg03, seg04])]) + +solid001 = intersect([ + threadedShaftBodyRevolve, + threadedShaftBodyFlats +]) +sketch005 = startSketchOn(-XZ) +profile005 = circle(sketch005, center = [0, 0], radius = ballRadius - 2) +extrude002 = extrude(profile005, length = 100) + |> translate(x = 0, y = -50, z = 0) + +solid002 = subtract([solid001], tools = [extrude002]) +// Join the thread body with the retaining loop for the balljoint +solid003 = union([solid002, retainingLoopRevolve]) +plane001 = offsetPlane(XY, offset = -distanceBetweenEyeAndShaftEnd - 1) +sketch001 = startSketchOn(plane001) +profile001 = circle(sketch001, center = [0, 0], radius = holeDForM8Tap / 2) +threadedRodHole = extrude(profile001, length = holdDepth + 1) + +// cut hole for threaded rod +solid004 = subtract([solid003], tools = [threadedRodHole]) diff --git a/public/kcl-samples/bone-plate/main.kcl b/public/kcl-samples/bone-plate/main.kcl index fb49c38d5..92d1d6ff3 100644 --- a/public/kcl-samples/bone-plate/main.kcl +++ b/public/kcl-samples/bone-plate/main.kcl @@ -29,27 +29,27 @@ plateRevolve = startSketchOn(YZ) |> close() |> revolve(axis = Y, angle = 65, symmetric = true) -// Create a hole sketch with the size and location of each bolt hole -holeSketch = startSketchOn(XZ) -hole01 = circle(holeSketch, center = [0, 12.25], radius = boltSize / 2) - |> extrude(length = -100) -hole02 = circle(holeSketch, center = [0, 29.5], radius = boltSize / 2) - |> extrude(length = -100) -hole03 = circle(holeSketch, center = [0, 46.25], radius = boltSize / 2) - |> extrude(length = -100) -hole04 = circle(holeSketch, center = [0, 77], radius = boltSize / 2) - |> extrude(length = -100) -hole05 = circle(holeSketch, center = [0, 100], radius = boltSize / 2) - |> extrude(length = -100) -hole06 = circle(holeSketch, center = [0, 130], radius = boltSize / 2) - |> extrude(length = -100) -hole07 = circle(holeSketch, center = [-20, 130], radius = boltSize / 2) - |> extrude(length = -100) -hole08 = circle(holeSketch, center = [20, 130], radius = boltSize / 2) - |> extrude(length = -100) +// Define a function to create and extrude holes +fn holeFn(@center) { + return startSketchOn(XZ) + |> circle(center = center, diameter = boltSize) + |> extrude(length = -100) +} -// Cut each guiding clearance hole from the bone plate -solid001 = subtract([plateRevolve], tools = union([hole01, hole02])) -solid002 = subtract([solid001], tools = union([hole03, hole04])) -solid003 = subtract([solid002], tools = union([hole05, hole06])) -solid004 = subtract([solid003], tools = union([hole07, hole08])) +// Create a hole sketch with the size and location of each bolt hole +holeCenters = [ + [0, 12.25], + [0, 29.5], + [0, 46.25], + [0, 77], + [0, 100], + [0, 130], + [-20, 130], + [20, 130] +] + +// Use map to apply the hole creation function to the list of center coordinates +holes = map(holeCenters, f = holeFn) + +// Cut each guiding clearance hole from the bone plate using a single subtract operation +solid = subtract([plateRevolve], tools = holes) diff --git a/public/kcl-samples/manifest.json b/public/kcl-samples/manifest.json index 080ee61a4..e1aaaeb4d 100644 --- a/public/kcl-samples/manifest.json +++ b/public/kcl-samples/manifest.json @@ -23,6 +23,16 @@ "main.kcl" ] }, + { + "file": "main.kcl", + "pathFromProjectDirectoryToFirstFile": "ball-joint-rod-end/main.kcl", + "multipleFiles": false, + "title": "ball joint rod end", + "description": "A ball joint rod end is a mechanical linkage component that consists of a spherical ball housed within a socket, connected to a threaded rod, allowing rotational movement in multiple directions while providing a secure connection point between two parts of a mechanical system. Commonly used in steering systems and suspension components.", + "files": [ + "main.kcl" + ] + }, { "file": "main.kcl", "pathFromProjectDirectoryToFirstFile": "bench/main.kcl", diff --git a/public/kcl-samples/mounting-plate/main.kcl b/public/kcl-samples/mounting-plate/main.kcl index 72db52d53..426c5641d 100644 --- a/public/kcl-samples/mounting-plate/main.kcl +++ b/public/kcl-samples/mounting-plate/main.kcl @@ -11,24 +11,20 @@ filletRadius = 0.5 plateThickness = .5 centerHoleDiameter = 2 -// Create a function that defines the body width and length of the mounting plate. Tag the corners so they can be passed through the fillet function. -fn rectShape(pos, w, l) { - rr = startSketchOn(XY) - |> startProfile(at = [pos[0] - (w / 2), pos[1] - (l / 2)]) - |> line(endAbsolute = [pos[0] + w / 2, pos[1] - (l / 2)], tag = $edge1) - |> line(endAbsolute = [pos[0] + w / 2, pos[1] + l / 2], tag = $edge2) - |> line(endAbsolute = [pos[0] - (w / 2), pos[1] + l / 2], tag = $edge3) - |> close(tag = $edge4) - return rr -} - // Define the hole radius and x, y location constants holeRadius = .25 holeIndex = .75 +sketch001 = startSketchOn(XY) +rectShape = startProfile(sketch001, at = [-plateWidth / 2, plateLength / 2]) + |> angledLine(angle = 0, length = plateWidth, tag = $basePlateEdge1) + |> angledLine(angle = segAng(basePlateEdge1) - 90, length = plateLength, tag = $basePlateEdge2) + |> angledLine(angle = segAng(basePlateEdge1), length = -segLen(basePlateEdge1), tag = $basePlateEdge3) + |> line(endAbsolute = [profileStartX(%), profileStartY(%)], tag = $basePlateEdge4) + |> close() + // Create the mounting plate extrusion, holes, and fillets -rs = rectShape(pos = [0, 0], w = plateWidth, l = plateLength) -part = rs +part = rectShape |> subtract2d(tool = circle( center = [ -plateWidth / 2 + holeIndex, @@ -62,9 +58,9 @@ part = rs |> fillet( radius = filletRadius, tags = [ - getPreviousAdjacentEdge(rs.tags.edge1), - getPreviousAdjacentEdge(rs.tags.edge2), - getPreviousAdjacentEdge(rs.tags.edge3), - getPreviousAdjacentEdge(rs.tags.edge4) + getCommonEdge(faces = [basePlateEdge3, basePlateEdge2]), + getCommonEdge(faces = [basePlateEdge4, basePlateEdge3]), + getCommonEdge(faces = [basePlateEdge4, basePlateEdge1]), + getCommonEdge(faces = [basePlateEdge2, basePlateEdge1]) ], ) diff --git a/public/kcl-samples/screenshots/ball-joint-rod-end.png b/public/kcl-samples/screenshots/ball-joint-rod-end.png new file mode 100644 index 000000000..467dcae02 Binary files /dev/null and b/public/kcl-samples/screenshots/ball-joint-rod-end.png differ diff --git a/public/kcl-samples/screenshots/mounting-plate.png b/public/kcl-samples/screenshots/mounting-plate.png index 316ac5373..c20858030 100644 Binary files a/public/kcl-samples/screenshots/mounting-plate.png and b/public/kcl-samples/screenshots/mounting-plate.png differ diff --git a/rust/Cargo.lock b/rust/Cargo.lock index 1c9e192f6..014c3d317 100644 --- a/rust/Cargo.lock +++ b/rust/Cargo.lock @@ -2,16 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "Inflector" -version = "0.11.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe438c63458706e03479442743baae6c88256498e6431708f6dfc520a26515d3" -dependencies = [ - "lazy_static", - "regex", -] - [[package]] name = "addr2line" version = "0.24.2" @@ -627,26 +617,22 @@ dependencies = [ [[package]] name = "criterion" -version = "0.5.1" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2b12d017a929603d80db1831cd3a24082f8137ce19c69e6447f54f5fc8d692f" +checksum = "3bf7af66b0989381bd0be551bd7cc91912a655a58c6918420c9527b1fd8b4679" dependencies = [ "anes", "cast", "ciborium", "clap", "criterion-plot", - "futures", - "is-terminal", - "itertools 0.10.5", + "itertools 0.13.0", "num-traits 0.2.19", - "once_cell", "oorandom", "plotters", "rayon", "regex", "serde", - "serde_derive", "serde_json", "tinytemplate", "tokio", @@ -715,9 +701,9 @@ dependencies = [ [[package]] name = "csscolorparser" -version = "0.7.0" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46f9a16a848a7fb95dd47ce387ac1ee9a6df879ba784b815537fcd388a1a8288" +checksum = "5fda6aace1fbef3aa217b27f4c8d7d071ef2a70a5ca51050b1f17d40299d3f16" dependencies = [ "phf", ] @@ -1311,15 +1297,6 @@ dependencies = [ "digest", ] -[[package]] -name = "home" -version = "0.5.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "589533453244b0995c858700322199b2becb13b627df2851f64a2775d024abcf" -dependencies = [ - "windows-sys 0.59.0", -] - [[package]] name = "http" version = "0.2.12" @@ -1815,7 +1792,7 @@ dependencies = [ [[package]] name = "kcl-bumper" -version = "0.1.77" +version = "0.1.79" dependencies = [ "anyhow", "clap", @@ -1826,26 +1803,16 @@ dependencies = [ [[package]] name = "kcl-derive-docs" -version = "0.1.77" +version = "0.1.79" dependencies = [ - "Inflector", - "anyhow", - "convert_case", - "expectorate", - "once_cell", - "pretty_assertions", "proc-macro2", "quote", - "regex", - "rustfmt-wrapper", - "serde", - "serde_tokenstream", "syn 2.0.100", ] [[package]] name = "kcl-directory-test-macro" -version = "0.1.77" +version = "0.1.79" dependencies = [ "convert_case", "proc-macro2", @@ -1855,7 +1822,7 @@ dependencies = [ [[package]] name = "kcl-language-server" -version = "0.2.77" +version = "0.2.79" dependencies = [ "anyhow", "clap", @@ -1876,7 +1843,7 @@ dependencies = [ [[package]] name = "kcl-language-server-release" -version = "0.1.77" +version = "0.1.79" dependencies = [ "anyhow", "clap", @@ -1896,7 +1863,7 @@ dependencies = [ [[package]] name = "kcl-lib" -version = "0.2.77" +version = "0.2.79" dependencies = [ "anyhow", "approx 0.5.1", @@ -1973,7 +1940,7 @@ dependencies = [ [[package]] name = "kcl-python-bindings" -version = "0.3.77" +version = "0.3.79" dependencies = [ "anyhow", "kcl-lib", @@ -1988,7 +1955,7 @@ dependencies = [ [[package]] name = "kcl-test-server" -version = "0.1.77" +version = "0.1.79" dependencies = [ "anyhow", "hyper 0.14.32", @@ -2001,7 +1968,7 @@ dependencies = [ [[package]] name = "kcl-to-core" -version = "0.1.77" +version = "0.1.79" dependencies = [ "anyhow", "async-trait", @@ -2015,7 +1982,7 @@ dependencies = [ [[package]] name = "kcl-wasm-lib" -version = "0.1.77" +version = "0.1.79" dependencies = [ "anyhow", "bson", @@ -3348,19 +3315,6 @@ version = "2.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "357703d41365b4b27c590e3ed91eabb1b663f07c4c084095e60cbed4362dff0d" -[[package]] -name = "rustfmt-wrapper" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1adc9dfed5cc999077978cc7163b9282c5751c8d39827c4ea8c8c220ca5a440" -dependencies = [ - "serde", - "tempfile", - "thiserror 1.0.69", - "toml", - "toolchain_find", -] - [[package]] name = "rustix" version = "1.0.2" @@ -3607,18 +3561,6 @@ dependencies = [ "serde", ] -[[package]] -name = "serde_tokenstream" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64060d864397305347a78851c51588fd283767e7e7589829e8121d65512340f1" -dependencies = [ - "proc-macro2", - "quote", - "serde", - "syn 2.0.100", -] - [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4194,9 +4136,9 @@ dependencies = [ [[package]] name = "tokio-tungstenite" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edc5f74e248dc973e0dbb7b74c7e0d6fcc301c694ff50049504004ef4d0cdcd9" +checksum = "7a9daff607c6d2bf6c16fd681ccb7eecc83e4e2cdc1ca067ffaadfca5de7f084" dependencies = [ "futures-util", "log", @@ -4255,19 +4197,6 @@ dependencies = [ "winnow", ] -[[package]] -name = "toolchain_find" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebc8c9a7f0a2966e1acdaf0461023d0b01471eeead645370cf4c3f5cff153f2a" -dependencies = [ - "home", - "once_cell", - "regex", - "semver", - "walkdir", -] - [[package]] name = "tower" version = "0.4.13" @@ -4450,21 +4379,20 @@ dependencies = [ [[package]] name = "tungstenite" -version = "0.24.0" +version = "0.26.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18e5b8366ee7a95b16d32197d0b2604b43a0be89dc5fac9f8e96ccafbaedda8a" +checksum = "4793cb5e56680ecbb1d843515b23b6de9a75eb04b66643e256a396d43be33c13" dependencies = [ - "byteorder", "bytes", "data-encoding", "http 1.3.1", "httparse", "log", - "rand 0.8.5", + "rand 0.9.0", "rustls", "rustls-pki-types", "sha1", - "thiserror 1.0.69", + "thiserror 2.0.12", "utf-8", ] diff --git a/rust/kcl-bumper/Cargo.toml b/rust/kcl-bumper/Cargo.toml index 08bc5a6ee..2334d2aab 100644 --- a/rust/kcl-bumper/Cargo.toml +++ b/rust/kcl-bumper/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-bumper" -version = "0.1.77" +version = "0.1.79" edition = "2021" repository = "https://github.com/KittyCAD/modeling-api" rust-version = "1.76" diff --git a/rust/kcl-derive-docs/Cargo.toml b/rust/kcl-derive-docs/Cargo.toml index 5fbd0b321..242a638fc 100644 --- a/rust/kcl-derive-docs/Cargo.toml +++ b/rust/kcl-derive-docs/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-derive-docs" description = "A tool for generating documentation from Rust derive macros" -version = "0.1.77" +version = "0.1.79" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" @@ -12,21 +12,9 @@ proc-macro = true bench = false [dependencies] -Inflector = "0.11.4" -convert_case = "0.8.0" -once_cell = "1.21.3" proc-macro2 = "1" quote = "1" -regex = "1.11" -serde = { workspace = true } -serde_tokenstream = "0.2" syn = { version = "2.0.96", features = ["full"] } -[dev-dependencies] -anyhow = { workspace = true } -expectorate = "1.1.0" -pretty_assertions = "1.4.1" -rustfmt-wrapper = "0.2.1" - [lints] workspace = true diff --git a/rust/kcl-derive-docs/src/example_tests.rs b/rust/kcl-derive-docs/src/example_tests.rs index efffd146b..cb3549c50 100644 --- a/rust/kcl-derive-docs/src/example_tests.rs +++ b/rust/kcl-derive-docs/src/example_tests.rs @@ -113,6 +113,71 @@ pub const TEST_NAMES: &[&str] = &[ "std-sketch-revolve-7", "std-sketch-revolve-8", "std-sketch-revolve-9", + "std-sketch-getCommonEdge-0", + "std-sketch-getOppositeEdge-0", + "std-sketch-getPreviousAdjacentEdge-0", + "std-sketch-getNextAdjacentEdge-0", + "std-sketch-extrude-0", + "std-sketch-extrude-1", + "std-sketch-extrude-2", + "std-sketch-extrude-3", + "std-sketch-polygon-0", + "std-sketch-polygon-1", + "std-sketch-sweep-0", + "std-sketch-sweep-1", + "std-sketch-sweep-2", + "std-sketch-sweep-3", + "std-sketch-loft-0", + "std-sketch-loft-1", + "std-sketch-loft-2", + "std-sketch-patternLinear2d-0", + "std-sketch-patternLinear2d-1", + "std-sketch-patternCircular2d-0", + "std-sketch-circleThreePoint-0", + "std-sketch-segStart-0", + "std-sketch-segStartX-0", + "std-sketch-segStartY-0", + "std-sketch-segEnd-0", + "std-sketch-segEndX-0", + "std-sketch-segEndY-0", + "std-sketch-lastSegX-0", + "std-sketch-lastSegY-0", + "std-sketch-segAng-0", + "std-sketch-segLen-0", + "std-sketch-tangentToEnd-0", + "std-sketch-tangentToEnd-1", + "std-sketch-tangentToEnd-2", + "std-sketch-tangentToEnd-3", + "std-sketch-tangentToEnd-4", + "std-sketch-profileStart-0", + "std-sketch-profileStartX-0", + "std-sketch-profileStartY-0", + "std-sketch-startProfile-0", + "std-sketch-startProfile-1", + "std-sketch-startProfile-2", + "std-sketch-startSketchOn-0", + "std-sketch-startSketchOn-1", + "std-sketch-startSketchOn-2", + "std-sketch-startSketchOn-3", + "std-sketch-startSketchOn-4", + "std-sketch-startSketchOn-5", + "std-sketch-angledLineThatIntersects-0", + "std-sketch-angledLine-0", + "std-sketch-arc-0", + "std-sketch-arc-1", + "std-sketch-bezierCurve-0", + "std-sketch-bezierCurve-1", + "std-sketch-close-0", + "std-sketch-close-1", + "std-sketch-involuteCircular-0", + "std-sketch-line-0", + "std-sketch-subtract2d-0", + "std-sketch-subtract2d-1", + "std-sketch-tangentialArc-0", + "std-sketch-tangentialArc-1", + "std-sketch-tangentialArc-2", + "std-sketch-xLine-0", + "std-sketch-yLine-0", "std-solid-appearance-0", "std-solid-appearance-1", "std-solid-appearance-2", @@ -161,6 +226,21 @@ pub const TEST_NAMES: &[&str] = &[ "std-transform-mirror2d-2", "std-transform-mirror2d-3", "std-transform-mirror2d-4", + "std-transform-translate-0", + "std-transform-translate-1", + "std-transform-translate-2", + "std-transform-translate-3", + "std-transform-translate-4", + "std-transform-rotate-0", + "std-transform-rotate-1", + "std-transform-rotate-2", + "std-transform-rotate-3", + "std-transform-rotate-4", + "std-transform-rotate-5", + "std-transform-rotate-6", + "std-transform-scale-0", + "std-transform-scale-1", + "std-transform-scale-2", "std-units-toDegrees-0", "std-units-toRadians-0", ]; diff --git a/rust/kcl-derive-docs/src/lib.rs b/rust/kcl-derive-docs/src/lib.rs index 3fbaca621..01b45f9e1 100644 --- a/rust/kcl-derive-docs/src/lib.rs +++ b/rust/kcl-derive-docs/src/lib.rs @@ -3,29 +3,6 @@ #![allow(clippy::style)] mod example_tests; -#[cfg(test)] -mod tests; -mod unbox; - -use std::collections::HashMap; - -use convert_case::Casing; -use inflector::{cases::camelcase::to_camel_case, Inflector}; -use once_cell::sync::Lazy; -use quote::{format_ident, quote, quote_spanned, ToTokens}; -use regex::Regex; -use serde::Deserialize; -use serde_tokenstream::{from_tokenstream, Error}; -use syn::{ - parse::{Parse, ParseStream}, - Attribute, Signature, Visibility, -}; -use unbox::unbox; - -#[proc_macro_attribute] -pub fn stdlib(attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream { - do_output(do_stdlib(attr.into(), item.into())) -} #[proc_macro_attribute] pub fn for_each_example_test(_attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream { @@ -36,845 +13,3 @@ pub fn for_each_example_test(_attr: proc_macro::TokenStream, item: proc_macro::T pub fn for_all_example_test(_attr: proc_macro::TokenStream, item: proc_macro::TokenStream) -> proc_macro::TokenStream { example_tests::do_for_all_example_test(item.into()).into() } - -/// Describes an argument of a stdlib function. -#[derive(Deserialize, Debug)] -struct ArgMetadata { - /// Docs for the argument. - docs: String, - - /// If this argument is optional, it should still be included in completion snippets. - /// Does not do anything if the argument is already required. - #[serde(default)] - include_in_snippet: bool, - - /// The snippet should suggest this value for the arg. - #[serde(default)] - snippet_value: Option, - - /// The snippet should suggest this value for the arg. - #[serde(default)] - snippet_value_array: Option>, -} - -#[derive(Deserialize, Debug)] -struct StdlibMetadata { - /// The name of the function in the API. - name: String, - - /// Tags for the function. - #[serde(default)] - tags: Vec, - - /// Whether the function is unpublished. - /// Then docs will not be generated. - #[serde(default)] - unpublished: bool, - - /// Whether the function is deprecated. - /// Then specific docs detailing that this is deprecated will be generated. - #[serde(default)] - deprecated: bool, - - /// Whether the function is displayed in the feature tree. - /// If true, calls to the function will be available for display. - /// If false, calls to the function will never be displayed. - #[serde(default)] - feature_tree_operation: bool, - - /// If true, the first argument is unlabeled. - /// If false, all arguments require labels. - #[serde(default)] - unlabeled_first: bool, - - /// Key = argument name, value = argument doc. - #[serde(default)] - args: HashMap, -} - -fn do_stdlib( - attr: proc_macro2::TokenStream, - item: proc_macro2::TokenStream, -) -> Result<(proc_macro2::TokenStream, Vec), Error> { - let metadata = from_tokenstream(&attr)?; - do_stdlib_inner(metadata, attr, item) -} - -fn do_output(res: Result<(proc_macro2::TokenStream, Vec), Error>) -> proc_macro::TokenStream { - match res { - Err(err) => err.to_compile_error().into(), - Ok((stdlib_docs, errors)) => { - let compiler_errors = errors.iter().map(|err| err.to_compile_error()); - - let output = quote! { - #stdlib_docs - #( #compiler_errors )* - }; - - output.into() - } - } -} - -fn do_stdlib_inner( - metadata: StdlibMetadata, - _attr: proc_macro2::TokenStream, - item: proc_macro2::TokenStream, -) -> Result<(proc_macro2::TokenStream, Vec), Error> { - let ast: ItemFnForSignature = syn::parse2(item.clone())?; - - let mut errors = Vec::new(); - - if ast.sig.constness.is_some() { - errors.push(Error::new_spanned( - &ast.sig.constness, - "stdlib functions may not be const functions", - )); - } - - if ast.sig.unsafety.is_some() { - errors.push(Error::new_spanned( - &ast.sig.unsafety, - "stdlib functions may not be unsafe", - )); - } - - if ast.sig.abi.is_some() { - errors.push(Error::new_spanned( - &ast.sig.abi, - "stdlib functions may not use an alternate ABI", - )); - } - - if !ast.sig.generics.params.is_empty() { - if ast.sig.generics.params.iter().any(|generic_type| match generic_type { - syn::GenericParam::Lifetime(_) => false, - syn::GenericParam::Type(_) => true, - syn::GenericParam::Const(_) => true, - }) { - errors.push(Error::new_spanned( - &ast.sig.generics, - "Stdlib functions may not be generic over types or constants, only lifetimes.", - )); - } - } - - if ast.sig.variadic.is_some() { - errors.push(Error::new_spanned(&ast.sig.variadic, "no language C here")); - } - - let name = metadata.name; - - // Fail if the name is not camel case. - // Remove some known suffix exceptions first. - let name_cleaned = name.strip_suffix("2d").unwrap_or(name.as_str()); - let name_cleaned = name.strip_suffix("3d").unwrap_or(name_cleaned); - if !name_cleaned.is_camel_case() { - errors.push(Error::new_spanned( - &ast.sig.ident, - format!("stdlib function names must be in camel case: `{}`", name), - )); - } - - let name_ident = format_ident!("{}", name.to_case(convert_case::Case::UpperCamel)); - let name_str = name.to_string(); - - let fn_name = &ast.sig.ident; - let fn_name_str = fn_name.to_string().replace("inner_", ""); - let fn_name_ident = format_ident!("{}", fn_name_str); - let boxed_fn_name_ident = format_ident!("boxed_{}", fn_name_str); - let _visibility = &ast.vis; - - let doc_info = extract_doc_from_attrs(&ast.attrs); - let comment_text = { - let mut buf = String::new(); - buf.push_str("Std lib function: "); - buf.push_str(&name_str); - if let Some(s) = &doc_info.summary { - buf.push_str("\n"); - buf.push_str(&s); - } - if let Some(s) = &doc_info.description { - buf.push_str("\n"); - buf.push_str(&s); - } - buf - }; - let description_doc_comment = quote! { - #[doc = #comment_text] - }; - - let summary = if let Some(summary) = doc_info.summary { - quote! { #summary } - } else { - quote! { "" } - }; - let description = if let Some(description) = doc_info.description { - quote! { #description } - } else { - quote! { "" } - }; - - if doc_info.code_blocks.is_empty() { - errors.push(Error::new_spanned( - &ast.sig, - "stdlib functions must have at least one code block", - )); - } - - // Make sure the function name is in all the code blocks. - for code_block in doc_info.code_blocks.iter() { - if !code_block.0.contains(&name) { - errors.push(Error::new_spanned( - &ast.sig, - format!( - "stdlib functions must have the function name `{}` in the code block", - name - ), - )); - } - } - - let test_code_blocks = doc_info - .code_blocks - .iter() - .enumerate() - .map(|(index, (code_block, norun))| { - if !norun { - generate_code_block_test(&fn_name_str, code_block, index) - } else { - quote! {} - } - }) - .collect::>(); - - let (cb, norun): (Vec<_>, Vec<_>) = doc_info.code_blocks.into_iter().unzip(); - let code_blocks = quote! { - let code_blocks = vec![#(#cb),*]; - let norun = vec![#(#norun),*]; - code_blocks.iter().zip(norun).map(|(cb, norun)| { - let program = crate::Program::parse_no_errs(cb).unwrap(); - - let mut options: crate::parsing::ast::types::FormatOptions = Default::default(); - options.insert_final_newline = false; - (program.ast.recast(&options, 0), norun) - }).collect::>() - }; - - let tags = metadata - .tags - .iter() - .map(|tag| { - quote! { #tag.to_string() } - }) - .collect::>(); - - let deprecated = if metadata.deprecated { - quote! { true } - } else { - quote! { false } - }; - - let unpublished = if metadata.unpublished { - quote! { true } - } else { - quote! { false } - }; - - let feature_tree_operation = if metadata.feature_tree_operation { - quote! { true } - } else { - quote! { false } - }; - - let docs_crate = get_crate(None); - - // When the user attaches this proc macro to a function with the wrong type - // signature, the resulting errors can be deeply inscrutable. To attempt to - // make failures easier to understand, we inject code that asserts the types - // of the various parameters. We do this by calling dummy functions that - // require a type that satisfies SharedExtractor or ExclusiveExtractor. - let mut arg_types = Vec::new(); - for (i, arg) in ast.sig.inputs.iter().enumerate() { - // Get the name of the argument. - let arg_name = match arg { - syn::FnArg::Receiver(pat) => { - let span = pat.self_token.span.unwrap(); - span.source_text().unwrap().to_string() - } - syn::FnArg::Typed(pat) => match &*pat.pat { - syn::Pat::Ident(ident) => ident.ident.to_string(), - _ => { - errors.push(Error::new_spanned( - &pat.pat, - "stdlib functions may not use destructuring patterns", - )); - continue; - } - }, - } - .trim_start_matches('_') - .to_string(); - // These aren't really KCL args, they're just state that each stdlib function's impl needs. - if arg_name == "exec_state" || arg_name == "args" { - continue; - } - - let ty = match arg { - syn::FnArg::Receiver(pat) => pat.ty.as_ref().into_token_stream(), - syn::FnArg::Typed(pat) => pat.ty.as_ref().into_token_stream(), - }; - - let (ty_string, ty_ident) = clean_ty_string(ty.to_string().as_str()); - - let ty_string = rust_type_to_openapi_type(&ty_string); - let required = !ty_ident.to_string().starts_with("Option <"); - let Some(arg_meta) = metadata.args.get(&arg_name) else { - errors.push(Error::new_spanned(arg, format!("arg {arg_name} not found"))); - continue; - }; - let description = arg_meta.docs.clone(); - let include_in_snippet = required || arg_meta.include_in_snippet; - let snippet_value = arg_meta.snippet_value.clone(); - let snippet_value_array = arg_meta.snippet_value_array.clone(); - if snippet_value.is_some() && snippet_value_array.is_some() { - errors.push(Error::new_spanned(arg, format!("arg {arg_name} has set both snippet_value and snippet_value array, but at most one of these may be set. Please delete one of them."))); - } - let label_required = !(i == 0 && metadata.unlabeled_first); - let camel_case_arg_name = to_camel_case(&arg_name); - if ty_string != "ExecState" && ty_string != "Args" { - let schema = quote! { - generator.root_schema_for::<#ty_ident>() - }; - let q0 = quote! { - name: #camel_case_arg_name.to_string(), - type_: #ty_string.to_string(), - schema: #schema, - required: #required, - label_required: #label_required, - description: #description.to_string(), - include_in_snippet: #include_in_snippet, - }; - let q1 = if let Some(snippet_value) = snippet_value { - quote! { - snippet_value: Some(#snippet_value.to_owned()), - } - } else { - quote! { - snippet_value: None, - } - }; - let q2 = if let Some(snippet_value_array) = snippet_value_array { - quote! { - snippet_value_array: Some(vec![ - #(#snippet_value_array.to_owned()),* - ]), - } - } else { - quote! { - snippet_value_array: None, - } - }; - arg_types.push(quote! { - #docs_crate::StdLibFnArg { - #q0 - #q1 - #q2 - } - }); - } - } - - let return_type_inner = match &ast.sig.output { - syn::ReturnType::Default => quote! { () }, - syn::ReturnType::Type(_, ty) => { - // Get the inside of the result. - match &**ty { - syn::Type::Path(syn::TypePath { path, .. }) => { - let path = &path.segments; - if path.len() == 1 { - let seg = &path[0]; - if seg.ident == "Result" { - if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { - args, - .. - }) = &seg.arguments - { - if args.len() == 2 || args.len() == 1 { - let mut args = args.iter(); - let ok = args.next().unwrap(); - if let syn::GenericArgument::Type(ty) = ok { - let ty = unbox(ty.clone()); - quote! { #ty } - } else { - quote! { () } - } - } else { - quote! { () } - } - } else { - quote! { () } - } - } else { - let ty = unbox(*ty.clone()); - quote! { #ty } - } - } else { - quote! { () } - } - } - _ => { - quote! { () } - } - } - } - }; - - let ret_ty_string = return_type_inner.to_string().replace(' ', ""); - let return_type = if !ret_ty_string.is_empty() || ret_ty_string != "()" { - let ret_ty_string = rust_type_to_openapi_type(&ret_ty_string); - quote! { - let schema = generator.root_schema_for::<#return_type_inner>(); - Some(#docs_crate::StdLibFnArg { - name: "".to_string(), - type_: #ret_ty_string.to_string(), - schema, - required: true, - label_required: true, - description: String::new(), - include_in_snippet: true, - snippet_value: None, - snippet_value_array: None, - }) - } - } else { - quote! { - None - } - }; - - // For reasons that are not well understood unused constants that use the - // (default) call_site() Span do not trigger the dead_code lint. Because - // defining but not using an endpoint is likely a programming error, we - // want to be sure to have the compiler flag this. We force this by using - // the span from the name of the function to which this macro was applied. - let span = ast.sig.ident.span(); - let const_struct = quote_spanned! {span=> - pub(crate) const #name_ident: #name_ident = #name_ident {}; - }; - - let test_mod_name = format_ident!("test_examples_{}", fn_name_str); - - // The final TokenStream returned will have a few components that reference - // `#name_ident`, the name of the function to which this macro was applied... - let stream = quote! { - #[cfg(test)] - mod #test_mod_name { - #(#test_code_blocks)* - } - - // ... a struct type called `#name_ident` that has no members - #[allow(non_camel_case_types, missing_docs)] - #description_doc_comment - #[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, schemars::JsonSchema, ts_rs::TS)] - #[ts(export)] - pub(crate) struct #name_ident {} - // ... a constant of type `#name` whose identifier is also #name_ident - #[allow(non_upper_case_globals, missing_docs)] - #description_doc_comment - #const_struct - - fn #boxed_fn_name_ident( - exec_state: &mut crate::execution::ExecState, - args: crate::std::Args, - ) -> std::pin::Pin< - Box> + Send + '_>, - > { - Box::pin(#fn_name_ident(exec_state, args)) - } - - impl #docs_crate::StdLibFn for #name_ident - { - fn name(&self) -> String { - #name_str.to_string() - } - - fn summary(&self) -> String { - #summary.to_string() - } - - fn description(&self) -> String { - #description.to_string() - } - - fn tags(&self) -> Vec { - vec![#(#tags),*] - } - - fn args(&self, inline_subschemas: bool) -> Vec<#docs_crate::StdLibFnArg> { - let mut settings = schemars::gen::SchemaSettings::openapi3(); - // We set this to false so we can recurse them later. - settings.inline_subschemas = inline_subschemas; - let mut generator = schemars::gen::SchemaGenerator::new(settings); - - vec![#(#arg_types),*] - } - - fn return_value(&self, inline_subschemas: bool) -> Option<#docs_crate::StdLibFnArg> { - let mut settings = schemars::gen::SchemaSettings::openapi3(); - // We set this to false so we can recurse them later. - settings.inline_subschemas = inline_subschemas; - let mut generator = schemars::gen::SchemaGenerator::new(settings); - - #return_type - } - - fn unpublished(&self) -> bool { - #unpublished - } - - fn deprecated(&self) -> bool { - #deprecated - } - - fn feature_tree_operation(&self) -> bool { - #feature_tree_operation - } - - fn examples(&self) -> Vec<(String, bool)> { - #code_blocks - } - - fn std_lib_fn(&self) -> crate::std::StdFn { - #boxed_fn_name_ident - } - - fn clone_box(&self) -> Box { - Box::new(self.clone()) - } - } - - #item - }; - - // Prepend the usage message if any errors were detected. - if !errors.is_empty() { - errors.insert(0, Error::new_spanned(&ast.sig, "")); - } - - Ok((stream, errors)) -} - -#[allow(dead_code)] -fn to_compile_errors(errors: Vec) -> proc_macro2::TokenStream { - let compile_errors = errors.iter().map(syn::Error::to_compile_error); - quote!(#(#compile_errors)*) -} - -fn get_crate(var: Option) -> proc_macro2::TokenStream { - if let Some(s) = var { - if let Ok(ts) = syn::parse_str(s.as_str()) { - return ts; - } - } - quote!(crate::docs) -} - -#[derive(Debug)] -struct DocInfo { - pub summary: Option, - pub description: Option, - pub code_blocks: Vec<(String, bool)>, -} - -fn extract_doc_from_attrs(attrs: &[syn::Attribute]) -> DocInfo { - let doc = syn::Ident::new("doc", proc_macro2::Span::call_site()); - let raw_lines = attrs.iter().flat_map(|attr| { - if let syn::Meta::NameValue(nv) = &attr.meta { - if nv.path.is_ident(&doc) { - if let syn::Expr::Lit(syn::ExprLit { - lit: syn::Lit::Str(s), .. - }) = &nv.value - { - return normalize_comment_string(s.value()); - } - } - } - Vec::new() - }); - - // Parse any code blocks from the doc string. - let mut code_blocks: Vec<(String, bool)> = Vec::new(); - let mut code_block: Option<(String, bool)> = None; - let mut parsed_lines = Vec::new(); - for line in raw_lines { - if line.starts_with("```") { - if let Some((inner_code_block, norun)) = code_block { - code_blocks.push((inner_code_block.trim().to_owned(), norun)); - code_block = None; - } else { - let norun = line.contains("kcl,norun") || line.contains("kcl,no_run"); - code_block = Some((String::new(), norun)); - } - - continue; - } - if let Some((code_block, _)) = &mut code_block { - code_block.push_str(&line); - code_block.push('\n'); - } else { - parsed_lines.push(line); - } - } - - if let Some((code_block, norun)) = code_block { - code_blocks.push((code_block.trim().to_string(), norun)); - } - - let mut summary = None; - let mut description: Option = None; - for line in parsed_lines { - if line.is_empty() { - if let Some(desc) = &mut description { - // Handle fully blank comments as newlines we keep. - if !desc.is_empty() && !desc.ends_with('\n') { - if desc.ends_with(' ') { - desc.pop().unwrap(); - } - desc.push_str("\n\n"); - } - } else if summary.is_some() { - description = Some(String::new()); - } - continue; - } - - if let Some(desc) = &mut description { - desc.push_str(&line); - // Default to space-separating comment fragments. - desc.push(' '); - continue; - } - - if summary.is_none() { - summary = Some(String::new()); - } - match &mut summary { - Some(summary) => { - summary.push_str(&line); - // Default to space-separating comment fragments. - summary.push(' '); - } - None => unreachable!(), - } - } - - // Trim the summary and description. - if let Some(s) = &mut summary { - while s.ends_with(' ') || s.ends_with('\n') { - s.pop().unwrap(); - } - - if s.is_empty() { - summary = None; - } - } - - if let Some(d) = &mut description { - while d.ends_with(' ') || d.ends_with('\n') { - d.pop().unwrap(); - } - - if d.is_empty() { - description = None; - } - } - - DocInfo { - summary, - description, - code_blocks, - } -} - -fn normalize_comment_string(s: String) -> Vec { - s.split('\n') - .map(|s| { - // Rust-style comments are intrinsically single-line. - // We only want to trim a single space character from the start of - // a line, and only if it's the first character. - s.strip_prefix(' ').unwrap_or(s).trim_end().to_owned() - }) - .collect() -} - -/// Represent an item without concern for its body which may (or may not) -/// contain syntax errors. -#[derive(Clone)] -struct ItemFnForSignature { - pub attrs: Vec, - pub vis: Visibility, - pub sig: Signature, - pub _block: proc_macro2::TokenStream, -} - -impl Parse for ItemFnForSignature { - fn parse(input: ParseStream) -> syn::parse::Result { - let attrs = input.call(Attribute::parse_outer)?; - let vis: Visibility = input.parse()?; - let sig: Signature = input.parse()?; - let block = input.parse()?; - Ok(ItemFnForSignature { - attrs, - vis, - sig, - _block: block, - }) - } -} - -fn clean_ty_string(t: &str) -> (String, proc_macro2::TokenStream) { - let mut ty_string = t - .replace("& 'a", "") - .replace('&', "") - .replace("mut", "") - .replace("< 'a >", "") - .replace(' ', ""); - if ty_string.starts_with("ExecState") { - ty_string = "ExecState".to_string(); - } - if ty_string.starts_with("Args") { - ty_string = "Args".to_string(); - } - let ty_string = ty_string.trim().to_string(); - let ty_ident = if ty_string.starts_with("Vec<") { - let ty_string = ty_string.trim_start_matches("Vec<").trim_end_matches('>'); - let (_, ty_ident) = clean_ty_string(&ty_string); - quote! { - Vec<#ty_ident> - } - } else if ty_string.starts_with("kittycad::types::") { - let ty_string = ty_string.trim_start_matches("kittycad::types::").trim_end_matches('>'); - let ty_ident = format_ident!("{}", ty_string); - quote! { - kittycad::types::#ty_ident - } - } else if ty_string.starts_with("Option<") { - let ty_string = ty_string.trim_start_matches("Option<").trim_end_matches('>'); - let (_, ty_ident) = clean_ty_string(&ty_string); - quote! { - Option<#ty_ident> - } - } else if let Some((inner_array_type, num)) = parse_array_type(&ty_string) { - let ty_string = inner_array_type.to_owned(); - let (_, ty_ident) = clean_ty_string(&ty_string); - quote! { - [#ty_ident; #num] - } - } else if ty_string.starts_with("Box<") { - let ty_string = ty_string.trim_start_matches("Box<").trim_end_matches('>'); - let (_, ty_ident) = clean_ty_string(&ty_string); - quote! { - #ty_ident - } - } else { - let ty_ident = format_ident!("{}", ty_string); - quote! { - #ty_ident - } - }; - - (ty_string, ty_ident) -} - -fn rust_type_to_openapi_type(t: &str) -> String { - let mut t = t.to_string(); - // Turn vecs into arrays. - // TODO: handle nested types - if t.starts_with("Vec<") { - t = t.replace("Vec<", "[").replace('>', "]"); - } - if t.starts_with("Box<") { - t = t.replace("Box<", "").replace('>', ""); - } - if t.starts_with("Option<") { - t = t.replace("Option<", "").replace('>', ""); - } - - if t == "[TyF64;2]" { - return "Point2d".to_owned(); - } - if t == "[TyF64;3]" { - return "Point3d".to_owned(); - } - - if let Some((inner_type, _length)) = parse_array_type(&t) { - t = format!("[{inner_type}]") - } - - if t == "f64" || t == "TyF64" || t == "u32" || t == "NonZeroU32" { - return "number".to_string(); - } else if t == "str" || t == "String" { - return "string".to_string(); - } else { - return t.replace("f64", "number").replace("TyF64", "number").to_string(); - } -} - -fn parse_array_type(type_name: &str) -> Option<(&str, usize)> { - static RE: Lazy = Lazy::new(|| Regex::new(r"\[([a-zA-Z0-9<>]+); ?(\d+)\]").unwrap()); - let cap = RE.captures(type_name)?; - let inner_type = cap.get(1)?; - let length = cap.get(2)?.as_str().parse().ok()?; - Some((inner_type.as_str(), length)) -} - -// For each kcl code block, we want to generate a test that checks that the -// code block is valid kcl code and compiles and executes. -fn generate_code_block_test(fn_name: &str, code_block: &str, index: usize) -> proc_macro2::TokenStream { - let test_name = format_ident!("kcl_test_example_{}{}", fn_name, index); - let test_name_mock = format_ident!("test_mock_example_{}{}", fn_name, index); - let output_test_name_str = format!("serial_test_example_{}{}", fn_name, index); - - quote! { - #[tokio::test(flavor = "multi_thread")] - async fn #test_name_mock() -> miette::Result<()> { - let program = crate::Program::parse_no_errs(#code_block).unwrap(); - let ctx = crate::ExecutorContext { - engine: std::sync::Arc::new(Box::new(crate::engine::conn_mock::EngineConnection::new().await.unwrap())), - fs: std::sync::Arc::new(crate::fs::FileManager::new()), - stdlib: std::sync::Arc::new(crate::std::StdLib::new()), - settings: Default::default(), - context_type: crate::execution::ContextType::Mock, - }; - - if let Err(e) = ctx.run(&program, &mut crate::execution::ExecState::new(&ctx)).await { - return Err(miette::Report::new(crate::errors::Report { - error: e.error, - filename: format!("{}{}", #fn_name, #index), - kcl_source: #code_block.to_string(), - })); - } - Ok(()) - } - - #[tokio::test(flavor = "multi_thread", worker_threads = 5)] - async fn #test_name() -> miette::Result<()> { - let code = #code_block; - // Note, `crate` must be kcl_lib - let result = match crate::test_server::execute_and_snapshot(code, None).await { - Err(crate::errors::ExecError::Kcl(e)) => { - return Err(miette::Report::new(crate::errors::Report { - error: e.error, - filename: format!("{}{}", #fn_name, #index), - kcl_source: #code_block.to_string(), - })); - } - Err(other_err)=> panic!("{}", other_err), - Ok(img) => img, - }; - twenty_twenty::assert_image(&format!("tests/outputs/{}.png", #output_test_name_str), &result, 0.99); - Ok(()) - } - } -} diff --git a/rust/kcl-derive-docs/src/tests.rs b/rust/kcl-derive-docs/src/tests.rs deleted file mode 100644 index 6567ccc74..000000000 --- a/rust/kcl-derive-docs/src/tests.rs +++ /dev/null @@ -1,508 +0,0 @@ -use anyhow::Result; -use quote::quote; - -use crate::{do_stdlib, parse_array_type}; - -fn clean_text(s: &str) -> String { - // Add newlines after end-braces at <= two levels of indentation. - if cfg!(not(windows)) { - let regex = regex::Regex::new(r"(})(\n\s{0,8}[^} ])").unwrap(); - regex.replace_all(s, "$1\n$2").to_string() - } else { - let regex = regex::Regex::new(r"(})(\r\n\s{0,8}[^} ])").unwrap(); - regex.replace_all(s, "$1\r\n$2").to_string() - } -} - -/// Format a TokenStream as a string and run `rustfmt` on the result. -fn get_text_fmt(output: &proc_macro2::TokenStream) -> Result { - // Format the file with rustfmt. - let content = rustfmt_wrapper::rustfmt(output).unwrap(); - - Ok(clean_text(&content)) -} - -#[test] -fn test_get_inner_array_type() { - for (expected, input) in [ - (Some(("f64", 2)), "[f64;2]"), - (Some(("String", 2)), "[String; 2]"), - (Some(("Option", 12)), "[Option;12]"), - (Some(("Option", 12)), "[Option; 12]"), - ] { - let actual = parse_array_type(input); - assert_eq!(actual, expected); - } -} - -#[test] -fn test_args_with_refs() { - let (item, mut errors) = do_stdlib( - quote! { - name = "someFn", - args = { - data = { docs = "The data for this function"}, - }, - }, - quote! { - /// Docs - /// ``` - /// someFn() - /// ``` - fn someFn( - data: &'a str, - ) -> i32 { - 3 - } - }, - ) - .unwrap(); - if let Some(e) = errors.pop() { - panic!("{e}"); - } - expectorate::assert_contents("tests/args_with_refs.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_args_with_lifetime() { - let (item, mut errors) = do_stdlib( - quote! { - name = "someFn", - args = { - data = { docs = "Arg for the function" }, - } - }, - quote! { - /// Docs - /// ``` - /// someFn() - /// ``` - fn someFn<'a>( - data: Foo<'a>, - ) -> i32 { - 3 - } - }, - ) - .unwrap(); - if let Some(e) = errors.pop() { - panic!("{e}"); - } - expectorate::assert_contents("tests/args_with_lifetime.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_args_with_exec_state() { - let (item, mut errors) = do_stdlib( - quote! { - name = "someFunction", - }, - quote! { - /// Docs - /// ``` - /// someFunction() - /// ``` - fn inner_some_function<'a>( - exec_state: &mut ExecState, - args: &Args, - ) -> i32 { - 3 - } - }, - ) - .unwrap(); - if let Some(e) = errors.pop() { - panic!("{e}"); - } - expectorate::assert_contents("tests/test_args_with_exec_state.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_line_to() { - let (item, errors) = do_stdlib( - quote! { - name = "lineTo", - args = { - data = { docs = "the sketch you're adding the line to" }, - sketch = { docs = "the sketch you're adding the line to" }, - } - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is another code block. - /// yes sirrr. - /// lineTo - /// ``` - fn inner_line_to( - data: LineToData, - sketch: Sketch, - args: &Args, - ) -> Result { - Ok(()) - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/lineTo.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_min() { - let (item, errors) = do_stdlib( - quote! { - name = "min", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is another code block. - /// yes sirrr. - /// min - /// ``` - fn inner_min( - /// The args to do shit to. - args: Vec - ) -> f64 { - let mut min = std::f64::MAX; - for arg in args.iter() { - if *arg < min { - min = *arg; - } - } - - min - } - }, - ) - .unwrap(); - let _expected = quote! {}; - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/min.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_show() { - let (item, errors) = do_stdlib( - quote! { - name = "show", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is code. - /// It does other shit. - /// show - /// ``` - fn inner_show( - /// The args to do shit to. - _args: Vec - ) { - } - }, - ) - .unwrap(); - let _expected = quote! {}; - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/show.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_box() { - let (item, errors) = do_stdlib( - quote! { - name = "show", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is code. - /// It does other shit. - /// show - /// ``` - fn inner_show( - /// The args to do shit to. - args: Box - ) -> Box { - args - } - }, - ) - .unwrap(); - let _expected = quote! {}; - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/box.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_option() { - let (item, errors) = do_stdlib( - quote! { - name = "show", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is code. - /// It does other shit. - /// show - /// ``` - fn inner_show( - /// The args to do shit to. - args: Option - ) -> Result> { - args - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/option.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_array() { - let (item, errors) = do_stdlib( - quote! { - name = "show", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is another code block. - /// yes sirrr. - /// show - /// ``` - fn inner_show( - /// The args to do shit to. - args: [f64; 2] - ) -> Result> { - args - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/array.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_option_input_format() { - let (item, errors) = do_stdlib( - quote! { - name = "import", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is code. - /// It does other shit. - /// import - /// ``` - fn inner_import( - /// The args to do shit to. - args: Option - ) -> Result> { - args - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/option_input_format.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_return_vec_sketch() { - let (item, errors) = do_stdlib( - quote! { - name = "import", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is code. - /// It does other shit. - /// import - /// ``` - fn inner_import( - /// The args to do shit to. - args: Option - ) -> Result> { - args - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/return_vec_sketch.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_return_vec_box_sketch() { - let (item, errors) = do_stdlib( - quote! { - name = "import", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is code. - /// It does other shit. - /// import - /// ``` - fn inner_import( - /// The args to do shit to. - args: Option - ) -> Result>> { - args - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/return_vec_box_sketch.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_doc_comment_with_code() { - let (item, errors) = do_stdlib( - quote! { - name = "myFunc", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is another code block. - /// yes sirrr. - /// myFunc - /// ``` - fn inner_my_func( - /// The args to do shit to. - args: Option - ) -> Result>> { - args - } - }, - ) - .unwrap(); - - assert!(errors.is_empty(), "{errors:?}"); - expectorate::assert_contents("tests/doc_comment_with_code.gen", &get_text_fmt(&item).unwrap()); -} - -#[test] -fn test_stdlib_fail_non_camel_case() { - let (_, errors) = do_stdlib( - quote! { - name = "import_thing", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is another code block. - /// yes sirrr. - /// ``` - fn inner_import_thing( - /// The args to do shit to. - args: Option - ) -> Result>> { - args - } - }, - ) - .unwrap(); - - assert!(!errors.is_empty()); - assert_eq!( - errors[1].to_string(), - "stdlib function names must be in camel case: `import_thing`" - ); -} - -#[test] -fn test_stdlib_fail_no_code_block() { - let (_, errors) = do_stdlib( - quote! { - name = "import", - }, - quote! { - fn inner_import( - /// The args to do shit to. - args: Option - ) -> Result>> { - args - } - }, - ) - .unwrap(); - - assert!(!errors.is_empty()); - assert_eq!( - errors[1].to_string(), - "stdlib functions must have at least one code block" - ); -} - -#[test] -fn test_stdlib_fail_name_not_in_code_block() { - let (_, errors) = do_stdlib( - quote! { - name = "import", - }, - quote! { - /// This is some function. - /// It does shit. - /// - /// ``` - /// This is another code block. - /// yes sirrr. - /// ``` - fn inner_import( - /// The args to do shit to. - args: Option - ) -> Result>> { - args - } - }, - ) - .unwrap(); - - assert!(!errors.is_empty()); - assert_eq!( - errors[1].to_string(), - "stdlib functions must have the function name `import` in the code block" - ); -} diff --git a/rust/kcl-derive-docs/src/unbox.rs b/rust/kcl-derive-docs/src/unbox.rs deleted file mode 100644 index eceb8316d..000000000 --- a/rust/kcl-derive-docs/src/unbox.rs +++ /dev/null @@ -1,91 +0,0 @@ -// Unbox a Vec> to Vec. -// Unbox a Box to T. -pub(crate) fn unbox(t: syn::Type) -> syn::Type { - unbox_inner(unbox_vec(t)) -} - -// Unbox a syn::Type that is boxed to the inner object. -fn unbox_inner(t: syn::Type) -> syn::Type { - match t { - syn::Type::Path(syn::TypePath { ref path, .. }) => { - let path = &path.segments; - if path.len() == 1 { - let seg = &path[0]; - if seg.ident == "Box" { - if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) = - &seg.arguments - { - if args.len() == 1 { - let mut args = args.iter(); - let ok = args.next().unwrap(); - if let syn::GenericArgument::Type(ty) = ok { - return ty.clone(); - } - } - } - } - } - } - _ => { - return t; - } - } - t -} - -// For a Vec> return Vec. -// For a Vec return Vec. -fn unbox_vec(t: syn::Type) -> syn::Type { - match t { - syn::Type::Path(syn::TypePath { ref path, .. }) => { - let path = &path.segments; - if path.len() == 1 { - let seg = &path[0]; - if seg.ident == "Vec" { - if let syn::PathArguments::AngleBracketed(syn::AngleBracketedGenericArguments { args, .. }) = - &seg.arguments - { - if args.len() == 1 { - let mut args = args.iter(); - let ok = args.next().unwrap(); - if let syn::GenericArgument::Type(ty) = ok { - let unboxed = unbox(ty.clone()); - // Wrap it back in a vec. - let wrapped = syn::Type::Path(syn::TypePath { - qself: None, - path: syn::Path { - leading_colon: None, - segments: { - let mut segments = syn::punctuated::Punctuated::new(); - segments.push_value(syn::PathSegment { - ident: syn::Ident::new("Vec", proc_macro2::Span::call_site()), - arguments: syn::PathArguments::AngleBracketed( - syn::AngleBracketedGenericArguments { - colon2_token: None, - lt_token: syn::token::Lt::default(), - args: { - let mut args = syn::punctuated::Punctuated::new(); - args.push_value(syn::GenericArgument::Type(unboxed)); - args - }, - gt_token: syn::token::Gt::default(), - }, - ), - }); - segments - }, - }, - }); - return wrapped; - } - } - } - } - } - } - _ => { - return t; - } - } - t -} diff --git a/rust/kcl-directory-test-macro/Cargo.toml b/rust/kcl-directory-test-macro/Cargo.toml index 312ea8840..fd631401d 100644 --- a/rust/kcl-directory-test-macro/Cargo.toml +++ b/rust/kcl-directory-test-macro/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-directory-test-macro" description = "A tool for generating tests from a directory of kcl files" -version = "0.1.77" +version = "0.1.79" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" diff --git a/rust/kcl-language-server-release/Cargo.toml b/rust/kcl-language-server-release/Cargo.toml index 15b02528c..5b44b7c95 100644 --- a/rust/kcl-language-server-release/Cargo.toml +++ b/rust/kcl-language-server-release/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kcl-language-server-release" -version = "0.1.77" +version = "0.1.79" edition = "2021" authors = ["KittyCAD Inc "] publish = false diff --git a/rust/kcl-language-server/Cargo.toml b/rust/kcl-language-server/Cargo.toml index a0871e34a..4351cbf3e 100644 --- a/rust/kcl-language-server/Cargo.toml +++ b/rust/kcl-language-server/Cargo.toml @@ -2,7 +2,7 @@ name = "kcl-language-server" description = "A language server for KCL." authors = ["KittyCAD Inc "] -version = "0.2.77" +version = "0.2.79" edition = "2021" license = "MIT" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html diff --git a/rust/kcl-lib/Cargo.toml b/rust/kcl-lib/Cargo.toml index 8e3fb1c93..018109700 100644 --- a/rust/kcl-lib/Cargo.toml +++ b/rust/kcl-lib/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-lib" description = "KittyCAD Language implementation and tools" -version = "0.2.77" +version = "0.2.79" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" @@ -31,7 +31,7 @@ clap = { version = "4.5.36", default-features = false, optional = true, features "derive", ] } convert_case = "0.8.0" -csscolorparser = "0.7.0" +csscolorparser = "0.7.2" dashmap = { workspace = true } dhat = { version = "0.3", optional = true } fnv = "1.0.7" @@ -107,7 +107,7 @@ web-sys = { version = "0.3.76", features = ["console"] } [target.'cfg(not(target_arch = "wasm32"))'.dependencies] instant = "0.1.13" tokio = { workspace = true, features = ["full"] } -tokio-tungstenite = { version = "0.24.0", features = [ +tokio-tungstenite = { version = "0.26.2", features = [ "rustls-tls-native-roots", ] } tower-lsp = { workspace = true, features = ["proposed", "default"] } @@ -130,7 +130,7 @@ tabled = ["dep:tabled"] [dev-dependencies] approx = "0.5" base64 = "0.22.1" -criterion = { version = "0.5.1", features = ["async_tokio"] } +criterion = { version = "0.6.0", features = ["async_tokio"] } expectorate = "1.1.0" handlebars = "6.3.2" image = { version = "0.25.6", default-features = false, features = ["png"] } diff --git a/rust/kcl-lib/benches/benchmark_kcl_samples.rs b/rust/kcl-lib/benches/benchmark_kcl_samples.rs index a8aaf917b..c72cec297 100644 --- a/rust/kcl-lib/benches/benchmark_kcl_samples.rs +++ b/rust/kcl-lib/benches/benchmark_kcl_samples.rs @@ -1,9 +1,10 @@ use std::{ fs, + hint::black_box, path::{Path, PathBuf}, }; -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use criterion::{criterion_group, criterion_main, Criterion}; const IGNORE_DIRS: [&str; 2] = ["step", "screenshots"]; diff --git a/rust/kcl-lib/benches/compiler_benchmark_criterion.rs b/rust/kcl-lib/benches/compiler_benchmark_criterion.rs index f582eef73..f936d8b45 100644 --- a/rust/kcl-lib/benches/compiler_benchmark_criterion.rs +++ b/rust/kcl-lib/benches/compiler_benchmark_criterion.rs @@ -1,4 +1,6 @@ -use criterion::{black_box, criterion_group, criterion_main, Criterion}; +use std::hint::black_box; + +use criterion::{criterion_group, criterion_main, Criterion}; pub fn bench_parse(c: &mut Criterion) { for (name, file) in [ diff --git a/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs b/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs index 484bee26e..6a7769ec4 100644 --- a/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs +++ b/rust/kcl-lib/benches/lsp_semantic_tokens_benchmark_criterion.rs @@ -1,4 +1,6 @@ -use criterion::{black_box, criterion_group, criterion_main, BenchmarkId, Criterion}; +use std::hint::black_box; + +use criterion::{criterion_group, criterion_main, BenchmarkId, Criterion}; use kcl_lib::kcl_lsp_server; use tokio::runtime::Runtime; use tower_lsp::LanguageServer; diff --git a/rust/kcl-lib/e2e/executor/main.rs b/rust/kcl-lib/e2e/executor/main.rs index cb788c1fc..9b4aca2ef 100644 --- a/rust/kcl-lib/e2e/executor/main.rs +++ b/rust/kcl-lib/e2e/executor/main.rs @@ -762,7 +762,7 @@ async fn kcl_test_stdlib_kcl_error_right_code_path() { }; assert_eq!( err.error.message(), - "This function requires a keyword argument 'center'" + "This function requires a keyword argument `center`" ); } @@ -1230,10 +1230,7 @@ secondSketch = startSketchOn(part001, face = '') let result = execute_and_snapshot(code, None).await; let err = result.unwrap_err(); let err = err.as_kcl_error().unwrap(); - assert_eq!( - err.message(), - "The arg face was given, but it was the wrong type. It should be type FaceTag but it was string" - ); + assert_eq!(err.message(), "face requires a value with type `tag`, but found string"); } #[tokio::test(flavor = "multi_thread")] @@ -1684,10 +1681,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have an x constrained angle of 90 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(70, 111, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(70, 111, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(70, 111, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1709,10 +1712,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have an x constrained angle of 270 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(70, 112, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(70, 112, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(70, 112, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1734,10 +1743,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have a y constrained angle of 0 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(70, 110, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(70, 110, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(70, 110, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1759,10 +1774,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have a y constrained angle of 180 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(70, 112, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(70, 112, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(70, 112, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1784,10 +1805,16 @@ extrusion = extrude(sketch001, length = 10) assert_eq!(err.message(), "Cannot have an x constrained angle of 90 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(66, 116, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(66, 116, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(66, 116, ModuleId::default()), + fn_name: None, + } + ] ); } @@ -1809,10 +1836,16 @@ extrusion = extrude(sketch001, length = 10) assert_eq!(err.message(), "Cannot have an x constrained angle of 270 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(66, 117, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(66, 117, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(66, 117, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1836,10 +1869,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have a y constrained angle of 0 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(95, 130, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(95, 130, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(95, 130, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1863,10 +1902,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have a y constrained angle of 180 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(95, 132, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(95, 132, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(95, 132, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1890,10 +1935,16 @@ example = extrude(exampleSketch, length = 10) assert_eq!(err.message(), "Cannot have a y constrained angle of 180 degrees"); assert_eq!( err.backtrace(), - vec![BacktraceItem { - source_range: SourceRange::new(95, 133, ModuleId::default()), - fn_name: Some("angledLine".to_owned()) - }] + vec![ + BacktraceItem { + source_range: SourceRange::new(95, 133, ModuleId::default()), + fn_name: Some("angledLine".to_owned()) + }, + BacktraceItem { + source_range: SourceRange::new(95, 133, ModuleId::default()), + fn_name: None + } + ] ); } @@ -1911,12 +1962,13 @@ someFunction('INVALID') let err = err.as_kcl_error().unwrap(); assert_eq!( err.message(), - "This function expected the input argument to be Solid or Plane but it's actually of type string" + "The input argument of `startSketchOn` requires a value with type `Solid | Plane`, but found string" ); assert_eq!( err.source_ranges(), vec![ SourceRange::new(46, 55, ModuleId::default()), + SourceRange::new(32, 56, ModuleId::default()), SourceRange::new(60, 83, ModuleId::default()), ] ); @@ -1925,6 +1977,10 @@ someFunction('INVALID') vec![ BacktraceItem { source_range: SourceRange::new(46, 55, ModuleId::default()), + fn_name: Some("startSketchOn".to_owned()), + }, + BacktraceItem { + source_range: SourceRange::new(32, 56, ModuleId::default()), fn_name: Some("someFunction".to_owned()), }, BacktraceItem { diff --git a/rust/kcl-lib/src/docs/gen_std_tests.rs b/rust/kcl-lib/src/docs/gen_std_tests.rs index e21fa1d37..ebc739043 100644 --- a/rust/kcl-lib/src/docs/gen_std_tests.rs +++ b/rust/kcl-lib/src/docs/gen_std_tests.rs @@ -2,48 +2,11 @@ use std::{collections::HashMap, fs, path::Path}; use anyhow::Result; use base64::Engine; -use convert_case::Casing; -use indexmap::IndexMap; -use itertools::Itertools; use serde_json::json; use tokio::task::JoinSet; use super::kcl_doc::{ConstData, DocData, ExampleProperties, FnData, ModData, TyData}; -use crate::{ - docs::{StdLibFn, DECLARED_TYPES}, - std::StdLib, - ExecutorContext, -}; - -// Types with special handling. -const SPECIAL_TYPES: [&str; 4] = ["TagDeclarator", "TagIdentifier", "Start", "End"]; - -const TYPE_REWRITES: [(&str, &str); 11] = [ - ("TagNode", "TagDeclarator"), - ("SketchData", "Plane | Solid"), - ("SketchOrSurface", "Sketch | Plane | Face"), - ("SketchSurface", "Plane | Face"), - ("SolidOrImportedGeometry", "[Solid] | ImportedGeometry"), - ( - "SolidOrSketchOrImportedGeometry", - "[Solid] | [Sketch] | ImportedGeometry", - ), - ("KclValue", "any"), - ("[KclValue]", "[any]"), - ("FaceTag", "TagIdentifier | Start | End"), - ("GeometryWithImportedGeometry", "Solid | Sketch | ImportedGeometry"), - ("SweepPath", "Sketch | Helix"), -]; - -fn rename_type(input: &str) -> &str { - for (i, o) in TYPE_REWRITES { - if input == i { - return o; - } - } - - input -} +use crate::ExecutorContext; fn init_handlebars() -> Result> { let mut hbs = handlebars::Handlebars::new(); @@ -104,7 +67,7 @@ fn init_handlebars() -> Result> { Ok(hbs) } -fn generate_index(combined: &IndexMap>, kcl_lib: &ModData) -> Result<()> { +fn generate_index(kcl_lib: &ModData) -> Result<()> { let hbs = init_handlebars()?; let mut functions = HashMap::new(); @@ -115,31 +78,6 @@ fn generate_index(combined: &IndexMap>, kcl_lib: &ModD let mut types = HashMap::new(); types.insert("Primitive types".to_owned(), Vec::new()); - for key in combined.keys() { - let internal_fn = combined - .get(key) - .ok_or_else(|| anyhow::anyhow!("Failed to get internal function: {}", key))?; - - if internal_fn.unpublished() || internal_fn.deprecated() { - continue; - } - - let tags = internal_fn.tags(); - let module = tags.first().map(|s| format!("std::{s}")).unwrap_or("std".to_owned()); - - functions - .entry(module.to_owned()) - .or_default() - .push((internal_fn.name(), format!("/docs/kcl-std/{}", internal_fn.name()))); - } - - for name in SPECIAL_TYPES { - types - .get_mut("Primitive types") - .unwrap() - .push((name.to_owned(), format!("/docs/kcl-lang/types#{name}"))); - } - for d in kcl_lib.all_docs() { if d.hide() { continue; @@ -257,8 +195,8 @@ fn generate_example(index: usize, src: &str, props: &ExampleProperties, file_nam })) } -fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String) -> Result<()> { - if ty.properties.doc_hidden || !DECLARED_TYPES.contains(&&*ty.name) { +fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String, kcl_std: &ModData) -> Result<()> { + if ty.properties.doc_hidden { return Ok(()); } @@ -282,18 +220,14 @@ fn generate_type_from_kcl(ty: &TyData, file_name: String, example_name: String) }); let output = hbs.render("kclType", &data)?; - let output = cleanup_types(&output); + let output = cleanup_types(&output, kcl_std); expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", file_name), &output); Ok(()) } -fn generate_mod_from_kcl(m: &ModData, file_name: String, combined: &IndexMap>) -> Result<()> { - fn list_items( - m: &ModData, - namespace: &str, - combined: &IndexMap>, - ) -> Vec { +fn generate_mod_from_kcl(m: &ModData, file_name: String) -> Result<()> { + fn list_items(m: &ModData, namespace: &str) -> Vec { let mut items: Vec<_> = m .children .iter() @@ -301,25 +235,6 @@ fn generate_mod_from_kcl(m: &ModData, file_name: String, combined: &IndexMap>(); @@ -408,18 +323,30 @@ fn generate_function_from_kcl( "return_value": function.return_type.as_ref().map(|t| { json!({ "type_": t, - "description": super::docs_for_type(t, kcl_std).unwrap_or_default(), + "description": docs_for_type(t, kcl_std).unwrap_or_default(), }) }), }); let output = hbs.render("function", &data)?; - let output = &cleanup_types(&output); + let output = &cleanup_types(&output, kcl_std); expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", file_name), output); Ok(()) } +fn docs_for_type(ty: &str, kcl_std: &ModData) -> Option { + let key = if ty.starts_with("number") { "number" } else { ty }; + + if !key.contains('|') && !key.contains('[') { + if let Some(data) = kcl_std.find_by_name(key) { + return data.summary().cloned(); + } + } + + None +} + fn generate_const_from_kcl(cnst: &ConstData, file_name: String, example_name: String) -> Result<()> { if cnst.properties.doc_hidden { return Ok(()); @@ -450,83 +377,7 @@ fn generate_const_from_kcl(cnst: &ConstData, file_name: String, example_name: St Ok(()) } -fn generate_function(internal_fn: Box, kcl_std: &ModData) -> Result<()> { - let hbs = init_handlebars()?; - - if internal_fn.unpublished() { - return Ok(()); - } - - let fn_name = internal_fn.name(); - let snake_case_name = clean_function_name(&fn_name); - - let examples: Vec = internal_fn - .examples() - .iter() - .enumerate() - .map(|(index, (example, norun))| { - let image_base64 = if !norun { - let image_path = format!( - "{}/tests/outputs/serial_test_example_{}{}.png", - env!("CARGO_MANIFEST_DIR"), - snake_case_name, - index - ); - let image_data = - std::fs::read(&image_path).unwrap_or_else(|_| panic!("Failed to read image file: {}", image_path)); - base64::engine::general_purpose::STANDARD.encode(&image_data) - } else { - String::new() - }; - - json!({ - "content": example, - "image_base64": image_base64, - }) - }) - .collect(); - - let tags = internal_fn.tags(); - let module = tags - .first() - .map(|s| &**s) - .map(|m| format!("std::{m}")) - .unwrap_or("std".to_owned()); - - let data = json!({ - "name": fn_name, - "module": module, - "summary": internal_fn.summary(), - "description": internal_fn.description(), - "deprecated": internal_fn.deprecated(), - "fn_signature": internal_fn.fn_signature(true), - "examples": examples, - "args": internal_fn.args(false).iter().map(|arg| { - json!({ - "name": arg.name, - "type_": rename_type(&arg.type_), - "description": arg.description(Some(kcl_std)), - "required": arg.required, - }) - }).collect::>(), - "return_value": internal_fn.return_value(false).map(|ret| { - json!({ - "type_": rename_type(&ret.type_), - "description": ret.description(Some(kcl_std)), - }) - }), - }); - - let mut output = hbs.render("function", &data)?; - // Fix the links to the types. - output = cleanup_types(&output); - - expectorate::assert_contents(format!("../../docs/kcl-std/{}.md", fn_name), &output); - - Ok(()) -} - -fn cleanup_types(input: &str) -> String { +fn cleanup_types(input: &str, kcl_std: &ModData) -> String { #[derive(Copy, Clone, Eq, PartialEq, Debug)] enum State { Text, @@ -550,7 +401,7 @@ fn cleanup_types(input: &str) -> String { if code_type.starts_with(' ') { code.push(' '); } - code.push_str(&cleanup_type_string(code_type.trim(), false)); + code.push_str(&cleanup_type_string(code_type.trim(), false, kcl_std)); if code_type.ends_with(' ') { code.push(' '); } @@ -586,7 +437,7 @@ fn cleanup_types(input: &str) -> String { } ticks = 0; } else if state == State::Text && ticks == 2 && !code.is_empty() { - output.push_str(&cleanup_type_string(&code, true)); + output.push_str(&cleanup_type_string(&code, true, kcl_std)); code = String::new(); ticks = 0; } else if state == State::CodeBlock { @@ -631,14 +482,12 @@ fn cleanup_types(input: &str) -> String { output } -fn cleanup_type_string(input: &str, fmt_for_text: bool) -> String { +fn cleanup_type_string(input: &str, fmt_for_text: bool, kcl_std: &ModData) -> String { assert!( !(input.starts_with('[') && input.ends_with(']') && input.contains('|')), "Arrays of unions are not supported" ); - let input = rename_type(input); - let tys: Vec<_> = input .split('|') .map(|ty| { @@ -676,9 +525,7 @@ fn cleanup_type_string(input: &str, fmt_for_text: bool) -> String { format!("[{prefix}{ty}{suffix}](/docs/kcl-std/types/std-types-number)") } else if fmt_for_text && ty.starts_with("fn") { format!("[{prefix}{ty}{suffix}](/docs/kcl-std/types/std-types-fn)") - } else if fmt_for_text && SPECIAL_TYPES.contains(&ty) { - format!("[{prefix}{ty}{suffix}](/docs/kcl-lang/types#{ty})") - } else if fmt_for_text && DECLARED_TYPES.contains(&ty) { + } else if fmt_for_text && matches!(kcl_std.find_by_name(ty), Some(DocData::Ty(_))) { format!("[{prefix}{ty}{suffix}](/docs/kcl-std/types/std-types-{ty})") } else { format!("{prefix}{ty}{suffix}") @@ -689,73 +536,22 @@ fn cleanup_type_string(input: &str, fmt_for_text: bool) -> String { tys.join(if fmt_for_text { " or " } else { " | " }) } -fn clean_function_name(name: &str) -> String { - // Convert from camel case to snake case. - let mut fn_name = name.to_case(convert_case::Case::Snake); - // Clean the fn name. - if fn_name.starts_with("last_seg_") { - fn_name = fn_name.replace("last_seg_", "last_segment_"); - } else if fn_name.contains("_2_d") { - fn_name = fn_name.replace("_2_d", "_2d"); - } else if fn_name.contains("_3_d") { - fn_name = fn_name.replace("_3_d", "_3d"); - } else if fn_name == "seg_ang" { - fn_name = "segment_angle".to_string(); - } else if fn_name == "seg_len" { - fn_name = "segment_length".to_string(); - } else if fn_name.starts_with("seg_") { - fn_name = fn_name.replace("seg_", "segment_"); - } - - fn_name -} - #[test] fn test_generate_stdlib_markdown_docs() { - let stdlib = StdLib::new(); - let combined = stdlib.combined(); let kcl_std = crate::docs::kcl_doc::walk_prelude(); // Generate the index which is the table of contents. - generate_index(&combined, &kcl_std).unwrap(); - - for key in combined.keys().sorted() { - let internal_fn = combined.get(key).unwrap(); - generate_function(internal_fn.clone(), &kcl_std).unwrap(); - } + generate_index(&kcl_std).unwrap(); for d in kcl_std.all_docs() { match d { DocData::Fn(f) => generate_function_from_kcl(f, d.file_name(), d.example_name(), &kcl_std).unwrap(), DocData::Const(c) => generate_const_from_kcl(c, d.file_name(), d.example_name()).unwrap(), - DocData::Ty(t) => generate_type_from_kcl(t, d.file_name(), d.example_name()).unwrap(), - DocData::Mod(m) => generate_mod_from_kcl(m, d.file_name(), &combined).unwrap(), + DocData::Ty(t) => generate_type_from_kcl(t, d.file_name(), d.example_name(), &kcl_std).unwrap(), + DocData::Mod(m) => generate_mod_from_kcl(m, d.file_name()).unwrap(), } } - generate_mod_from_kcl(&kcl_std, "modules/std".to_owned(), &combined).unwrap(); -} - -#[test] -fn test_generate_stdlib_json_schema() { - // If this test fails and you've modified the AST or something else which affects the json repr - // of stdlib functions, you should rerun the test with `EXPECTORATE=overwrite` to create new - // test data, then check `/docs/kcl-std/std.json` to ensure the changes are expected. - // Alternatively, run `just redo-kcl-stdlib-docs` (make sure to have just installed). - let stdlib = StdLib::new(); - let combined = stdlib.combined(); - - let json_data: Vec<_> = combined - .keys() - .sorted() - .map(|key| { - let internal_fn = combined.get(key).unwrap(); - internal_fn.to_json().unwrap() - }) - .collect(); - expectorate::assert_contents( - "../../docs/kcl-std/std.json", - &serde_json::to_string_pretty(&json_data).unwrap(), - ); + generate_mod_from_kcl(&kcl_std, "modules/std".to_owned()).unwrap(); } #[tokio::test(flavor = "multi_thread")] diff --git a/rust/kcl-lib/src/docs/kcl_doc.rs b/rust/kcl-lib/src/docs/kcl_doc.rs index dd70211f2..cef841fdf 100644 --- a/rust/kcl-lib/src/docs/kcl_doc.rs +++ b/rust/kcl-lib/src/docs/kcl_doc.rs @@ -302,6 +302,7 @@ impl DocData { } } + #[allow(dead_code)] pub(super) fn summary(&self) -> Option<&String> { match self { DocData::Fn(f) => f.summary.as_ref(), @@ -462,6 +463,7 @@ impl ModData { } } + #[allow(dead_code)] pub fn find_by_name(&self, name: &str) -> Option<&DocData> { if let Some(result) = self .children @@ -644,13 +646,13 @@ impl FnData { format!("{}({})", self.preferred_name, args.join(", ")) } - fn to_signature_help(&self) -> SignatureHelp { + pub(crate) fn to_signature_help(&self) -> SignatureHelp { // TODO Fill this in based on the current position of the cursor. let active_parameter = None; SignatureHelp { signatures: vec![SignatureInformation { - label: self.preferred_name.clone(), + label: self.preferred_name.clone() + &self.fn_signature(), documentation: self.short_docs().map(|s| { Documentation::MarkupContent(MarkupContent { kind: MarkupKind::Markdown, @@ -744,12 +746,12 @@ impl ArgData { } = &attr.inner { for p in props { - if p.key.name == "include_in_snippet" { + if p.key.name == "includeInSnippet" { if let Some(b) = p.value.literal_bool() { result.override_in_snippet = Some(b); } else { panic!( - "Invalid value for `include_in_snippet`, expected bool literal, found {:?}", + "Invalid value for `includeInSnippet`, expected bool literal, found {:?}", p.value ); } @@ -812,6 +814,7 @@ impl ArgData { return Some((index + n - 1, snippet)); } match self.ty.as_deref() { + Some("Sketch") if self.kind == ArgKind::Special => None, Some(s) if s.starts_with("number") => Some((index, format!(r#"{label}${{{}:10}}"#, index))), Some("Point2d") => Some((index + 1, format!(r#"{label}[${{{}:0}}, ${{{}:0}}]"#, index, index + 1))), Some("Point3d") => Some(( @@ -824,13 +827,18 @@ impl ArgData { ), )), Some("Axis2d | Edge") | Some("Axis3d | Edge") => Some((index, format!(r#"{label}${{{index}:X}}"#))), + Some("Sketch") | Some("Sketch | Helix") => Some((index, format!(r#"{label}${{{index}:sketch000}}"#))), Some("Edge") => Some((index, format!(r#"{label}${{{index}:tag_or_edge_fn}}"#))), Some("[Edge; 1+]") => Some((index, format!(r#"{label}[${{{index}:tag_or_edge_fn}}]"#))), - Some("Plane") => Some((index, format!(r#"{label}${{{}:XY}}"#, index))), + Some("Plane") | Some("Solid | Plane") => Some((index, format!(r#"{label}${{{}:XY}}"#, index))), + Some("[tag; 2]") => Some(( + index + 1, + format!(r#"{label}[${{{}:tag}}, ${{{}:tag}}]"#, index, index + 1), + )), Some("string") => { if self.name == "color" { - Some((index, format!(r#"{label}${{{}:"ff0000"}}"#, index))) + Some((index, format!(r"{label}${{{}:{}}}", index, "\"#ff0000\""))) } else { Some((index, format!(r#"{label}${{{}:"string"}}"#, index))) } @@ -984,7 +992,7 @@ trait ApplyMeta { } let mut summary = None; - let mut description = None; + let mut description: Option = None; let mut example: Option<(String, ExampleProperties)> = None; let mut examples = Vec::new(); for l in comments.iter().filter(|l| l.starts_with("///")).map(|l| { @@ -994,22 +1002,6 @@ trait ApplyMeta { &l[3..] } }) { - if description.is_none() && summary.is_none() { - summary = Some(l.to_owned()); - continue; - } - if description.is_none() { - if l.is_empty() { - description = Some(String::new()); - } else { - description = summary; - summary = None; - let d = description.as_mut().unwrap(); - d.push('\n'); - d.push_str(l); - } - continue; - } #[allow(clippy::manual_strip)] if l.starts_with("```") { if let Some((e, p)) = example { @@ -1045,12 +1037,36 @@ trait ApplyMeta { continue; } } + + // An empty line outside of an example. This either starts the description (with or + // without a summary) or adds a blank line to the description. + if l.is_empty() { + match &mut description { + Some(d) => { + d.push('\n'); + } + None => description = Some(String::new()), + } + continue; + } + + // Our first line, start the summary. + if description.is_none() && summary.is_none() { + summary = Some(l.to_owned()); + continue; + } + + // Append the line to either the description or summary. match &mut description { Some(d) => { d.push_str(l); d.push('\n'); } - None => unreachable!(), + None => { + let s = summary.as_mut().unwrap(); + s.push(' '); + s.push_str(l); + } } } assert!(example.is_none()); @@ -1276,7 +1292,10 @@ mod test { continue; }; - for i in 0..f.examples.len() { + for (i, (_, props)) in f.examples.iter().enumerate() { + if props.norun { + continue; + } let name = format!("{}-{i}", f.qual_name.replace("::", "-")); assert!(TEST_NAMES.contains(&&*name), "Missing test for example \"{name}\", maybe need to update kcl-derive-docs/src/example_tests.rs?") } diff --git a/rust/kcl-lib/src/docs/mod.rs b/rust/kcl-lib/src/docs/mod.rs index 79c7df491..f8bf75623 100644 --- a/rust/kcl-lib/src/docs/mod.rs +++ b/rust/kcl-lib/src/docs/mod.rs @@ -4,981 +4,30 @@ mod gen_std_tests; pub mod kcl_doc; -use std::{ - fmt::{self, Write}, - path::Path, -}; - -use anyhow::Result; -use kcl_doc::ModData; -use parse_display::Display; -use schemars::JsonSchema; -use serde::{Deserialize, Serialize}; -use tower_lsp::lsp_types::{ - CompletionItem, CompletionItemKind, CompletionItemLabelDetails, Documentation, InsertTextFormat, MarkupContent, - MarkupKind, ParameterInformation, ParameterLabel, SignatureHelp, SignatureInformation, -}; - -use crate::execution::{types::NumericType, Sketch}; - -// These types are declared in (KCL) std. -const DECLARED_TYPES: [&str; 17] = [ - "any", - "number", - "string", - "tag", - "bool", - "Sketch", - "Solid", - "Plane", - "Helix", - "Face", - "Edge", - "Point2d", - "Point3d", - "Axis2d", - "Axis3d", - "ImportedGeometry", - "fn", -]; - -lazy_static::lazy_static! { - static ref NUMERIC_TYPE_SCHEMA: schemars::schema::SchemaObject = { - let mut settings = schemars::gen::SchemaSettings::openapi3(); - settings.inline_subschemas = true; - let mut generator = schemars::gen::SchemaGenerator::new(settings); - generator.root_schema_for::().schema - }; -} - -/// The primitive types that can be used in a KCL file. -#[derive(Debug, Clone, PartialEq, Serialize, JsonSchema, Display)] -#[serde(rename_all = "lowercase")] -#[display(style = "lowercase")] -enum Primitive { - /// A boolean value. - Bool, - /// A number value. - Number, - /// A string value. - String, - /// A uuid value. - Uuid, -} - -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema, ts_rs::TS)] -#[ts(export)] -#[serde(rename_all = "camelCase")] -pub struct StdLibFnData { - /// The name of the function. - pub name: String, - /// The summary of the function. - pub summary: String, - /// The description of the function. - pub description: String, - /// The tags of the function. - pub tags: Vec, - /// The args of the function. - pub args: Vec, - /// The return value of the function. - pub return_value: Option, - /// If the function is unpublished. - pub unpublished: bool, - /// If the function is deprecated. - pub deprecated: bool, - /// Code examples. The bool is whether the example is `norun`` - /// These are tested and we know they compile and execute. - pub examples: Vec<(String, bool)>, -} - -/// This struct defines a single argument to a stdlib function. -#[derive(Debug, Clone, Deserialize, Serialize, PartialEq, JsonSchema, ts_rs::TS)] -// There's a bug in ts_rs where this isn't correctly imported by StdLibFnData. -#[ts(export_to = "StdLibFnData.ts")] -#[serde(rename_all = "camelCase")] -pub struct StdLibFnArg { - /// The name of the argument. - pub name: String, - /// The type of the argument. - pub type_: String, - /// The schema of the argument. - #[ts(type = "any")] - pub schema: schemars::schema::RootSchema, - /// If the argument is required. - pub required: bool, - /// Include this in completion snippets? - #[serde(default, skip_serializing_if = "is_false")] - pub include_in_snippet: bool, - /// Snippet should suggest this value for the argument. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub snippet_value: Option, - /// Snippet should suggest this value for the argument. - /// The suggested value should be an array, with these elements. - #[serde(default, skip_serializing_if = "Option::is_none")] - pub snippet_value_array: Option>, - /// Additional information that could be used instead of the type's description. - /// This is helpful if the type is really basic, like "u32" -- that won't tell the user much about - /// how this argument is meant to be used. - /// Empty string means this has no docs. - #[serde(default, skip_serializing_if = "String::is_empty")] - pub description: String, - /// Even in functions that use keyword arguments, not every parameter requires a label (most do though). - /// Some functions allow one unlabeled parameter, which has to be first in the - /// argument list. - /// - /// This field is ignored for functions that still use positional arguments. - /// Defaults to true. - #[serde(default = "its_true")] - pub label_required: bool, -} - -impl fmt::Display for StdLibFnArg { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - if !self.label_required { - f.write_char('@')?; - } - f.write_str(&self.name)?; - if !self.required { - f.write_char('?')?; - } - f.write_str(": ")?; - f.write_str(&self.type_) - } -} - -fn its_true() -> bool { - true -} - -fn is_false(b: &bool) -> bool { - !b -} - -impl StdLibFnArg { - /// If the argument is a primitive. - pub fn is_primitive(&self) -> Result { - is_primitive(&self.schema.schema.clone().into()).map(|r| r.is_some()) - } - - pub fn get_autocomplete_string(&self) -> Result { - get_autocomplete_string_from_schema(&self.schema.schema.clone().into()) - } - - pub fn get_autocomplete_snippet(&self, index: usize, in_keyword_fn: bool) -> Result> { - let label = if in_keyword_fn && self.label_required { - &format!("{} = ", self.name) - } else { - "" - }; - if let Some(vals) = &self.snippet_value_array { - let mut snippet = label.to_owned(); - snippet.push('['); - for (i, val) in vals.iter().enumerate() { - snippet.push_str(&format!("${{{}:{}}}", index + i, val)); - if i != vals.len() - 1 { - snippet.push_str(", "); - } - } - snippet.push(']'); - return Ok(Some((index + vals.len() - 1, snippet))); - } - if let Some(val) = &self.snippet_value { - return Ok(Some((index, format!("{label}${{{}:{}}}", index, val)))); - } - if (self.type_ == "Sketch" - || self.type_ == "[Sketch]" - || self.type_ == "Geometry" - || self.type_ == "GeometryWithImportedGeometry" - || self.type_ == "Solid" - || self.type_ == "[Solid]" - || self.type_ == "SketchSurface" - || self.type_ == "SketchOrSurface" - || self.type_ == "SolidOrImportedGeometry" - || self.type_ == "SolidOrSketchOrImportedGeometry") - && (self.required || self.include_in_snippet) - { - return Ok(Some((index, format!("{label}${{{}:{}}}", index, "%")))); - } else if (self.type_ == "TagDeclarator" || self.type_ == "TagNode") && self.required { - return Ok(Some((index, format!("{label}${{{}:{}}}", index, "$myTag")))); - } else if self.type_ == "TagIdentifier" && self.required { - // TODO: actually use the ast to populate this. - return Ok(Some((index, format!("{label}${{{}:{}}}", index, "myTag")))); - } else if self.type_ == "[KclValue]" && self.required { - return Ok(Some((index, format!("{label}${{{}:{}}}", index, "[0..9]")))); - } else if self.type_ == "KclValue" && self.required { - return Ok(Some((index, format!("{label}${{{}:{}}}", index, "3")))); - } - self.get_autocomplete_snippet_from_schema(&self.schema.schema.clone().into(), index, in_keyword_fn, &self.name) - .map(|maybe| maybe.map(|(index, snippet)| (index, format!("{label}{snippet}")))) - } - - pub fn description(&self, kcl_std: Option<&ModData>) -> Option { - // Check if we explicitly gave this stdlib arg a description. - if !self.description.is_empty() { - assert!(!self.description.contains('\n'), "Arg docs will get truncated"); - return Some(self.description.clone()); - } - - if let Some(kcl_std) = kcl_std { - if let Some(t) = docs_for_type(&self.type_, kcl_std) { - return Some(t); - } - } - - // If not, then try to get something meaningful from the schema. - get_description_string_from_schema(&self.schema.clone()) - } - - fn get_autocomplete_snippet_from_schema( - &self, - schema: &schemars::schema::Schema, - index: usize, - in_keyword_fn: bool, - name: &str, - ) -> Result> { - match schema { - schemars::schema::Schema::Object(o) => { - // Check if the schema is the same as a Sketch. - let mut settings = schemars::gen::SchemaSettings::openapi3(); - // We set this so we can recurse them later. - settings.inline_subschemas = true; - let mut generator = schemars::gen::SchemaGenerator::new(settings); - let sketch_schema = generator.root_schema_for::().schema; - if sketch_schema.object == o.object { - return Ok(Some((index, format!("${{{}:sketch{}}}", index, "000")))); - } - - if name == "color" { - let snippet = format!("${{{}:\"#ff0000\"}}", index); - return Ok(Some((index, snippet))); - } - if let Some(serde_json::Value::Bool(nullable)) = o.extensions.get("nullable") { - if (!in_keyword_fn && *nullable) || (in_keyword_fn && !self.include_in_snippet) { - return Ok(None); - } - } - if o.enum_values.is_some() { - let auto_str = get_autocomplete_string_from_schema(schema)?; - return Ok(Some((index, format!("${{{}:{}}}", index, auto_str)))); - } - - if let Some(format) = &o.format { - if format == "uuid" { - return Ok(Some((index, format!(r#"${{{}:"tag_or_edge_fn"}}"#, index)))); - } else if format == "double" { - return Ok(Some((index, format!(r#"${{{}:3.14}}"#, index)))); - } else if format == "uint" - || format == "int64" - || format == "uint32" - || format == "uint64" - || format == "uint8" - { - return Ok(Some((index, format!(r#"${{{}:10}}"#, index)))); - } else { - anyhow::bail!("unknown format: {}", format); - } - } - - if let Some(obj_val) = &o.object { - let mut fn_docs = String::new(); - fn_docs.push_str("{\n"); - // Let's print out the object's properties. - let mut i = index; - for (prop_name, prop) in obj_val.properties.iter() { - if prop_name.starts_with('_') { - continue; - } - - // Tolerance is a an optional property that we don't want to show in the - // autocomplete, since it is mostly for advanced users. - if prop_name == "tolerance" { - continue; - } - - if let Some((new_index, snippet)) = - self.get_autocomplete_snippet_from_schema(prop, i, false, name)? - { - fn_docs.push_str(&format!("\t{} = {},\n", prop_name, snippet)); - i = new_index + 1; - } - } - - fn_docs.push('}'); - - return Ok(Some((i - 1, fn_docs))); - } - - if let Some(array_val) = &o.array { - if let Some(schemars::schema::SingleOrVec::Single(items)) = &array_val.items { - // Let's print out the object's properties. - match array_val.max_items { - Some(val) => { - return Ok(Some(( - index + (val as usize) - 1, - format!( - "[{}]", - (0..val) - .map(|v| self - .get_autocomplete_snippet_from_schema( - items, - index + (v as usize), - in_keyword_fn, - name - ) - .unwrap() - .unwrap() - .1) - .collect::>() - .join(", ") - ), - ))); - } - None => { - return Ok(Some(( - index, - format!( - "[{}]", - self.get_autocomplete_snippet_from_schema(items, index, in_keyword_fn, name)? - .ok_or_else(|| anyhow::anyhow!("expected snippet"))? - .1 - ), - ))); - } - }; - } else if let Some(items) = &array_val.contains { - return Ok(Some(( - index, - format!( - "[{}]", - self.get_autocomplete_snippet_from_schema(items, index, in_keyword_fn, name)? - .ok_or_else(|| anyhow::anyhow!("expected snippet"))? - .1 - ), - ))); - } - } - - if let Some(subschemas) = &o.subschemas { - let mut fn_docs = String::new(); - let mut i = index; - if let Some(items) = &subschemas.one_of { - let mut had_enum_string = false; - let mut parsed_enum_values: Vec = Vec::new(); - for item in items { - if let schemars::schema::Schema::Object(o) = item { - if let Some(enum_values) = &o.enum_values { - for enum_value in enum_values { - if let serde_json::value::Value::String(enum_value) = enum_value { - had_enum_string = true; - parsed_enum_values.push(format!("\"{}\"", enum_value)); - } else { - had_enum_string = false; - break; - } - } - if !had_enum_string { - break; - } - } else { - had_enum_string = false; - break; - } - } else { - had_enum_string = false; - break; - } - } - - if had_enum_string && !parsed_enum_values.is_empty() { - return Ok(Some((index, parsed_enum_values[0].to_string()))); - } else if let Some(item) = items.iter().next() { - if let Some((new_index, snippet)) = - self.get_autocomplete_snippet_from_schema(item, index, in_keyword_fn, name)? - { - i = new_index + 1; - fn_docs.push_str(&snippet); - } - } - } else if let Some(items) = &subschemas.any_of { - if let Some(item) = items.iter().next() { - if let Some((new_index, snippet)) = - self.get_autocomplete_snippet_from_schema(item, index, in_keyword_fn, name)? - { - i = new_index + 1; - fn_docs.push_str(&snippet); - } - } - } else { - anyhow::bail!("unknown subschemas: {:#?}", subschemas); - } - - return Ok(Some((i - 1, fn_docs))); - } - - if let Some(schemars::schema::SingleOrVec::Single(single)) = &o.instance_type { - if schemars::schema::InstanceType::Boolean == **single { - return Ok(Some((index, format!(r#"${{{}:false}}"#, index)))); - } else if schemars::schema::InstanceType::String == **single { - return Ok(Some((index, format!(r#"${{{}:"string"}}"#, index)))); - } else if schemars::schema::InstanceType::Null == **single { - return Ok(None); - } - } - - anyhow::bail!("unknown type: {:#?}", o) - } - schemars::schema::Schema::Bool(_) => Ok(Some((index, format!(r#"${{{}:false}}"#, index)))), - } - } -} - -impl From for ParameterInformation { - fn from(arg: StdLibFnArg) -> Self { - ParameterInformation { - label: ParameterLabel::Simple(arg.name.to_string()), - documentation: arg.description(None).map(|description| { - Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: description, - }) - }), - } - } -} - -fn docs_for_type(ty: &str, kcl_std: &ModData) -> Option { - let key = if ty.starts_with("number") { "number" } else { ty }; - - if DECLARED_TYPES.contains(&key) { - if let Some(data) = kcl_std.find_by_name(key) { - return data.summary().cloned(); - } - } - - None -} - -/// This trait defines functions called upon stdlib functions to generate -/// documentation for them. -pub trait StdLibFn: std::fmt::Debug + Send + Sync { - /// The name of the function. - fn name(&self) -> String; - - /// The summary of the function. - fn summary(&self) -> String; - - /// The description of the function. - fn description(&self) -> String; - - /// The tags of the function. - fn tags(&self) -> Vec; - - /// The args of the function. - fn args(&self, inline_subschemas: bool) -> Vec; - - /// The return value of the function. - fn return_value(&self, inline_subschemas: bool) -> Option; - - /// If the function is unpublished. - fn unpublished(&self) -> bool; - - /// If the function is deprecated. - fn deprecated(&self) -> bool; - - /// If the function should appear in the feature tree. - fn feature_tree_operation(&self) -> bool; - - /// Any example code blocks. - fn examples(&self) -> Vec<(String, bool)>; - - /// The function itself. - fn std_lib_fn(&self) -> crate::std::StdFn; - - /// Helper function to clone the boxed trait object. - fn clone_box(&self) -> Box; - - /// Return a JSON struct representing the function. - fn to_json(&self) -> Result { - Ok(StdLibFnData { - name: self.name(), - summary: self.summary(), - description: self.description(), - tags: self.tags(), - args: self.args(false), - return_value: self.return_value(false), - unpublished: self.unpublished(), - deprecated: self.deprecated(), - examples: self.examples(), - }) - } - - fn fn_signature(&self, include_name: bool) -> String { - let mut signature = String::new(); - if include_name { - signature.push_str(&self.name()); - } - - let args = self.args(false); - if args.is_empty() { - signature.push_str("()"); - } else if args.len() == 1 { - signature.push('('); - signature.push_str(&args[0].to_string()); - signature.push(')'); - } else { - signature.push('('); - for a in args { - signature.push_str("\n "); - signature.push_str(&a.to_string()); - signature.push(','); - } - signature.push('\n'); - signature.push(')'); - } - if let Some(return_value) = self.return_value(false) { - signature.push_str(&format!(": {}", return_value.type_)); - } - - signature - } - - fn to_completion_item(&self) -> Result { - Ok(CompletionItem { - label: self.name(), - label_details: Some(CompletionItemLabelDetails { - detail: Some(self.fn_signature(false)), - description: None, - }), - kind: Some(CompletionItemKind::FUNCTION), - detail: None, - documentation: Some(Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: if !self.description().is_empty() { - format!("{}\n\n{}", self.summary(), self.description()) - } else { - self.summary() - }, - })), - deprecated: Some(self.deprecated()), - preselect: None, - sort_text: None, - filter_text: None, - insert_text: Some(self.to_autocomplete_snippet()?), - insert_text_format: Some(InsertTextFormat::SNIPPET), - insert_text_mode: None, - text_edit: None, - additional_text_edits: None, - command: None, - commit_characters: None, - data: None, - tags: None, - }) - } - - fn to_autocomplete_snippet(&self) -> Result { - if self.name() == "loft" { - return Ok("loft([${0:sketch000}, ${1:sketch001}])".to_string()); - } else if self.name() == "subtract2D" { - return Ok("subtract2d(${0:%}, tool = ${1:%})".to_string()); - } - let in_keyword_fn = true; - let mut args = Vec::new(); - let mut index = 0; - for arg in self.args(true).iter() { - if let Some((i, arg_str)) = arg.get_autocomplete_snippet(index, in_keyword_fn)? { - index = i + 1; - args.push(arg_str); - } - } - Ok(format!("{}({})", self.name(), args.join(", "))) - } - - fn to_signature_help(&self) -> SignatureHelp { - // Fill this in based on the current position of the cursor. - let active_parameter = None; - - SignatureHelp { - signatures: vec![SignatureInformation { - label: self.fn_signature(true), - documentation: Some(Documentation::MarkupContent(MarkupContent { - kind: MarkupKind::Markdown, - value: format!( - r#"{} - -{}"#, - self.summary(), - self.description() - ) - .trim() - .to_string(), - })), - parameters: Some(self.args(true).into_iter().map(|arg| arg.into()).collect()), - active_parameter, - }], - active_signature: Some(0), - active_parameter, - } - } -} - -impl JsonSchema for dyn StdLibFn { - fn schema_name() -> String { - "StdLibFn".to_string() - } - - fn json_schema(gen: &mut schemars::gen::SchemaGenerator) -> schemars::schema::Schema { - gen.subschema_for::() - } -} - -impl Serialize for Box { - fn serialize(&self, serializer: S) -> Result { - self.to_json().unwrap().serialize(serializer) - } -} - -impl<'de> Deserialize<'de> for Box { - fn deserialize>(deserializer: D) -> Result { - let data = StdLibFnData::deserialize(deserializer)?; - let stdlib = crate::std::StdLib::new(); - let stdlib_fn = stdlib - .get(&data.name) - .ok_or_else(|| serde::de::Error::custom(format!("StdLibFn {} not found", data.name)))?; - Ok(stdlib_fn) - } -} - -impl ts_rs::TS for dyn StdLibFn { - type WithoutGenerics = Self; - - fn name() -> String { - "StdLibFnData".to_string() - } - - fn decl() -> String { - StdLibFnData::decl() - } - - fn decl_concrete() -> String { - StdLibFnData::decl_concrete() - } - - fn inline() -> String { - StdLibFnData::inline() - } - - fn inline_flattened() -> String { - StdLibFnData::inline_flattened() - } - - fn output_path() -> Option<&'static Path> { - StdLibFnData::output_path() - } -} - -impl Clone for Box { - fn clone(&self) -> Box { - self.clone_box() - } -} - -pub fn get_description_string_from_schema(schema: &schemars::schema::RootSchema) -> Option { - if let Some(metadata) = &schema.schema.metadata { - if let Some(description) = &metadata.description { - return Some(description.to_string()); - } - } - - if let Some(reference) = &schema.schema.reference { - if let Some(definition) = schema.definitions.get(reference.split('/').next_back().unwrap_or("")) { - let schemars::schema::Schema::Object(definition) = definition else { - return None; - }; - if let Some(metadata) = &definition.metadata { - if let Some(description) = &metadata.description { - return Some(description.to_string()); - } - } - } - } - - // If we have subschemas iterate over them and recursively create references. - if let Some(subschema) = &schema.schema.subschemas { - if let Some(one_of) = &subschema.one_of { - if one_of.len() == 1 { - return get_description_string_from_schema(&schemars::schema::RootSchema { - meta_schema: schema.meta_schema.clone(), - schema: one_of[0].clone().into(), - definitions: schema.definitions.clone(), - }); - } - } - - if let Some(all_of) = &subschema.all_of { - if all_of.len() == 1 { - return get_description_string_from_schema(&schemars::schema::RootSchema { - meta_schema: schema.meta_schema.clone(), - schema: all_of[0].clone().into(), - definitions: schema.definitions.clone(), - }); - } - } - - if let Some(any_of) = &subschema.any_of { - if any_of.len() == 1 { - return get_description_string_from_schema(&schemars::schema::RootSchema { - meta_schema: schema.meta_schema.clone(), - schema: any_of[0].clone().into(), - definitions: schema.definitions.clone(), - }); - } - } - } - - None -} - -fn is_primitive(schema: &schemars::schema::Schema) -> Result> { - match schema { - schemars::schema::Schema::Object(o) => { - if o.enum_values.is_some() { - // It's an enum so it's not a primitive. - return Ok(None); - } - - // Check if there - if let Some(format) = &o.format { - if format == "uuid" { - return Ok(Some(Primitive::Uuid)); - } else if format == "double" - || format == "uint" - || format == "int32" - || format == "int64" - || format == "uint8" - || format == "uint32" - || format == "uint64" - { - return Ok(Some(Primitive::Number)); - } else { - anyhow::bail!("unknown format: {}", format); - } - } - - if o.object.is_some() { - // It's an object so it's not a primitive. - return Ok(None); - } - - if o.array.is_some() { - return Ok(None); - } - - if o.subschemas.is_some() { - return Ok(None); - } - - if let Some(schemars::schema::SingleOrVec::Single(single)) = &o.instance_type { - if schemars::schema::InstanceType::Boolean == **single { - return Ok(Some(Primitive::Bool)); - } else if schemars::schema::InstanceType::String == **single - || schemars::schema::InstanceType::Null == **single - { - return Ok(Some(Primitive::String)); - } - } - - if o.reference.is_some() { - return Ok(None); - } - - anyhow::bail!("unknown type: {:#?}", o) - } - schemars::schema::Schema::Bool(_) => Ok(Some(Primitive::Bool)), - } -} - -fn get_autocomplete_string_from_schema(schema: &schemars::schema::Schema) -> Result { - match schema { - schemars::schema::Schema::Object(o) => { - if let Some(enum_values) = &o.enum_values { - let mut parsed_enum_values: Vec = Default::default(); - let mut had_enum_string = false; - for enum_value in enum_values { - if let serde_json::value::Value::String(enum_value) = enum_value { - had_enum_string = true; - parsed_enum_values.push(enum_value.to_owned()); - } else { - had_enum_string = false; - break; - } - } - - if had_enum_string && !parsed_enum_values.is_empty() { - return Ok(parsed_enum_values[0].to_string()); - } - } - - if let Some(format) = &o.format { - if format == "uuid" { - return Ok(Primitive::Uuid.to_string()); - } else if format == "double" - || format == "uint" - || format == "uint8" - || format == "int64" - || format == "uint32" - || format == "uint64" - { - return Ok(Primitive::Number.to_string()); - } else { - anyhow::bail!("unknown format: {}", format); - } - } - - if let Some(obj_val) = &o.object { - let mut fn_docs = String::new(); - fn_docs.push_str("{\n"); - // Let's print out the object's properties. - for (prop_name, prop) in obj_val.properties.iter() { - if prop_name.starts_with('_') { - continue; - } - - fn_docs.push_str(&format!( - "\t{}: {},\n", - prop_name, - get_autocomplete_string_from_schema(prop)?, - )); - } - - fn_docs.push('}'); - - return Ok(fn_docs); - } - - if let Some(array_val) = &o.array { - if let Some(schemars::schema::SingleOrVec::Single(items)) = &array_val.items { - // Let's print out the object's properties. - match array_val.max_items { - Some(val) => { - return Ok(format!( - "[{}]", - (0..val).map(|_| "number").collect::>().join(", ") - )); - } - None => { - return Ok(format!("[{}]", get_autocomplete_string_from_schema(items)?)); - } - }; - } else if let Some(items) = &array_val.contains { - return Ok(format!("[{}]", get_autocomplete_string_from_schema(items)?)); - } - } - - if let Some(subschemas) = &o.subschemas { - let mut fn_docs = String::new(); - if let Some(items) = &subschemas.one_of { - let mut had_enum_string = false; - let mut parsed_enum_values: Vec = Vec::new(); - for item in items { - if let schemars::schema::Schema::Object(o) = item { - if let Some(enum_values) = &o.enum_values { - for enum_value in enum_values { - if let serde_json::value::Value::String(enum_value) = enum_value { - had_enum_string = true; - parsed_enum_values.push(format!("\"{}\"", enum_value)); - } else { - had_enum_string = false; - break; - } - } - if !had_enum_string { - break; - } - } else { - had_enum_string = false; - break; - } - } else { - had_enum_string = false; - break; - } - } - - if had_enum_string && !parsed_enum_values.is_empty() { - return Ok(parsed_enum_values[0].to_string()); - } else if let Some(item) = items.iter().next() { - // Let's print out the object's properties. - fn_docs.push_str(&get_autocomplete_string_from_schema(item)?); - } - } else if let Some(items) = &subschemas.any_of { - if let Some(item) = items.iter().next() { - // Let's print out the object's properties. - fn_docs.push_str(&get_autocomplete_string_from_schema(item)?); - } - } else { - anyhow::bail!("unknown subschemas: {:#?}", subschemas); - } - - return Ok(fn_docs); - } - - if let Some(schemars::schema::SingleOrVec::Single(single)) = &o.instance_type { - if schemars::schema::InstanceType::Boolean == **single { - return Ok(Primitive::Bool.to_string()); - } else if schemars::schema::InstanceType::String == **single - || schemars::schema::InstanceType::Null == **single - { - return Ok(Primitive::String.to_string()); - } - } - - anyhow::bail!("unknown type: {:#?}", o) - } - schemars::schema::Schema::Bool(_) => Ok(Primitive::Bool.to_string()), - } -} - #[cfg(test)] mod tests { use pretty_assertions::assert_eq; - use super::StdLibFn; use crate::docs::kcl_doc::{self, DocData}; - #[test] - fn test_serialize_function() { - let some_function = crate::parsing::ast::types::Function::StdLib { - func: Box::new(crate::std::sketch::Line), - }; - let serialized = serde_json::to_string(&some_function).unwrap(); - assert!(serialized.contains(r#"{"type":"StdLib""#)); - } - - #[test] - fn test_deserialize_function() { - let some_function_string = r#"{"type":"StdLib","func":{"name":"line","keywordArguments":false,"summary":"","description":"","tags":[],"returnValue":{"type":"","required":false,"name":"","schema":{},"schemaDefinitions":{}},"args":[],"unpublished":false,"deprecated":false, "examples": []}}"#; - let some_function: crate::parsing::ast::types::Function = serde_json::from_str(some_function_string).unwrap(); - - assert_eq!( - some_function, - crate::parsing::ast::types::Function::StdLib { - func: Box::new(crate::std::sketch::Line) - } - ); - } - #[test] fn get_autocomplete_snippet_line() { - let line_fn: Box = Box::new(crate::std::sketch::Line); - let snippet = line_fn.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"line(${0:%}, end = [${1:3.14}, ${2:3.14}])"#); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("line").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"line(end = [${0:0}, ${1:0}])"#); } #[test] fn get_autocomplete_snippet_extrude() { - let extrude_fn: Box = Box::new(crate::std::extrude::Extrude); - let snippet = extrude_fn.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"extrude(${0:%}, length = ${1:3.14})"#); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("extrude").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"extrude(length = ${0:10})"#); } #[test] @@ -993,16 +42,22 @@ mod tests { #[test] fn get_autocomplete_snippet_start_sketch_on() { - let start_sketch_on_fn: Box = Box::new(crate::std::sketch::StartSketchOn); - let snippet = start_sketch_on_fn.to_autocomplete_snippet().unwrap(); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("startSketchOn").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); assert_eq!(snippet, r#"startSketchOn(${0:XY})"#); } #[test] fn get_autocomplete_snippet_start_profile() { - let start_sketch_on_fn: Box = Box::new(crate::std::sketch::StartProfile); - let snippet = start_sketch_on_fn.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"startProfile(${0:%}, at = [${1:0}, ${2:0}])"#); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("startProfile").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"startProfile(at = [${0:0}, ${1:0}])"#); } #[test] @@ -1044,11 +99,14 @@ mod tests { #[test] fn get_autocomplete_snippet_arc() { - let arc_fn: Box = Box::new(crate::std::sketch::Arc); - let snippet = arc_fn.to_autocomplete_snippet().unwrap(); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("arc").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); assert_eq!( snippet, - r#"arc(${0:%}, angleStart = ${1:3.14}, angleEnd = ${2:3.14}, radius = ${3:3.14})"# + r#"arc(angleStart = ${0:10}, angleEnd = ${1:10}, diameter = ${2:10})"# ); } @@ -1064,11 +122,14 @@ mod tests { #[test] fn get_autocomplete_snippet_pattern_linear_2d() { - let pattern_fn: Box = Box::new(crate::std::patterns::PatternLinear2D); - let snippet = pattern_fn.to_autocomplete_snippet().unwrap(); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("patternLinear2d").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); assert_eq!( snippet, - r#"patternLinear2d(${0:%}, instances = ${1:10}, distance = ${2:3.14}, axis = [${3:1}, ${4:0}])"# + r#"patternLinear2d(instances = ${0:10}, distance = ${1:10}, axis = [${2:1}, ${3:0}])"# ); } @@ -1079,28 +140,27 @@ mod tests { panic!(); }; let snippet = helix_fn.to_autocomplete_snippet(); - assert_eq!(snippet, r#"appearance(color = ${0:"ff0000"})"#); + assert_eq!(snippet, "appearance(color = ${0:\"#ff0000\"})"); } #[test] fn get_autocomplete_snippet_loft() { - let loft_fn: Box = Box::new(crate::std::loft::Loft); - let snippet = loft_fn.to_autocomplete_snippet().unwrap(); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("loft").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); assert_eq!(snippet, r#"loft([${0:sketch000}, ${1:sketch001}])"#); } #[test] fn get_autocomplete_snippet_sweep() { - let sweep_fn: Box = Box::new(crate::std::sweep::Sweep); - let snippet = sweep_fn.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"sweep(${0:%}, path = ${1:sketch000})"#); - } - - #[test] - fn get_autocomplete_snippet_hole() { - let f: Box = Box::new(crate::std::sketch::Subtract2D); - let snippet = f.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"subtract2d(${0:%}, tool = ${1:%})"#); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("sweep").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"sweep(path = ${0:sketch000})"#); } #[test] @@ -1148,41 +208,42 @@ mod tests { #[test] fn get_autocomplete_snippet_get_common_edge() { - let get_common_edge_fn: Box = Box::new(crate::std::edge::GetCommonEdge); - let snippet = get_common_edge_fn.to_autocomplete_snippet().unwrap(); - assert_eq!( - snippet, - r#"getCommonEdge(faces = [{ - value = ${0:"string"}, -}])"# - ); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("getCommonEdge").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"getCommonEdge(faces = [${0:tag}, ${1:tag}])"#); } #[test] fn get_autocomplete_snippet_scale() { - let scale_fn: Box = Box::new(crate::std::transform::Scale); - let snippet = scale_fn.to_autocomplete_snippet().unwrap(); - assert_eq!(snippet, r#"scale(${0:%}, x = ${1:3.14}, y = ${2:3.14}, z = ${3:3.14})"#); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("scale").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"scale(x = ${0:10}, y = ${1:10}, z = ${2:10})"#); } #[test] fn get_autocomplete_snippet_translate() { - let translate_fn: Box = Box::new(crate::std::transform::Translate); - let snippet = translate_fn.to_autocomplete_snippet().unwrap(); - assert_eq!( - snippet, - r#"translate(${0:%}, x = ${1:3.14}, y = ${2:3.14}, z = ${3:3.14})"# - ); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("translate").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"translate(x = ${0:10}, y = ${1:10}, z = ${2:10})"#); } #[test] fn get_autocomplete_snippet_rotate() { - let rotate_fn: Box = Box::new(crate::std::transform::Rotate); - let snippet = rotate_fn.to_autocomplete_snippet().unwrap(); - assert_eq!( - snippet, - r#"rotate(${0:%}, roll = ${1:3.14}, pitch = ${2:3.14}, yaw = ${3:3.14})"# - ); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("rotate").unwrap() else { + panic!(); + }; + let snippet = data.to_autocomplete_snippet(); + assert_eq!(snippet, r#"rotate(roll = ${0:10}, pitch = ${1:10}, yaw = ${2:10})"#); } #[test] @@ -1206,36 +267,23 @@ mod tests { assert_eq!(snippet, r#"offsetPlane(${0:XY}, offset = ${1:10})"#); } - // We want to test the snippets we compile at lsp start. - #[test] - fn get_all_stdlib_autocomplete_snippets() { - let stdlib = crate::std::StdLib::new(); - let kcl_std = crate::docs::kcl_doc::walk_prelude(); - crate::lsp::kcl::get_completions_from_stdlib(&stdlib, &kcl_std).unwrap(); - } - - // We want to test the signatures we compile at lsp start. - #[test] - fn get_all_stdlib_signatures() { - let stdlib = crate::std::StdLib::new(); - let kcl_std = crate::docs::kcl_doc::walk_prelude(); - crate::lsp::kcl::get_signatures_from_stdlib(&stdlib, &kcl_std); - } - #[test] fn get_extrude_signature_help() { - let extrude_fn: Box = Box::new(crate::std::extrude::Extrude); - let sh = extrude_fn.to_signature_help(); + let data = kcl_doc::walk_prelude(); + let DocData::Fn(data) = data.find_by_name("extrude").unwrap() else { + panic!(); + }; + let sh = data.to_signature_help(); assert_eq!( sh.signatures[0].label, r#"extrude( - @sketches: [Sketch], - length: number, + @sketches: [Sketch; 1+], + length: number(Length), symmetric?: bool, - bidirectionalLength?: number, - tagStart?: TagNode, - tagEnd?: TagNode, -): [Solid]"# + bidirectionalLength?: number(Length), + tagStart?: tag, + tagEnd?: tag, +): [Solid; 1+]"# ); } } diff --git a/rust/kcl-lib/src/engine/conn.rs b/rust/kcl-lib/src/engine/conn.rs index c00b61104..21036a346 100644 --- a/rust/kcl-lib/src/engine/conn.rs +++ b/rust/kcl-lib/src/engine/conn.rs @@ -67,6 +67,7 @@ pub struct TcpRead { /// Occurs when client couldn't read from the WebSocket to the engine. // #[derive(Debug)] +#[allow(clippy::large_enum_variant)] pub enum WebSocketReadError { /// Could not read a message due to WebSocket errors. Read(tokio_tungstenite::tungstenite::Error), @@ -206,7 +207,7 @@ impl EngineConnection { async fn inner_send_to_engine(request: WebSocketRequest, tcp_write: &mut WebSocketTcpWrite) -> Result<()> { let msg = serde_json::to_string(&request).map_err(|e| anyhow!("could not serialize json: {e}"))?; tcp_write - .send(WsMsg::Text(msg)) + .send(WsMsg::Text(msg.into())) .await .map_err(|e| anyhow!("could not send json over websocket: {e}"))?; Ok(()) @@ -216,19 +217,17 @@ impl EngineConnection { async fn inner_send_to_engine_binary(request: WebSocketRequest, tcp_write: &mut WebSocketTcpWrite) -> Result<()> { let msg = bson::to_vec(&request).map_err(|e| anyhow!("could not serialize bson: {e}"))?; tcp_write - .send(WsMsg::Binary(msg)) + .send(WsMsg::Binary(msg.into())) .await .map_err(|e| anyhow!("could not send json over websocket: {e}"))?; Ok(()) } pub async fn new(ws: reqwest::Upgraded) -> Result { - let wsconfig = tokio_tungstenite::tungstenite::protocol::WebSocketConfig { + let wsconfig = tokio_tungstenite::tungstenite::protocol::WebSocketConfig::default() // 4294967296 bytes, which is around 4.2 GB. - max_message_size: Some(usize::MAX), - max_frame_size: Some(usize::MAX), - ..Default::default() - }; + .max_message_size(Some(usize::MAX)) + .max_frame_size(Some(usize::MAX)); let ws_stream = tokio_tungstenite::WebSocketStream::from_raw_socket( ws, @@ -439,7 +438,7 @@ impl EngineManager for EngineConnection { request_sent: tx, }) .await - .map_err(|e| KclError::Engine(KclErrorDetails::new(format!("Failed to send debug: {}", e), vec![])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(format!("Failed to send debug: {}", e), vec![])))?; let _ = rx.await; Ok(()) @@ -474,7 +473,7 @@ impl EngineManager for EngineConnection { }) .await .map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to send modeling command: {}", e), vec![source_range], )) @@ -483,13 +482,13 @@ impl EngineManager for EngineConnection { // Wait for the request to be sent. rx.await .map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("could not send request to the engine actor: {e}"), vec![source_range], )) })? .map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("could not send request to the engine: {e}"), vec![source_range], )) @@ -516,12 +515,12 @@ impl EngineManager for EngineConnection { // Check if we have any pending errors. let pe = self.pending_errors.read().await; if !pe.is_empty() { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( pe.join(", ").to_string(), vec![source_range], ))); } else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( "Modeling command failed: websocket closed early".to_string(), vec![source_range], ))); @@ -543,7 +542,7 @@ impl EngineManager for EngineConnection { } } - Err(KclError::Engine(KclErrorDetails::new( + Err(KclError::new_engine(KclErrorDetails::new( format!("Modeling command timed out `{}`", id), vec![source_range], ))) diff --git a/rust/kcl-lib/src/engine/conn_wasm.rs b/rust/kcl-lib/src/engine/conn_wasm.rs index ccbc93fa5..35b957c12 100644 --- a/rust/kcl-lib/src/engine/conn_wasm.rs +++ b/rust/kcl-lib/src/engine/conn_wasm.rs @@ -80,12 +80,12 @@ impl ResponseContext { } // Add a response to the context. - pub async fn send_response(&self, data: js_sys::Uint8Array) -> Result<(), JsValue> { + pub async fn send_response(&self, data: js_sys::Uint8Array) { let ws_result: WebSocketResponse = match bson::from_slice(&data.to_vec()) { Ok(res) => res, Err(_) => { // We don't care about the error if we can't parse it. - return Ok(()); + return; } }; @@ -96,13 +96,11 @@ impl ResponseContext { let Some(id) = id else { // We only care if we have an id. - return Ok(()); + return; }; // Add this response to our responses. self.add(id, ws_result.clone()).await; - - Ok(()) } } @@ -147,19 +145,19 @@ impl EngineConnection { id_to_source_range: HashMap, ) -> Result<(), KclError> { let source_range_str = serde_json::to_string(&source_range).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to serialize source range: {:?}", e), vec![source_range], )) })?; let cmd_str = serde_json::to_string(&cmd).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to serialize modeling command: {:?}", e), vec![source_range], )) })?; let id_to_source_range_str = serde_json::to_string(&id_to_source_range).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to serialize id to source range: {:?}", e), vec![source_range], )) @@ -167,7 +165,7 @@ impl EngineConnection { self.manager .fire_modeling_cmd_from_wasm(id.to_string(), source_range_str, cmd_str, id_to_source_range_str) - .map_err(|e| KclError::Engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; Ok(()) } @@ -180,19 +178,19 @@ impl EngineConnection { id_to_source_range: HashMap, ) -> Result { let source_range_str = serde_json::to_string(&source_range).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to serialize source range: {:?}", e), vec![source_range], )) })?; let cmd_str = serde_json::to_string(&cmd).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to serialize modeling command: {:?}", e), vec![source_range], )) })?; let id_to_source_range_str = serde_json::to_string(&id_to_source_range).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to serialize id to source range: {:?}", e), vec![source_range], )) @@ -201,7 +199,7 @@ impl EngineConnection { let promise = self .manager .send_modeling_cmd_from_wasm(id.to_string(), source_range_str, cmd_str, id_to_source_range_str) - .map_err(|e| KclError::Engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; let value = crate::wasm::JsFuture::from(promise).await.map_err(|e| { // Try to parse the error as an engine error. @@ -209,7 +207,7 @@ impl EngineConnection { if let Ok(kittycad_modeling_cmds::websocket::FailureWebSocketResponse { errors, .. }) = serde_json::from_str(&err_str) { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( errors.iter().map(|e| e.message.clone()).collect::>().join("\n"), vec![source_range], )) @@ -218,7 +216,7 @@ impl EngineConnection { { if let Some(data) = data.first() { // It could also be an array of responses. - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( data.errors .iter() .map(|e| e.message.clone()) @@ -227,13 +225,13 @@ impl EngineConnection { vec![source_range], )) } else { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( "Received empty response from engine".into(), vec![source_range], )) } } else { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to wait for promise from send modeling command: {:?}", e), vec![source_range], )) @@ -241,7 +239,7 @@ impl EngineConnection { })?; if value.is_null() || value.is_undefined() { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( "Received null or undefined response from engine".into(), vec![source_range], ))); @@ -251,7 +249,7 @@ impl EngineConnection { let data = js_sys::Uint8Array::from(value); let ws_result: WebSocketResponse = bson::from_slice(&data.to_vec()).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to deserialize bson response from engine: {:?}", e), vec![source_range], )) @@ -308,10 +306,10 @@ impl crate::engine::EngineManager for EngineConnection { let promise = self .manager .start_new_session() - .map_err(|e| KclError::Engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; crate::wasm::JsFuture::from(promise).await.map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to wait for promise from start new session: {:?}", e), vec![source_range], )) diff --git a/rust/kcl-lib/src/engine/mod.rs b/rust/kcl-lib/src/engine/mod.rs index 935e55871..564d5bd16 100644 --- a/rust/kcl-lib/src/engine/mod.rs +++ b/rust/kcl-lib/src/engine/mod.rs @@ -276,7 +276,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { { let duration = instant::Duration::from_millis(1); wasm_timer::Delay::new(duration).await.map_err(|err| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Failed to sleep: {:?}", err), vec![source_range], )) @@ -293,7 +293,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { return Ok(response); } - Err(KclError::Engine(KclErrorDetails::new( + Err(KclError::new_engine(KclErrorDetails::new( "async command timed out".to_string(), vec![source_range], ))) @@ -547,7 +547,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { id_to_source_range.insert(Uuid::from(*cmd_id), *range); } _ => { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!("The request is not a modeling command: {:?}", req), vec![*range], ))); @@ -595,7 +595,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { self.parse_batch_responses(last_id.into(), id_to_source_range, responses) } else { // We should never get here. - Err(KclError::Engine(KclErrorDetails::new( + Err(KclError::new_engine(KclErrorDetails::new( format!("Failed to get batch response: {:?}", response), vec![source_range], ))) @@ -610,7 +610,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // request so we need the original request source range in case the engine returns // an error. let source_range = id_to_source_range.get(cmd_id.as_ref()).cloned().ok_or_else(|| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to get source range for command ID: {:?}", cmd_id), vec![], )) @@ -620,7 +620,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { .await?; self.parse_websocket_response(ws_resp, source_range) } - _ => Err(KclError::Engine(KclErrorDetails::new( + _ => Err(KclError::new_engine(KclErrorDetails::new( format!("The final request is not a modeling command: {:?}", final_req), vec![source_range], ))), @@ -729,7 +729,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { for (name, plane_id, color) in plane_settings { let info = DEFAULT_PLANE_INFO.get(&name).ok_or_else(|| { // We should never get here. - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to get default plane info for: {:?}", name), vec![source_range], )) @@ -763,7 +763,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { WebSocketResponse::Success(success) => Ok(success.resp), WebSocketResponse::Failure(fail) => { let _request_id = fail.request_id; - Err(KclError::Engine(KclErrorDetails::new( + Err(KclError::new_engine(KclErrorDetails::new( fail.errors .iter() .map(|e| e.message.clone()) @@ -805,12 +805,12 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { BatchResponse::Failure { errors } => { // Get the source range for the command. let source_range = id_to_source_range.get(cmd_id).cloned().ok_or_else(|| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to get source range for command ID: {:?}", cmd_id), vec![], )) })?; - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( errors.iter().map(|e| e.message.clone()).collect::>().join("\n"), vec![source_range], ))); @@ -820,7 +820,7 @@ pub trait EngineManager: std::fmt::Debug + Send + Sync + 'static { // Return an error that we did not get an error or the response we wanted. // This should never happen but who knows. - Err(KclError::Engine(KclErrorDetails::new( + Err(KclError::new_engine(KclErrorDetails::new( format!("Failed to find response for command ID: {:?}", id), vec![], ))) diff --git a/rust/kcl-lib/src/errors.rs b/rust/kcl-lib/src/errors.rs index b142d2978..68932ba7e 100644 --- a/rust/kcl-lib/src/errors.rs +++ b/rust/kcl-lib/src/errors.rs @@ -91,30 +91,33 @@ pub enum ConnectionError { #[ts(export)] #[serde(tag = "kind", rename_all = "snake_case")] pub enum KclError { - #[error("lexical: {0:?}")] - Lexical(KclErrorDetails), - #[error("syntax: {0:?}")] - Syntax(KclErrorDetails), - #[error("semantic: {0:?}")] - Semantic(KclErrorDetails), - #[error("import cycle: {0:?}")] - ImportCycle(KclErrorDetails), - #[error("type: {0:?}")] - Type(KclErrorDetails), - #[error("i/o: {0:?}")] - Io(KclErrorDetails), - #[error("unexpected: {0:?}")] - Unexpected(KclErrorDetails), - #[error("value already defined: {0:?}")] - ValueAlreadyDefined(KclErrorDetails), - #[error("undefined value: {0:?}")] - UndefinedValue(KclErrorDetails), - #[error("invalid expression: {0:?}")] - InvalidExpression(KclErrorDetails), - #[error("engine: {0:?}")] - Engine(KclErrorDetails), - #[error("internal error, please report to KittyCAD team: {0:?}")] - Internal(KclErrorDetails), + #[error("lexical: {details:?}")] + Lexical { details: KclErrorDetails }, + #[error("syntax: {details:?}")] + Syntax { details: KclErrorDetails }, + #[error("semantic: {details:?}")] + Semantic { details: KclErrorDetails }, + #[error("import cycle: {details:?}")] + ImportCycle { details: KclErrorDetails }, + #[error("type: {details:?}")] + Type { details: KclErrorDetails }, + #[error("i/o: {details:?}")] + Io { details: KclErrorDetails }, + #[error("unexpected: {details:?}")] + Unexpected { details: KclErrorDetails }, + #[error("value already defined: {details:?}")] + ValueAlreadyDefined { details: KclErrorDetails }, + #[error("undefined value: {details:?}")] + UndefinedValue { + details: KclErrorDetails, + name: Option, + }, + #[error("invalid expression: {details:?}")] + InvalidExpression { details: KclErrorDetails }, + #[error("engine: {details:?}")] + Engine { details: KclErrorDetails }, + #[error("internal error, please report to KittyCAD team: {details:?}")] + Internal { details: KclErrorDetails }, } impl From for KclError { @@ -296,18 +299,18 @@ pub struct ReportWithOutputs { impl miette::Diagnostic for ReportWithOutputs { fn code<'a>(&'a self) -> Option> { let family = match self.error.error { - KclError::Lexical(_) => "Lexical", - KclError::Syntax(_) => "Syntax", - KclError::Semantic(_) => "Semantic", - KclError::ImportCycle(_) => "ImportCycle", - KclError::Type(_) => "Type", - KclError::Io(_) => "I/O", - KclError::Unexpected(_) => "Unexpected", - KclError::ValueAlreadyDefined(_) => "ValueAlreadyDefined", - KclError::UndefinedValue(_) => "UndefinedValue", - KclError::InvalidExpression(_) => "InvalidExpression", - KclError::Engine(_) => "Engine", - KclError::Internal(_) => "Internal", + KclError::Lexical { .. } => "Lexical", + KclError::Syntax { .. } => "Syntax", + KclError::Semantic { .. } => "Semantic", + KclError::ImportCycle { .. } => "ImportCycle", + KclError::Type { .. } => "Type", + KclError::Io { .. } => "I/O", + KclError::Unexpected { .. } => "Unexpected", + KclError::ValueAlreadyDefined { .. } => "ValueAlreadyDefined", + KclError::UndefinedValue { .. } => "UndefinedValue", + KclError::InvalidExpression { .. } => "InvalidExpression", + KclError::Engine { .. } => "Engine", + KclError::Internal { .. } => "Internal", }; let error_string = format!("KCL {family} error"); Some(Box::new(error_string)) @@ -346,18 +349,18 @@ pub struct Report { impl miette::Diagnostic for Report { fn code<'a>(&'a self) -> Option> { let family = match self.error { - KclError::Lexical(_) => "Lexical", - KclError::Syntax(_) => "Syntax", - KclError::Semantic(_) => "Semantic", - KclError::ImportCycle(_) => "ImportCycle", - KclError::Type(_) => "Type", - KclError::Io(_) => "I/O", - KclError::Unexpected(_) => "Unexpected", - KclError::ValueAlreadyDefined(_) => "ValueAlreadyDefined", - KclError::UndefinedValue(_) => "UndefinedValue", - KclError::InvalidExpression(_) => "InvalidExpression", - KclError::Engine(_) => "Engine", - KclError::Internal(_) => "Internal", + KclError::Lexical { .. } => "Lexical", + KclError::Syntax { .. } => "Syntax", + KclError::Semantic { .. } => "Semantic", + KclError::ImportCycle { .. } => "ImportCycle", + KclError::Type { .. } => "Type", + KclError::Io { .. } => "I/O", + KclError::Unexpected { .. } => "Unexpected", + KclError::ValueAlreadyDefined { .. } => "ValueAlreadyDefined", + KclError::UndefinedValue { .. } => "UndefinedValue", + KclError::InvalidExpression { .. } => "InvalidExpression", + KclError::Engine { .. } => "Engine", + KclError::Internal { .. } => "Internal", }; let error_string = format!("KCL {family} error"); Some(Box::new(error_string)) @@ -410,11 +413,53 @@ impl KclErrorDetails { impl KclError { pub fn internal(message: String) -> KclError { - KclError::Internal(KclErrorDetails { - source_ranges: Default::default(), - backtrace: Default::default(), - message, - }) + KclError::Internal { + details: KclErrorDetails { + source_ranges: Default::default(), + backtrace: Default::default(), + message, + }, + } + } + + pub fn new_internal(details: KclErrorDetails) -> KclError { + KclError::Internal { details } + } + + pub fn new_import_cycle(details: KclErrorDetails) -> KclError { + KclError::ImportCycle { details } + } + + pub fn new_semantic(details: KclErrorDetails) -> KclError { + KclError::Semantic { details } + } + + pub fn new_value_already_defined(details: KclErrorDetails) -> KclError { + KclError::ValueAlreadyDefined { details } + } + + pub fn new_syntax(details: KclErrorDetails) -> KclError { + KclError::Syntax { details } + } + + pub fn new_io(details: KclErrorDetails) -> KclError { + KclError::Io { details } + } + + pub fn new_engine(details: KclErrorDetails) -> KclError { + KclError::Engine { details } + } + + pub fn new_lexical(details: KclErrorDetails) -> KclError { + KclError::Lexical { details } + } + + pub fn new_undefined_value(details: KclErrorDetails, name: Option) -> KclError { + KclError::UndefinedValue { details, name } + } + + pub fn new_type(details: KclErrorDetails) -> KclError { + KclError::Type { details } } /// Get the error message. @@ -424,88 +469,88 @@ impl KclError { pub fn error_type(&self) -> &'static str { match self { - KclError::Lexical(_) => "lexical", - KclError::Syntax(_) => "syntax", - KclError::Semantic(_) => "semantic", - KclError::ImportCycle(_) => "import cycle", - KclError::Type(_) => "type", - KclError::Io(_) => "i/o", - KclError::Unexpected(_) => "unexpected", - KclError::ValueAlreadyDefined(_) => "value already defined", - KclError::UndefinedValue(_) => "undefined value", - KclError::InvalidExpression(_) => "invalid expression", - KclError::Engine(_) => "engine", - KclError::Internal(_) => "internal", + KclError::Lexical { .. } => "lexical", + KclError::Syntax { .. } => "syntax", + KclError::Semantic { .. } => "semantic", + KclError::ImportCycle { .. } => "import cycle", + KclError::Type { .. } => "type", + KclError::Io { .. } => "i/o", + KclError::Unexpected { .. } => "unexpected", + KclError::ValueAlreadyDefined { .. } => "value already defined", + KclError::UndefinedValue { .. } => "undefined value", + KclError::InvalidExpression { .. } => "invalid expression", + KclError::Engine { .. } => "engine", + KclError::Internal { .. } => "internal", } } pub fn source_ranges(&self) -> Vec { match &self { - KclError::Lexical(e) => e.source_ranges.clone(), - KclError::Syntax(e) => e.source_ranges.clone(), - KclError::Semantic(e) => e.source_ranges.clone(), - KclError::ImportCycle(e) => e.source_ranges.clone(), - KclError::Type(e) => e.source_ranges.clone(), - KclError::Io(e) => e.source_ranges.clone(), - KclError::Unexpected(e) => e.source_ranges.clone(), - KclError::ValueAlreadyDefined(e) => e.source_ranges.clone(), - KclError::UndefinedValue(e) => e.source_ranges.clone(), - KclError::InvalidExpression(e) => e.source_ranges.clone(), - KclError::Engine(e) => e.source_ranges.clone(), - KclError::Internal(e) => e.source_ranges.clone(), + KclError::Lexical { details: e } => e.source_ranges.clone(), + KclError::Syntax { details: e } => e.source_ranges.clone(), + KclError::Semantic { details: e } => e.source_ranges.clone(), + KclError::ImportCycle { details: e } => e.source_ranges.clone(), + KclError::Type { details: e } => e.source_ranges.clone(), + KclError::Io { details: e } => e.source_ranges.clone(), + KclError::Unexpected { details: e } => e.source_ranges.clone(), + KclError::ValueAlreadyDefined { details: e } => e.source_ranges.clone(), + KclError::UndefinedValue { details: e, .. } => e.source_ranges.clone(), + KclError::InvalidExpression { details: e } => e.source_ranges.clone(), + KclError::Engine { details: e } => e.source_ranges.clone(), + KclError::Internal { details: e } => e.source_ranges.clone(), } } /// Get the inner error message. pub fn message(&self) -> &str { match &self { - KclError::Lexical(e) => &e.message, - KclError::Syntax(e) => &e.message, - KclError::Semantic(e) => &e.message, - KclError::ImportCycle(e) => &e.message, - KclError::Type(e) => &e.message, - KclError::Io(e) => &e.message, - KclError::Unexpected(e) => &e.message, - KclError::ValueAlreadyDefined(e) => &e.message, - KclError::UndefinedValue(e) => &e.message, - KclError::InvalidExpression(e) => &e.message, - KclError::Engine(e) => &e.message, - KclError::Internal(e) => &e.message, + KclError::Lexical { details: e } => &e.message, + KclError::Syntax { details: e } => &e.message, + KclError::Semantic { details: e } => &e.message, + KclError::ImportCycle { details: e } => &e.message, + KclError::Type { details: e } => &e.message, + KclError::Io { details: e } => &e.message, + KclError::Unexpected { details: e } => &e.message, + KclError::ValueAlreadyDefined { details: e } => &e.message, + KclError::UndefinedValue { details: e, .. } => &e.message, + KclError::InvalidExpression { details: e } => &e.message, + KclError::Engine { details: e } => &e.message, + KclError::Internal { details: e } => &e.message, } } pub fn backtrace(&self) -> Vec { match self { - KclError::Lexical(e) - | KclError::Syntax(e) - | KclError::Semantic(e) - | KclError::ImportCycle(e) - | KclError::Type(e) - | KclError::Io(e) - | KclError::Unexpected(e) - | KclError::ValueAlreadyDefined(e) - | KclError::UndefinedValue(e) - | KclError::InvalidExpression(e) - | KclError::Engine(e) - | KclError::Internal(e) => e.backtrace.clone(), + KclError::Lexical { details: e } + | KclError::Syntax { details: e } + | KclError::Semantic { details: e } + | KclError::ImportCycle { details: e } + | KclError::Type { details: e } + | KclError::Io { details: e } + | KclError::Unexpected { details: e } + | KclError::ValueAlreadyDefined { details: e } + | KclError::UndefinedValue { details: e, .. } + | KclError::InvalidExpression { details: e } + | KclError::Engine { details: e } + | KclError::Internal { details: e } => e.backtrace.clone(), } } pub(crate) fn override_source_ranges(&self, source_ranges: Vec) -> Self { let mut new = self.clone(); match &mut new { - KclError::Lexical(e) - | KclError::Syntax(e) - | KclError::Semantic(e) - | KclError::ImportCycle(e) - | KclError::Type(e) - | KclError::Io(e) - | KclError::Unexpected(e) - | KclError::ValueAlreadyDefined(e) - | KclError::UndefinedValue(e) - | KclError::InvalidExpression(e) - | KclError::Engine(e) - | KclError::Internal(e) => { + KclError::Lexical { details: e } + | KclError::Syntax { details: e } + | KclError::Semantic { details: e } + | KclError::ImportCycle { details: e } + | KclError::Type { details: e } + | KclError::Io { details: e } + | KclError::Unexpected { details: e } + | KclError::ValueAlreadyDefined { details: e } + | KclError::UndefinedValue { details: e, .. } + | KclError::InvalidExpression { details: e } + | KclError::Engine { details: e } + | KclError::Internal { details: e } => { e.backtrace = source_ranges .iter() .map(|s| BacktraceItem { @@ -520,45 +565,21 @@ impl KclError { new } - pub(crate) fn set_last_backtrace_fn_name(&self, last_fn_name: Option) -> Self { - let mut new = self.clone(); - match &mut new { - KclError::Lexical(e) - | KclError::Syntax(e) - | KclError::Semantic(e) - | KclError::ImportCycle(e) - | KclError::Type(e) - | KclError::Io(e) - | KclError::Unexpected(e) - | KclError::ValueAlreadyDefined(e) - | KclError::UndefinedValue(e) - | KclError::InvalidExpression(e) - | KclError::Engine(e) - | KclError::Internal(e) => { - if let Some(item) = e.backtrace.last_mut() { - item.fn_name = last_fn_name; - } - } - } - - new - } - pub(crate) fn add_unwind_location(&self, last_fn_name: Option, source_range: SourceRange) -> Self { let mut new = self.clone(); match &mut new { - KclError::Lexical(e) - | KclError::Syntax(e) - | KclError::Semantic(e) - | KclError::ImportCycle(e) - | KclError::Type(e) - | KclError::Io(e) - | KclError::Unexpected(e) - | KclError::ValueAlreadyDefined(e) - | KclError::UndefinedValue(e) - | KclError::InvalidExpression(e) - | KclError::Engine(e) - | KclError::Internal(e) => { + KclError::Lexical { details: e } + | KclError::Syntax { details: e } + | KclError::Semantic { details: e } + | KclError::ImportCycle { details: e } + | KclError::Type { details: e } + | KclError::Io { details: e } + | KclError::Unexpected { details: e } + | KclError::ValueAlreadyDefined { details: e } + | KclError::UndefinedValue { details: e, .. } + | KclError::InvalidExpression { details: e } + | KclError::Engine { details: e } + | KclError::Internal { details: e } => { if let Some(item) = e.backtrace.last_mut() { item.fn_name = last_fn_name; } @@ -645,7 +666,7 @@ impl From for KclError { #[cfg(feature = "pyo3")] impl From for KclError { fn from(error: pyo3::PyErr) -> Self { - KclError::Internal(KclErrorDetails { + KclError::new_internal(KclErrorDetails { source_ranges: vec![], backtrace: Default::default(), message: error.to_string(), diff --git a/rust/kcl-lib/src/execution/annotations.rs b/rust/kcl-lib/src/execution/annotations.rs index 5e53c78c8..8344494ea 100644 --- a/rust/kcl-lib/src/execution/annotations.rs +++ b/rust/kcl-lib/src/execution/annotations.rs @@ -70,7 +70,7 @@ pub(super) fn expect_properties<'a>( ) -> Result<&'a [Node], KclError> { assert_eq!(annotation.name().unwrap(), for_key); Ok(&**annotation.properties.as_ref().ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Empty `{for_key}` annotation"), vec![annotation.as_source_range()], )) @@ -84,7 +84,7 @@ pub(super) fn expect_ident(expr: &Expr) -> Result<&str, KclError> { } } - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( "Unexpected settings value, expected a simple name, e.g., `mm`".to_owned(), vec![expr.into()], ))) @@ -98,7 +98,7 @@ pub(super) fn expect_number(expr: &Expr) -> Result { } } - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( "Unexpected settings value, expected a number, e.g., `1.0`".to_owned(), vec![expr.into()], ))) @@ -113,7 +113,7 @@ pub(super) fn get_impl(annotations: &[Node], source_range: SourceRan if &*p.key.name == IMPL { if let Some(s) = p.value.ident_name() { return Impl::from_str(s).map(Some).map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "Invalid value for {} attribute, expected one of: {}", IMPL, @@ -139,7 +139,7 @@ impl UnitLen { "inch" | "in" => Ok(UnitLen::Inches), "ft" => Ok(UnitLen::Feet), "yd" => Ok(UnitLen::Yards), - value => Err(KclError::Semantic(KclErrorDetails::new( + value => Err(KclError::new_semantic(KclErrorDetails::new( format!( "Unexpected value for length units: `{value}`; expected one of `mm`, `cm`, `m`, `in`, `ft`, `yd`" ), @@ -154,7 +154,7 @@ impl UnitAngle { match s { "deg" => Ok(UnitAngle::Degrees), "rad" => Ok(UnitAngle::Radians), - value => Err(KclError::Semantic(KclErrorDetails::new( + value => Err(KclError::new_semantic(KclErrorDetails::new( format!("Unexpected value for angle units: `{value}`; expected one of `deg`, `rad`"), vec![source_range], ))), diff --git a/rust/kcl-lib/src/execution/artifact.rs b/rust/kcl-lib/src/execution/artifact.rs index c75dbeb15..0189fe0dd 100644 --- a/rust/kcl-lib/src/execution/artifact.rs +++ b/rust/kcl-lib/src/execution/artifact.rs @@ -24,7 +24,7 @@ macro_rules! internal_error { ($range:expr, $($rest:tt)*) => {{ let message = format!($($rest)*); debug_assert!(false, "{}", &message); - return Err(KclError::Internal(KclErrorDetails::new(message, vec![$range]))); + return Err(KclError::new_internal(KclErrorDetails::new(message, vec![$range]))); }}; } @@ -676,6 +676,7 @@ impl EdgeCut { #[serde(rename_all = "camelCase")] pub struct ArtifactGraph { map: IndexMap, + item_count: usize, } impl ArtifactGraph { @@ -711,10 +712,10 @@ pub(super) fn build_artifact_graph( artifact_commands: &[ArtifactCommand], responses: &IndexMap, ast: &Node, - cached_body_items: usize, exec_artifacts: &mut IndexMap, initial_graph: ArtifactGraph, ) -> Result { + let item_count = initial_graph.item_count; let mut map = initial_graph.into_map(); let mut path_to_plane_id_map = FnvHashMap::default(); @@ -725,7 +726,7 @@ pub(super) fn build_artifact_graph( for exec_artifact in exec_artifacts.values_mut() { // Note: We only have access to the new AST. So if these artifacts // somehow came from cached AST, this won't fill in anything. - fill_in_node_paths(exec_artifact, ast, cached_body_items); + fill_in_node_paths(exec_artifact, ast, item_count); } for artifact_command in artifact_commands { @@ -752,7 +753,7 @@ pub(super) fn build_artifact_graph( &flattened_responses, &path_to_plane_id_map, ast, - cached_body_items, + item_count, exec_artifacts, )?; for artifact in artifact_updates { @@ -765,7 +766,10 @@ pub(super) fn build_artifact_graph( merge_artifact_into_map(&mut map, exec_artifact.clone()); } - Ok(ArtifactGraph { map }) + Ok(ArtifactGraph { + map, + item_count: item_count + ast.body.len(), + }) } /// These may have been created with placeholder `CodeRef`s because we didn't @@ -949,7 +953,7 @@ fn artifacts_to_update( ModelingCmd::StartPath(_) => { let mut return_arr = Vec::new(); let current_plane_id = path_to_plane_id_map.get(&artifact_command.cmd_id).ok_or_else(|| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Expected a current plane ID when processing StartPath command, but we have none: {id:?}"), vec![range], )) @@ -1137,7 +1141,7 @@ fn artifacts_to_update( // TODO: Using the first one. Make sure to revisit this // choice, don't think it matters for now. path_id: ArtifactId::new(*loft_cmd.section_ids.first().ok_or_else(|| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Expected at least one section ID in Loft command: {id:?}; cmd={cmd:?}"), vec![range], )) @@ -1180,7 +1184,7 @@ fn artifacts_to_update( }; last_path = Some(path); let path_sweep_id = path.sweep_id.ok_or_else(|| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!( "Expected a sweep ID on the path when processing Solid3dGetExtrusionFaceInfo command, but we have none: {id:?}, {path:?}" ), @@ -1234,7 +1238,7 @@ fn artifacts_to_update( continue; }; let path_sweep_id = path.sweep_id.ok_or_else(|| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!( "Expected a sweep ID on the path when processing last path's Solid3dGetExtrusionFaceInfo command, but we have none: {id:?}, {path:?}" ), diff --git a/rust/kcl-lib/src/execution/cache.rs b/rust/kcl-lib/src/execution/cache.rs index cf36ebed8..327316072 100644 --- a/rust/kcl-lib/src/execution/cache.rs +++ b/rust/kcl-lib/src/execution/cache.rs @@ -6,25 +6,31 @@ use itertools::{EitherOrBoth, Itertools}; use tokio::sync::RwLock; use crate::{ - execution::{annotations, memory::Stack, state::ModuleInfoMap, EnvironmentRef, ExecState, ExecutorSettings}, + execution::{ + annotations, + memory::Stack, + state::{self as exec_state, ModuleInfoMap}, + EnvironmentRef, ExecutorSettings, + }, parsing::ast::types::{Annotation, Node, Program}, walk::Node as WalkNode, + ExecOutcome, ExecutorContext, }; lazy_static::lazy_static! { /// A static mutable lock for updating the last successful execution state for the cache. - static ref OLD_AST: Arc>> = Default::default(); + static ref OLD_AST: Arc>> = Default::default(); // The last successful run's memory. Not cleared after an unssuccessful run. static ref PREV_MEMORY: Arc>> = Default::default(); } /// Read the old ast memory from the lock. -pub(crate) async fn read_old_ast() -> Option { +pub(super) async fn read_old_ast() -> Option { let old_ast = OLD_AST.read().await; old_ast.clone() } -pub(super) async fn write_old_ast(old_state: OldAstState) { +pub(super) async fn write_old_ast(old_state: GlobalState) { let mut old_ast = OLD_AST.write().await; *old_ast = Some(old_state); } @@ -34,7 +40,7 @@ pub(crate) async fn read_old_memory() -> Option<(Stack, ModuleInfoMap)> { old_mem.clone() } -pub(super) async fn write_old_memory(mem: (Stack, ModuleInfoMap)) { +pub(crate) async fn write_old_memory(mem: (Stack, ModuleInfoMap)) { let mut old_mem = PREV_MEMORY.write().await; *old_mem = Some(mem); } @@ -56,16 +62,73 @@ pub struct CacheInformation<'a> { pub settings: &'a ExecutorSettings, } -/// The old ast and program memory. +/// The cached state of the whole program. #[derive(Debug, Clone)] -pub struct OldAstState { - /// The ast. - pub ast: Node, +pub(super) struct GlobalState { + pub(super) main: ModuleState, /// The exec state. - pub exec_state: ExecState, + pub(super) exec_state: exec_state::GlobalState, /// The last settings used for execution. - pub settings: crate::execution::ExecutorSettings, - pub result_env: EnvironmentRef, + pub(super) settings: ExecutorSettings, +} + +impl GlobalState { + pub fn new( + state: exec_state::ExecState, + settings: ExecutorSettings, + ast: Node, + result_env: EnvironmentRef, + ) -> Self { + Self { + main: ModuleState { + ast, + exec_state: state.mod_local, + result_env, + }, + exec_state: state.global, + settings, + } + } + + pub fn with_settings(mut self, settings: ExecutorSettings) -> GlobalState { + self.settings = settings; + self + } + + pub fn reconstitute_exec_state(&self) -> exec_state::ExecState { + exec_state::ExecState { + global: self.exec_state.clone(), + mod_local: self.main.exec_state.clone(), + } + } + + pub async fn into_exec_outcome(self, ctx: &ExecutorContext) -> ExecOutcome { + // Fields are opt-in so that we don't accidentally leak private internal + // state when we add more to ExecState. + ExecOutcome { + variables: self.main.exec_state.variables(self.main.result_env), + filenames: self.exec_state.filenames(), + #[cfg(feature = "artifact-graph")] + operations: self.exec_state.artifacts.operations, + #[cfg(feature = "artifact-graph")] + artifact_commands: self.exec_state.artifacts.commands, + #[cfg(feature = "artifact-graph")] + artifact_graph: self.exec_state.artifacts.graph, + errors: self.exec_state.errors, + default_planes: ctx.engine.get_default_planes().read().await.clone(), + } + } +} + +/// Per-module cached state +#[derive(Debug, Clone)] +pub(super) struct ModuleState { + /// The AST of the module. + pub(super) ast: Node, + /// The ExecState of the module. + pub(super) exec_state: exec_state::ModuleState, + /// The memory env for the module. + pub(super) result_env: EnvironmentRef, } /// The result of a cache check. @@ -79,9 +142,6 @@ pub(super) enum CacheResult { reapply_settings: bool, /// The program that needs to be executed. program: Node, - /// The number of body items that were cached and omitted from the - /// program that needs to be executed. Used to compute [`crate::NodePath`]. - cached_body_items: usize, }, /// Check only the imports, and not the main program. /// Before sending this we already checked the main program and it is the same. @@ -146,7 +206,6 @@ pub(super) async fn get_changed_program(old: CacheInformation<'_>, new: CacheInf // We know they have the same imports because the ast is the same. // If we have no imports, we can skip this. if !old.ast.has_import_statements() { - println!("No imports, no need to check."); return CacheResult::NoAction(reapply_settings); } @@ -194,7 +253,6 @@ pub(super) async fn get_changed_program(old: CacheInformation<'_>, new: CacheInf clear_scene: true, reapply_settings: true, program: new.ast.clone(), - cached_body_items: 0, }; } @@ -223,7 +281,6 @@ fn generate_changed_program(old_ast: Node, mut new_ast: Node, clear_scene: true, reapply_settings, program: new_ast, - cached_body_items: 0, }; } @@ -244,7 +301,6 @@ fn generate_changed_program(old_ast: Node, mut new_ast: Node, clear_scene: true, reapply_settings, program: new_ast, - cached_body_items: 0, } } std::cmp::Ordering::Greater => { @@ -261,7 +317,6 @@ fn generate_changed_program(old_ast: Node, mut new_ast: Node, clear_scene: false, reapply_settings, program: new_ast, - cached_body_items: old_ast.body.len(), } } std::cmp::Ordering::Equal => { @@ -600,7 +655,6 @@ startSketchOn(XY) clear_scene: true, reapply_settings: true, program: new_program.ast, - cached_body_items: 0, } ); } @@ -639,7 +693,6 @@ startSketchOn(XY) clear_scene: true, reapply_settings: true, program: new_program.ast, - cached_body_items: 0, } ); } diff --git a/rust/kcl-lib/src/execution/exec_ast.rs b/rust/kcl-lib/src/execution/exec_ast.rs index 503a200ed..0b21b1484 100644 --- a/rust/kcl-lib/src/execution/exec_ast.rs +++ b/rust/kcl-lib/src/execution/exec_ast.rs @@ -131,7 +131,7 @@ impl ExecutorContext { match statement { BodyItem::ImportStatement(import_stmt) => { if !matches!(body_type, BodyType::Root) { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Imports are only supported at the top-level of a file.".to_owned(), vec![import_stmt.into()], ))); @@ -164,15 +164,18 @@ impl ExecutorContext { let mut mod_value = mem.get_from(&mod_name, env_ref, import_item.into(), 0).cloned(); if value.is_err() && ty.is_err() && mod_value.is_err() { - return Err(KclError::UndefinedValue(KclErrorDetails::new( - format!("{} is not defined in module", import_item.name.name), - vec![SourceRange::from(&import_item.name)], - ))); + return Err(KclError::new_undefined_value( + KclErrorDetails::new( + format!("{} is not defined in module", import_item.name.name), + vec![SourceRange::from(&import_item.name)], + ), + None, + )); } // Check that the item is allowed to be imported (in at least one namespace). if value.is_ok() && !module_exports.contains(&import_item.name.name) { - value = Err(KclError::Semantic(KclErrorDetails::new( + value = Err(KclError::new_semantic(KclErrorDetails::new( format!( "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", import_item.name.name @@ -182,7 +185,7 @@ impl ExecutorContext { } if ty.is_ok() && !module_exports.contains(&ty_name) { - ty = Err(KclError::Semantic(KclErrorDetails::new(format!( + ty = Err(KclError::new_semantic(KclErrorDetails::new(format!( "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", import_item.name.name ), @@ -190,7 +193,7 @@ impl ExecutorContext { } if mod_value.is_ok() && !module_exports.contains(&mod_name) { - mod_value = Err(KclError::Semantic(KclErrorDetails::new(format!( + mod_value = Err(KclError::new_semantic(KclErrorDetails::new(format!( "Cannot import \"{}\" from module because it is not exported. Add \"export\" before the definition to export it.", import_item.name.name ), @@ -253,7 +256,7 @@ impl ExecutorContext { .memory .get_from(name, env_ref, source_range, 0) .map_err(|_err| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("{} is not defined in module (but was exported?)", name), vec![source_range], )) @@ -301,7 +304,12 @@ impl ExecutorContext { let annotations = &variable_declaration.outer_attrs; - let value = self + // During the evaluation of the variable's RHS, set context that this is all happening inside a variable + // declaration, for the given name. This helps improve user-facing error messages. + let lhs = variable_declaration.inner.name().to_owned(); + let prev_being_declared = exec_state.mod_local.being_declared.clone(); + exec_state.mod_local.being_declared = Some(lhs); + let rhs_result = self .execute_expr( &variable_declaration.declaration.init, exec_state, @@ -309,10 +317,14 @@ impl ExecutorContext { annotations, StatementKind::Declaration { name: &var_name }, ) - .await?; + .await; + // Declaration over, so unset this context. + exec_state.mod_local.being_declared = prev_being_declared; + let rhs = rhs_result?; + exec_state .mut_stack() - .add(var_name.clone(), value.clone(), source_range)?; + .add(var_name.clone(), rhs.clone(), source_range)?; // Track exports. if let ItemVisibility::Export = variable_declaration.visibility { @@ -326,7 +338,7 @@ impl ExecutorContext { } } // Variable declaration can be the return value of a module. - last_expr = matches!(body_type, BodyType::Root).then_some(value); + last_expr = matches!(body_type, BodyType::Root).then_some(rhs); } BodyItem::TypeDeclaration(ty) => { let metadata = Metadata::from(&**ty); @@ -336,7 +348,7 @@ impl ExecutorContext { let std_path = match &exec_state.mod_local.path { ModulePath::Std { value } => value, ModulePath::Local { .. } | ModulePath::Main => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "User-defined types are not yet supported.".to_owned(), vec![metadata.source_range], ))); @@ -352,7 +364,7 @@ impl ExecutorContext { .mut_stack() .add(name_in_mem.clone(), value, metadata.source_range) .map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Redefinition of type {}.", ty.name.name), vec![metadata.source_range], )) @@ -373,7 +385,7 @@ impl ExecutorContext { exec_state, metadata.source_range, ) - .map_err(|e| KclError::Semantic(e.into()))?, + .map_err(|e| KclError::new_semantic(e.into()))?, ), meta: vec![metadata], }; @@ -382,7 +394,7 @@ impl ExecutorContext { .mut_stack() .add(name_in_mem.clone(), value, metadata.source_range) .map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Redefinition of type {}.", ty.name.name), vec![metadata.source_range], )) @@ -393,7 +405,7 @@ impl ExecutorContext { } } None => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "User-defined types are not yet supported.".to_owned(), vec![metadata.source_range], ))) @@ -407,7 +419,7 @@ impl ExecutorContext { let metadata = Metadata::from(return_statement); if matches!(body_type, BodyType::Root) { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Cannot return from outside a function.".to_owned(), vec![metadata.source_range], ))); @@ -426,7 +438,7 @@ impl ExecutorContext { .mut_stack() .add(memory::RETURN_NAME.to_owned(), value, metadata.source_range) .map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( "Multiple returns from a single function.".to_owned(), vec![metadata.source_range], )) @@ -531,7 +543,7 @@ impl ExecutorContext { *cache = Some((val, er, items.clone())); (er, items) }), - ModuleRepr::Foreign(geom, _) => Err(KclError::Semantic(KclErrorDetails::new( + ModuleRepr::Foreign(geom, _) => Err(KclError::new_semantic(KclErrorDetails::new( "Cannot import items from foreign modules".to_owned(), vec![geom.source_range], ))), @@ -605,12 +617,12 @@ impl ExecutorContext { exec_state.global.mod_loader.leave_module(path); result.map_err(|err| { - if let KclError::ImportCycle(_) = err { + if let KclError::ImportCycle { .. } = err { // It was an import cycle. Keep the original message. err.override_source_ranges(vec![source_range]) } else { // TODO would be great to have line/column for the underlying error here - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "Error loading imported file ({path}). Open it to view more details.\n {}", err.message() @@ -635,7 +647,12 @@ impl ExecutorContext { Expr::Literal(literal) => KclValue::from_literal((**literal).clone(), exec_state), Expr::TagDeclarator(tag) => tag.execute(exec_state).await?, Expr::Name(name) => { - let value = name.get_result(exec_state, self).await?.clone(); + let being_declared = exec_state.mod_local.being_declared.clone(); + let value = name + .get_result(exec_state, self) + .await + .map_err(|e| var_in_own_ref_err(e, &being_declared))? + .clone(); if let KclValue::Module { value: module_id, meta } = value { self.exec_module_for_result( module_id, @@ -677,7 +694,7 @@ impl ExecutorContext { meta: vec![metadata.to_owned()], } } else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Rust implementation of functions is restricted to the standard library".to_owned(), vec![metadata.source_range], ))); @@ -704,7 +721,7 @@ impl ExecutorContext { "you cannot declare variable {name} as %, because % can only be used in function calls" ); - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( message, vec![pipe_substitution.into()], ))); @@ -712,7 +729,7 @@ impl ExecutorContext { StatementKind::Expression => match exec_state.mod_local.pipe_value.clone() { Some(x) => x, None => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "cannot use % outside a pipe expression".to_owned(), vec![pipe_substitution.into()], ))); @@ -741,6 +758,24 @@ impl ExecutorContext { } } +/// If the error is about an undefined name, and that name matches the name being defined, +/// make the error message more specific. +fn var_in_own_ref_err(e: KclError, being_declared: &Option) -> KclError { + let KclError::UndefinedValue { name, mut details } = e else { + return e; + }; + // TODO after June 26th: replace this with a let-chain, + // which will be available in Rust 1.88 + // https://rust-lang.github.io/rfcs/2497-if-let-chains.html + match (&being_declared, &name) { + (Some(name0), Some(name1)) if name0 == name1 => { + details.message = format!("You can't use `{name0}` because you're currently trying to define it. Use a different variable here instead."); + } + _ => {} + } + KclError::UndefinedValue { details, name } +} + impl Node { #[async_recursion] pub async fn get_result(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { @@ -761,7 +796,7 @@ fn apply_ascription( source_range: SourceRange, ) -> Result { let ty = RuntimeType::from_parsed(ty.inner.clone(), exec_state, value.into()) - .map_err(|e| KclError::Semantic(e.into()))?; + .map_err(|e| KclError::new_semantic(e.into()))?; value.coerce(&ty, false, exec_state).map_err(|_| { let suggestion = if ty == RuntimeType::length() { @@ -771,7 +806,7 @@ fn apply_ascription( } else { "" }; - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "could not coerce value of type {} to type {ty}{suggestion}", value.human_friendly_type() @@ -802,9 +837,20 @@ impl Node { &self, exec_state: &'a mut ExecState, ctx: &ExecutorContext, + ) -> Result<&'a KclValue, KclError> { + let being_declared = exec_state.mod_local.being_declared.clone(); + self.get_result_inner(exec_state, ctx) + .await + .map_err(|e| var_in_own_ref_err(e, &being_declared)) + } + + async fn get_result_inner<'a>( + &self, + exec_state: &'a mut ExecState, + ctx: &ExecutorContext, ) -> Result<&'a KclValue, KclError> { if self.abs_path { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Absolute paths (names beginning with `::` are not yet supported)".to_owned(), self.as_source_ranges(), ))); @@ -825,7 +871,7 @@ impl Node { let value = match mem_spec { Some((env, exports)) => { if !exports.contains(&p.name) { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("Item {} not found in module's exported items", p.name), p.as_source_ranges(), ))); @@ -842,7 +888,7 @@ impl Node { }; let KclValue::Module { value: module_id, .. } = value else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Identifier in path must refer to a module, found {}", value.human_friendly_type() @@ -888,7 +934,7 @@ impl Node { // Either item or module is defined, but not exported. debug_assert!((item_value.is_ok() && !item_exported) || (mod_value.is_ok() && !mod_exported)); - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( format!("Item {} not found in module's exported items", self.name.name), self.name.as_source_ranges(), ))) @@ -913,14 +959,17 @@ impl Node { if let Some(value) = map.get(&property) { Ok(value.to_owned()) } else { - Err(KclError::UndefinedValue(KclErrorDetails::new( - format!("Property '{property}' not found in object"), - vec![self.clone().into()], - ))) + Err(KclError::new_undefined_value( + KclErrorDetails::new( + format!("Property '{property}' not found in object"), + vec![self.clone().into()], + ), + None, + )) } } (KclValue::Object { .. }, Property::String(property), true) => { - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( format!("Cannot index object with string; use dot notation instead, e.g. `obj.{property}`"), vec![self.clone().into()], ))) @@ -928,7 +977,7 @@ impl Node { (KclValue::Object { .. }, p, _) => { let t = p.type_name(); let article = article_for(t); - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( format!("Only strings can be used as the property of an object, but you're using {article} {t}",), vec![self.clone().into()], ))) @@ -938,10 +987,13 @@ impl Node { if let Some(value) = value_of_arr { Ok(value.to_owned()) } else { - Err(KclError::UndefinedValue(KclErrorDetails::new( - format!("The array doesn't have any item at index {index}"), - vec![self.clone().into()], - ))) + Err(KclError::new_undefined_value( + KclErrorDetails::new( + format!("The array doesn't have any item at index {index}"), + vec![self.clone().into()], + ), + None, + )) } } // Singletons and single-element arrays should be interchangeable, but only indexing by 0 should work. @@ -950,7 +1002,7 @@ impl Node { (KclValue::HomArray { .. }, p, _) => { let t = p.type_name(); let article = article_for(t); - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( format!("Only integers >= 0 can be used as the index of an array, but you're using {article} {t}",), vec![self.clone().into()], ))) @@ -971,7 +1023,7 @@ impl Node { (being_indexed, _, _) => { let t = being_indexed.human_friendly_type(); let article = article_for(&t); - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( format!("Only arrays can be indexed, but you're trying to index {article} {t}"), vec![self.clone().into()], ))) @@ -1049,7 +1101,7 @@ impl Node { meta: _, } = left_value else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Cannot apply logical operator to non-boolean value: {}", left_value.human_friendly_type() @@ -1062,7 +1114,7 @@ impl Node { meta: _, } = right_value else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Cannot apply logical operator to non-boolean value: {}", right_value.human_friendly_type() @@ -1168,7 +1220,7 @@ impl Node { meta: _, } = value else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Cannot apply unary operator ! to non-boolean value: {}", value.human_friendly_type() @@ -1189,7 +1241,7 @@ impl Node { let value = &self.argument.get_result(exec_state, ctx).await?; let err = || { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "You can only negate numbers, planes, or lines, but this is a {}", value.human_friendly_type() @@ -1292,7 +1344,7 @@ pub(crate) async fn execute_pipe_body( ctx: &ExecutorContext, ) -> Result { let Some((first, body)) = body.split_first() else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Pipe expressions cannot be empty".to_owned(), vec![source_range], ))); @@ -1311,7 +1363,7 @@ pub(crate) async fn execute_pipe_body( // Now that we've evaluated the first child expression in the pipeline, following child expressions // should use the previous child expression for %. // This means there's no more need for the previous pipe_value from the parent AST node above this one. - let previous_pipe_value = std::mem::replace(&mut exec_state.mod_local.pipe_value, Some(output)); + let previous_pipe_value = exec_state.mod_local.pipe_value.replace(output); // Evaluate remaining elements. let result = inner_execute_pipe_body(exec_state, body, ctx).await; // Restore the previous pipe value. @@ -1330,7 +1382,7 @@ async fn inner_execute_pipe_body( ) -> Result { for expression in body { if let Expr::TagDeclarator(_) = expression { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("This cannot be in a PipeExpression: {:?}", expression), vec![expression.into()], ))); @@ -1404,7 +1456,7 @@ impl Node { .await?; let (start, start_ty) = start_val .as_int_with_ty() - .ok_or(KclError::Semantic(KclErrorDetails::new( + .ok_or(KclError::new_semantic(KclErrorDetails::new( format!("Expected int but found {}", start_val.human_friendly_type()), vec![self.into()], )))?; @@ -1412,24 +1464,26 @@ impl Node { let end_val = ctx .execute_expr(&self.end_element, exec_state, &metadata, &[], StatementKind::Expression) .await?; - let (end, end_ty) = end_val.as_int_with_ty().ok_or(KclError::Semantic(KclErrorDetails::new( - format!("Expected int but found {}", end_val.human_friendly_type()), - vec![self.into()], - )))?; + let (end, end_ty) = end_val + .as_int_with_ty() + .ok_or(KclError::new_semantic(KclErrorDetails::new( + format!("Expected int but found {}", end_val.human_friendly_type()), + vec![self.into()], + )))?; if start_ty != end_ty { let start = start_val.as_ty_f64().unwrap_or(TyF64 { n: 0.0, ty: start_ty }); let start = fmt::human_display_number(start.n, start.ty); let end = end_val.as_ty_f64().unwrap_or(TyF64 { n: 0.0, ty: end_ty }); let end = fmt::human_display_number(end.n, end.ty); - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("Range start and end must be of the same type, but found {start} and {end}"), vec![self.into()], ))); } if end < start { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("Range start is greater than range end: {start} .. {end}"), vec![self.into()], ))); @@ -1493,7 +1547,7 @@ fn article_for>(s: S) -> &'static str { fn number_as_f64(v: &KclValue, source_range: SourceRange) -> Result { v.as_ty_f64().ok_or_else(|| { let actual_type = v.human_friendly_type(); - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Expected a number, but found {actual_type}",), vec![source_range], )) @@ -1585,13 +1639,13 @@ impl Property { if let Some(x) = crate::try_f64_to_usize(value) { Ok(Property::UInt(x)) } else { - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( format!("{value} is not a valid index, indices must be whole numbers >= 0"), property_sr, ))) } } - _ => Err(KclError::Semantic(KclErrorDetails::new( + _ => Err(KclError::new_semantic(KclErrorDetails::new( "Only numbers (>= 0) can be indexes".to_owned(), vec![sr], ))), @@ -1602,7 +1656,8 @@ impl Property { } fn jvalue_to_prop(value: &KclValue, property_sr: Vec, name: &str) -> Result { - let make_err = |message: String| Err::(KclError::Semantic(KclErrorDetails::new(message, property_sr))); + let make_err = + |message: String| Err::(KclError::new_semantic(KclErrorDetails::new(message, property_sr))); match value { KclValue::Number{value: num, .. } => { let num = *num; @@ -1846,7 +1901,7 @@ d = b + c crate::engine::conn_mock::EngineConnection::new() .await .map_err(|err| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Failed to create mock engine connection: {}", err), vec![SourceRange::default()], )) @@ -1858,7 +1913,6 @@ d = b + c project_directory: Some(crate::TypedPath(tmpdir.path().into())), ..Default::default() }, - stdlib: Arc::new(crate::std::StdLib::new()), context_type: ContextType::Mock, }; let mut exec_state = ExecState::new(&exec_ctxt); diff --git a/rust/kcl-lib/src/execution/fn_call.rs b/rust/kcl-lib/src/execution/fn_call.rs index d6e1e5a5b..64b4b2a63 100644 --- a/rust/kcl-lib/src/execution/fn_call.rs +++ b/rust/kcl-lib/src/execution/fn_call.rs @@ -2,7 +2,6 @@ use async_recursion::async_recursion; use indexmap::IndexMap; use crate::{ - docs::StdLibFn, errors::{KclError, KclErrorDetails}, execution::{ cad_op::{Group, OpArg, OpKclValue, Operation}, @@ -184,40 +183,6 @@ impl<'a> From<&'a FunctionSource> for FunctionDefinition<'a> { } } -impl From<&dyn StdLibFn> for FunctionDefinition<'static> { - fn from(value: &dyn StdLibFn) -> Self { - let mut input_arg = None; - let mut named_args = IndexMap::new(); - for a in value.args(false) { - if !a.label_required { - input_arg = Some((a.name.clone(), None)); - continue; - } - - named_args.insert( - a.name.clone(), - ( - if a.required { - None - } else { - Some(DefaultParamVal::none()) - }, - None, - ), - ); - } - FunctionDefinition { - input_arg, - named_args, - return_type: None, - deprecated: value.deprecated(), - include_in_feature_tree: value.feature_tree_operation(), - is_std: true, - body: FunctionBody::Rust(value.std_lib_fn()), - } - } -} - impl Node { #[async_recursion] pub async fn execute(&self, exec_state: &mut ExecState, ctx: &ExecutorContext) -> Result { @@ -274,59 +239,44 @@ impl Node { exec_state.pipe_value().map(|v| Arg::new(v.clone(), callsite)), ); - match ctx.stdlib.get_rust_function(fn_name) { - Some(func) => { - let def: FunctionDefinition = (&*func).into(); - // All std lib functions return a value, so the unwrap is safe. - def.call_kw(Some(func.name()), exec_state, ctx, args, callsite) - .await - .map(Option::unwrap) - .map_err(|e| { - // This is used for the backtrace display. We don't add - // another location the way we do for user-defined - // functions because the error uses the Args, which - // already points here. - e.set_last_backtrace_fn_name(Some(func.name())) - }) - } - None => { - // Clone the function so that we can use a mutable reference to - // exec_state. - let func = fn_name.get_result(exec_state, ctx).await?.clone(); + // Clone the function so that we can use a mutable reference to + // exec_state. + let func = fn_name.get_result(exec_state, ctx).await?.clone(); - let Some(fn_src) = func.as_function() else { - return Err(KclError::Semantic(KclErrorDetails::new( - "cannot call this because it isn't a function".to_string(), - vec![callsite], - ))); - }; + let Some(fn_src) = func.as_function() else { + return Err(KclError::new_semantic(KclErrorDetails::new( + "cannot call this because it isn't a function".to_string(), + vec![callsite], + ))); + }; - let return_value = fn_src - .call_kw(Some(fn_name.to_string()), exec_state, ctx, args, callsite) - .await - .map_err(|e| { - // Add the call expression to the source ranges. - // - // TODO: Use the name that the function was defined - // with, not the identifier it was used with. - e.add_unwind_location(Some(fn_name.name.name.clone()), callsite) - })?; + let return_value = fn_src + .call_kw(Some(fn_name.to_string()), exec_state, ctx, args, callsite) + .await + .map_err(|e| { + // Add the call expression to the source ranges. + // + // TODO: Use the name that the function was defined + // with, not the identifier it was used with. + e.add_unwind_location(Some(fn_name.name.name.clone()), callsite) + })?; - let result = return_value.ok_or_else(move || { - let mut source_ranges: Vec = vec![callsite]; - // We want to send the source range of the original function. - if let KclValue::Function { meta, .. } = func { - source_ranges = meta.iter().map(|m| m.source_range).collect(); - }; - KclError::UndefinedValue(KclErrorDetails::new( - format!("Result of user-defined function {} is undefined", fn_name), - source_ranges, - )) - })?; + let result = return_value.ok_or_else(move || { + let mut source_ranges: Vec = vec![callsite]; + // We want to send the source range of the original function. + if let KclValue::Function { meta, .. } = func { + source_ranges = meta.iter().map(|m| m.source_range).collect(); + }; + KclError::new_undefined_value( + KclErrorDetails::new( + format!("Result of user-defined function {} is undefined", fn_name), + source_ranges, + ), + None, + ) + })?; - Ok(result) - } - } + Ok(result) } } @@ -500,7 +450,7 @@ fn update_memory_for_tags_of_geometry(result: &mut KclValue, exec_state: &mut Ex let tag_id = if let Some(t) = value.sketch.tags.get(&tag.name) { let mut t = t.clone(); let Some(info) = t.get_cur_info() else { - return Err(KclError::Internal(KclErrorDetails::new( + return Err(KclError::new_internal(KclErrorDetails::new( format!("Tag {} does not have path info", tag.name), vec![tag.into()], ))); @@ -600,30 +550,33 @@ fn type_check_params_kw( for (label, arg) in &mut args.labeled { match fn_def.named_args.get(label) { - Some((_, ty)) => { - if let Some(ty) = ty { - arg.value = arg - .value - .coerce( - &RuntimeType::from_parsed(ty.clone(), exec_state, arg.source_range).map_err(|e| KclError::Semantic(e.into()))?, - true, - exec_state, - ) - .map_err(|e| { - let mut message = format!( - "{label} requires a value with type `{}`, but found {}", - ty, - arg.value.human_friendly_type(), - ); - if let Some(ty) = e.explicit_coercion { - // TODO if we have access to the AST for the argument we could choose which example to suggest. - message = format!("{message}\n\nYou may need to add information about the type of the argument, for example:\n using a numeric suffix: `42{ty}`\n or using type ascription: `foo(): number({ty})`"); - } - KclError::Semantic(KclErrorDetails::new( - message, - vec![arg.source_range], - )) - })?; + Some((def, ty)) => { + // For optional args, passing None should be the same as not passing an arg. + if !(def.is_some() && matches!(arg.value, KclValue::KclNone { .. })) { + if let Some(ty) = ty { + arg.value = arg + .value + .coerce( + &RuntimeType::from_parsed(ty.clone(), exec_state, arg.source_range).map_err(|e| KclError::new_semantic(e.into()))?, + true, + exec_state, + ) + .map_err(|e| { + let mut message = format!( + "{label} requires a value with type `{}`, but found {}", + ty, + arg.value.human_friendly_type(), + ); + if let Some(ty) = e.explicit_coercion { + // TODO if we have access to the AST for the argument we could choose which example to suggest. + message = format!("{message}\n\nYou may need to add information about the type of the argument, for example:\n using a numeric suffix: `42{ty}`\n or using type ascription: `foo(): number({ty})`"); + } + KclError::new_semantic(KclErrorDetails::new( + message, + vec![arg.source_range], + )) + })?; + } } } None => { @@ -670,7 +623,7 @@ fn type_check_params_kw( let first = errors.next().unwrap(); errors.for_each(|e| exec_state.err(e)); - return Err(KclError::Semantic(first.into())); + return Err(KclError::new_semantic(first.into())); } if let Some(arg) = &mut args.unlabeled { @@ -680,12 +633,12 @@ fn type_check_params_kw( .value .coerce( &RuntimeType::from_parsed(ty.clone(), exec_state, arg.1.source_range) - .map_err(|e| KclError::Semantic(e.into()))?, + .map_err(|e| KclError::new_semantic(e.into()))?, true, exec_state, ) .map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "The input argument of {} requires a value with type `{}`, but found {}", fn_name @@ -703,7 +656,7 @@ fn type_check_params_kw( exec_state.err(CompilationError::err( arg.source_range, format!( - "{} expects an unlabeled first parameter (`@{name}`), but it is labelled in the call", + "{} expects an unlabeled first argument (`@{name}`), but it is labelled in the call", fn_name .map(|n| format!("The function `{}`", n)) .unwrap_or_else(|| "This function".to_owned()), @@ -742,7 +695,7 @@ fn assign_args_to_params_kw( .add(name.clone(), value, default_val.source_range())?; } None => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "This function requires a parameter {}, but you haven't passed it one.", name @@ -759,12 +712,12 @@ fn assign_args_to_params_kw( let Some(unlabeled) = unlabelled else { return Err(if args.kw_args.labeled.contains_key(param_name) { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("The function does declare a parameter named '{param_name}', but this parameter doesn't use a label. Try removing the `{param_name}:`"), source_ranges, )) } else { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( "This function expects an unlabeled first parameter, but you haven't passed it one.".to_owned(), source_ranges, )) @@ -788,9 +741,9 @@ fn coerce_result_type( if let Ok(Some(val)) = result { if let Some(ret_ty) = &fn_def.return_type { let ty = RuntimeType::from_parsed(ret_ty.inner.clone(), exec_state, ret_ty.as_source_range()) - .map_err(|e| KclError::Semantic(e.into()))?; + .map_err(|e| KclError::new_semantic(e.into()))?; let val = val.coerce(&ty, true, exec_state).map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "This function requires its result to be of type `{}`, but found {}", ty.human_friendly_type(), @@ -874,7 +827,7 @@ mod test { "all params required, none given, should error", vec![req_param("x")], vec![], - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( "This function requires a parameter x, but you haven't passed it one.".to_owned(), vec![SourceRange::default()], ))), @@ -889,7 +842,7 @@ mod test { "mixed params, too few given", vec![req_param("x"), opt_param("y")], vec![], - Err(KclError::Semantic(KclErrorDetails::new( + Err(KclError::new_semantic(KclErrorDetails::new( "This function requires a parameter x, but you haven't passed it one.".to_owned(), vec![SourceRange::default()], ))), @@ -937,7 +890,6 @@ mod test { crate::engine::conn_mock::EngineConnection::new().await.unwrap(), )), fs: Arc::new(crate::fs::FileManager::new()), - stdlib: Arc::new(crate::std::StdLib::new()), settings: Default::default(), context_type: ContextType::Mock, }; diff --git a/rust/kcl-lib/src/execution/geometry.rs b/rust/kcl-lib/src/execution/geometry.rs index 1d2092c9e..29186347c 100644 --- a/rust/kcl-lib/src/execution/geometry.rs +++ b/rust/kcl-lib/src/execution/geometry.rs @@ -24,6 +24,7 @@ type Point3D = kcmc::shared::Point3d; #[derive(Debug, Clone, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] +#[allow(clippy::large_enum_variant)] pub enum Geometry { Sketch(Sketch), Solid(Solid), @@ -52,6 +53,7 @@ impl Geometry { #[derive(Debug, Clone, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(tag = "type")] +#[allow(clippy::large_enum_variant)] pub enum GeometryWithImportedGeometry { Sketch(Sketch), Solid(Solid), @@ -469,7 +471,7 @@ impl TryFrom for PlaneInfo { PlaneData::NegYZ => PlaneName::NegYz, PlaneData::Plane(_) => { // We will never get here since we already checked for PlaneData::Plane. - return Err(KclError::Internal(KclErrorDetails::new( + return Err(KclError::new_internal(KclErrorDetails::new( format!("PlaneData {:?} not found", value), Default::default(), ))); @@ -477,7 +479,7 @@ impl TryFrom for PlaneInfo { }; let info = DEFAULT_PLANE_INFO.get(&name).ok_or_else(|| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Plane {} not found", name), Default::default(), )) diff --git a/rust/kcl-lib/src/execution/import.rs b/rust/kcl-lib/src/execution/import.rs index 5316af2f4..c43a960d1 100644 --- a/rust/kcl-lib/src/execution/import.rs +++ b/rust/kcl-lib/src/execution/import.rs @@ -37,25 +37,25 @@ pub async fn import_foreign( ) -> Result { // Make sure the file exists. if !ctxt.fs.exists(file_path, source_range).await? { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("File `{}` does not exist.", file_path.display()), vec![source_range], ))); } let ext_format = get_import_format_from_extension(file_path.extension().ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("No file extension found for `{}`", file_path.display()), vec![source_range], )) })?) - .map_err(|e| KclError::Semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; + .map_err(|e| KclError::new_semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; // Get the format type from the extension of the file. let format = if let Some(format) = format { // Validate the given format with the extension format. validate_extension_format(ext_format, format.clone()) - .map_err(|e| KclError::Semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; + .map_err(|e| KclError::new_semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; format } else { ext_format @@ -66,11 +66,11 @@ pub async fn import_foreign( .fs .read(file_path, source_range) .await - .map_err(|e| KclError::Semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; + .map_err(|e| KclError::new_semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; // We want the file_path to be without the parent. let file_name = file_path.file_name().map(|p| p.to_string()).ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Could not get the file name from the path `{}`", file_path.display()), vec![source_range], )) @@ -87,7 +87,7 @@ pub async fn import_foreign( // file. if !file_contents.starts_with(b"glTF") { let json = gltf_json::Root::from_slice(&file_contents) - .map_err(|e| KclError::Semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; + .map_err(|e| KclError::new_semantic(KclErrorDetails::new(e.to_string(), vec![source_range])))?; // Read the gltf file and check if there is a bin file. for buffer in json.buffers.iter() { @@ -95,16 +95,15 @@ pub async fn import_foreign( if !uri.starts_with("data:") { // We want this path relative to the file_path given. let bin_path = file_path.parent().map(|p| p.join(uri)).ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Could not get the parent path of the file `{}`", file_path.display()), vec![source_range], )) })?; - let bin_contents = - ctxt.fs.read(&bin_path, source_range).await.map_err(|e| { - KclError::Semantic(KclErrorDetails::new(e.to_string(), vec![source_range])) - })?; + let bin_contents = ctxt.fs.read(&bin_path, source_range).await.map_err(|e| { + KclError::new_semantic(KclErrorDetails::new(e.to_string(), vec![source_range])) + })?; import_files.push(ImportFile { path: uri.to_string(), @@ -141,7 +140,7 @@ pub(super) fn format_from_annotations( if p.key.name == annotations::IMPORT_FORMAT { result = Some( get_import_format_from_extension(annotations::expect_ident(&p.value)?).map_err(|_| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "Unknown format for import, expected one of: {}", crate::IMPORT_FILE_EXTENSIONS.join(", ") @@ -159,7 +158,7 @@ pub(super) fn format_from_annotations( path.extension() .and_then(|ext| get_import_format_from_extension(ext).ok()) }) - .ok_or(KclError::Semantic(KclErrorDetails::new( + .ok_or(KclError::new_semantic(KclErrorDetails::new( "Unknown or missing extension, and no specified format for imported file".to_owned(), vec![import_source_range], )))?; @@ -174,7 +173,7 @@ pub(super) fn format_from_annotations( } annotations::IMPORT_FORMAT => {} _ => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Unexpected annotation for import, expected one of: {}, {}, {}", annotations::IMPORT_FORMAT, @@ -199,7 +198,7 @@ fn set_coords(fmt: &mut InputFormat3d, coords_str: &str, source_range: SourceRan } let Some(coords) = coords else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Unknown coordinate system: {coords_str}, expected one of: {}", annotations::IMPORT_COORDS_VALUES @@ -217,7 +216,7 @@ fn set_coords(fmt: &mut InputFormat3d, coords_str: &str, source_range: SourceRan InputFormat3d::Ply(opts) => opts.coords = coords, InputFormat3d::Stl(opts) => opts.coords = coords, _ => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "`{}` option cannot be applied to the specified format", annotations::IMPORT_COORDS @@ -238,7 +237,7 @@ fn set_length_unit(fmt: &mut InputFormat3d, units_str: &str, source_range: Sourc InputFormat3d::Ply(opts) => opts.units = units.into(), InputFormat3d::Stl(opts) => opts.units = units.into(), _ => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "`{}` option cannot be applied to the specified format", annotations::IMPORT_LENGTH_UNIT diff --git a/rust/kcl-lib/src/walk/import_graph.rs b/rust/kcl-lib/src/execution/import_graph.rs similarity index 95% rename from rust/kcl-lib/src/walk/import_graph.rs rename to rust/kcl-lib/src/execution/import_graph.rs index 9fd646022..483eda8ad 100644 --- a/rust/kcl-lib/src/walk/import_graph.rs +++ b/rust/kcl-lib/src/execution/import_graph.rs @@ -31,7 +31,7 @@ pub(crate) type Universe = HashMap; /// run concurrently. Each "stage" is blocking in this model, which will /// change in the future. Don't use this function widely, yet. #[allow(clippy::iter_over_hash_type)] -pub fn import_graph(progs: &Universe, ctx: &ExecutorContext) -> Result>, KclError> { +pub(crate) fn import_graph(progs: &Universe, ctx: &ExecutorContext) -> Result>, KclError> { let mut graph = Graph::new(); for (name, (_, _, path, repr)) in progs.iter() { @@ -96,7 +96,7 @@ fn topsort(all_modules: &[&str], graph: Graph) -> Result>, KclEr if stage_modules.is_empty() { waiting_modules.sort(); - return Err(KclError::ImportCycle(KclErrorDetails::new( + return Err(KclError::new_import_cycle(KclErrorDetails::new( format!("circular import of modules not allowed: {}", waiting_modules.join(", ")), // TODO: we can get the right import lines from the AST, but we don't vec![SourceRange::default()], @@ -120,7 +120,7 @@ fn topsort(all_modules: &[&str], graph: Graph) -> Result>, KclEr type ImportDependencies = Vec<(String, AstNode, ModulePath)>; -pub(crate) fn import_dependencies( +fn import_dependencies( path: &ModulePath, repr: &ModuleRepr, ctx: &ExecutorContext, @@ -146,7 +146,7 @@ pub(crate) fn import_dependencies( // This is a bit of a hack, but it works for now. ret.lock() .map_err(|err| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Failed to lock mutex: {}", err), Default::default(), )) @@ -156,7 +156,7 @@ pub(crate) fn import_dependencies( ImportPath::Foreign { path } => { ret.lock() .map_err(|err| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Failed to lock mutex: {}", err), Default::default(), )) @@ -178,7 +178,7 @@ pub(crate) fn import_dependencies( walk(ret.clone(), prog.into(), path, ctx)?; let ret = ret.lock().map_err(|err| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Failed to lock mutex: {}", err), Default::default(), )) @@ -223,7 +223,7 @@ pub(crate) async fn import_universe( let repr = { let Some(module_info) = exec_state.get_module(module_id) else { - return Err(KclError::Internal(KclErrorDetails::new( + return Err(KclError::new_internal(KclErrorDetails::new( format!("Module {} not found", module_id), vec![import_stmt.into()], ))); diff --git a/rust/kcl-lib/src/execution/kcl_value.rs b/rust/kcl-lib/src/execution/kcl_value.rs index fd7accab2..b839a5a6e 100644 --- a/rust/kcl-lib/src/execution/kcl_value.rs +++ b/rust/kcl-lib/src/execution/kcl_value.rs @@ -574,7 +574,7 @@ impl KclValue { pub fn get_tag_identifier(&self) -> Result { match self { KclValue::TagIdentifier(t) => Ok(*t.clone()), - _ => Err(KclError::Semantic(KclErrorDetails::new( + _ => Err(KclError::new_semantic(KclErrorDetails::new( format!("Not a tag identifier: {:?}", self), self.clone().into(), ))), @@ -585,7 +585,7 @@ impl KclValue { pub fn get_tag_declarator(&self) -> Result { match self { KclValue::TagDeclarator(t) => Ok((**t).clone()), - _ => Err(KclError::Semantic(KclErrorDetails::new( + _ => Err(KclError::new_semantic(KclErrorDetails::new( format!("Not a tag declarator: {:?}", self), self.clone().into(), ))), @@ -595,7 +595,7 @@ impl KclValue { /// If this KCL value is a bool, retrieve it. pub fn get_bool(&self) -> Result { self.as_bool().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected bool, found {}", self.human_friendly_type()), self.into(), )) diff --git a/rust/kcl-lib/src/execution/memory.rs b/rust/kcl-lib/src/execution/memory.rs index cd7eac226..7547a15f1 100644 --- a/rust/kcl-lib/src/execution/memory.rs +++ b/rust/kcl-lib/src/execution/memory.rs @@ -367,10 +367,10 @@ impl ProgramMemory { let name = var.trim_start_matches(TYPE_PREFIX).trim_start_matches(MODULE_PREFIX); - Err(KclError::UndefinedValue(KclErrorDetails::new( - format!("`{name}` is not defined"), - vec![source_range], - ))) + Err(KclError::new_undefined_value( + KclErrorDetails::new(format!("`{name}` is not defined"), vec![source_range]), + Some(name.to_owned()), + )) } /// Iterate over all key/value pairs in the specified environment which satisfy the provided @@ -488,10 +488,10 @@ impl ProgramMemory { }; } - Err(KclError::UndefinedValue(KclErrorDetails::new( - format!("`{}` is not defined", var), - vec![], - ))) + Err(KclError::new_undefined_value( + KclErrorDetails::new(format!("`{}` is not defined", var), vec![]), + Some(var.to_owned()), + )) } } @@ -646,7 +646,7 @@ impl Stack { pub fn add(&mut self, key: String, value: KclValue, source_range: SourceRange) -> Result<(), KclError> { let env = self.memory.get_env(self.current_env.index()); if env.contains_key(&key) { - return Err(KclError::ValueAlreadyDefined(KclErrorDetails::new( + return Err(KclError::new_value_already_defined(KclErrorDetails::new( format!("Cannot redefine `{}`", key), vec![source_range], ))); diff --git a/rust/kcl-lib/src/execution/mod.rs b/rust/kcl-lib/src/execution/mod.rs index 8523fc272..51321885a 100644 --- a/rust/kcl-lib/src/execution/mod.rs +++ b/rust/kcl-lib/src/execution/mod.rs @@ -5,9 +5,8 @@ use std::sync::Arc; use anyhow::Result; #[cfg(feature = "artifact-graph")] pub use artifact::{Artifact, ArtifactCommand, ArtifactGraph, CodeRef, StartSketchOnFace, StartSketchOnPlane}; -use cache::OldAstState; +use cache::GlobalState; pub use cache::{bust_cache, clear_mem_cache}; -#[cfg(feature = "artifact-graph")] pub use cad_op::{Group, Operation}; pub use geometry::*; pub use id_generator::IdGenerator; @@ -27,13 +26,12 @@ use serde::{Deserialize, Serialize}; pub use state::{ExecState, MetaSettings}; use uuid::Uuid; -#[cfg(feature = "artifact-graph")] -use crate::execution::artifact::build_artifact_graph; use crate::{ engine::EngineManager, errors::{KclError, KclErrorDetails}, execution::{ cache::{CacheInformation, CacheResult}, + import_graph::{Universe, UniverseMap}, typed_path::TypedPath, types::{UnitAngle, UnitLen}, }, @@ -41,8 +39,6 @@ use crate::{ modules::{ModuleId, ModulePath, ModuleRepr}, parsing::ast::types::{Expr, ImportPath, NodeRef}, source_range::SourceRange, - std::StdLib, - walk::{Universe, UniverseMap}, CompilationError, ExecError, KclErrorWithOutputs, }; @@ -56,6 +52,7 @@ pub mod fn_call; mod geometry; mod id_generator; mod import; +mod import_graph; pub(crate) mod kcl_value; mod memory; mod state; @@ -273,7 +270,6 @@ pub enum ContextType { pub struct ExecutorContext { pub engine: Arc>, pub fs: Arc, - pub stdlib: Arc, pub settings: ExecutorSettings, pub context_type: ContextType, } @@ -412,7 +408,6 @@ impl ExecutorContext { Ok(Self { engine, fs: Arc::new(FileManager::new()), - stdlib: Arc::new(StdLib::new()), settings, context_type: ContextType::Live, }) @@ -423,7 +418,6 @@ impl ExecutorContext { ExecutorContext { engine, fs, - stdlib: Arc::new(StdLib::new()), settings, context_type: ContextType::Live, } @@ -436,7 +430,6 @@ impl ExecutorContext { crate::engine::conn_mock::EngineConnection::new().await.unwrap(), )), fs: Arc::new(FileManager::new()), - stdlib: Arc::new(StdLib::new()), settings: settings.unwrap_or_default(), context_type: ContextType::Mock, } @@ -447,7 +440,6 @@ impl ExecutorContext { ExecutorContext { engine, fs, - stdlib: Arc::new(StdLib::new()), settings, context_type: ContextType::Mock, } @@ -458,7 +450,6 @@ impl ExecutorContext { ExecutorContext { engine, fs: Arc::new(FileManager::new()), - stdlib: Arc::new(StdLib::new()), settings: Default::default(), context_type: ContextType::MockCustomForwarded, } @@ -575,7 +566,7 @@ impl ExecutorContext { // part of the scene). exec_state.mut_stack().push_new_env_for_scope(); - let result = self.inner_run(&program, 0, &mut exec_state, true).await?; + let result = self.inner_run(&program, &mut exec_state, true).await?; // Restore any temporary variables, then save any newly created variables back to // memory in case another run wants to use them. Note this is just saved to the preserved @@ -583,7 +574,7 @@ impl ExecutorContext { let mut mem = exec_state.stack().clone(); let module_infos = exec_state.global.module_infos.clone(); - let outcome = exec_state.to_mock_exec_outcome(result.0).await; + let outcome = exec_state.to_mock_exec_outcome(result.0, self).await; mem.squash_env(result.0); cache::write_old_memory((mem, module_infos)).await; @@ -594,169 +585,176 @@ impl ExecutorContext { pub async fn run_with_caching(&self, program: crate::Program) -> Result { assert!(!self.is_mock()); - let (program, mut exec_state, preserve_mem, cached_body_items, imports_info) = if let Some(OldAstState { - ast: old_ast, - exec_state: mut old_state, - settings: old_settings, - result_env, - }) = - cache::read_old_ast().await - { - let old = CacheInformation { - ast: &old_ast, - settings: &old_settings, - }; - let new = CacheInformation { - ast: &program.ast, - settings: &self.settings, - }; - - // Get the program that actually changed from the old and new information. - let (clear_scene, program, body_items, import_check_info) = match cache::get_changed_program(old, new).await - { - CacheResult::ReExecute { - clear_scene, - reapply_settings, - program: changed_program, - cached_body_items, - } => { - if reapply_settings - && self - .engine - .reapply_settings(&self.settings, Default::default(), old_state.id_generator()) - .await - .is_err() - { - (true, program, cached_body_items, None) - } else { - ( - clear_scene, - crate::Program { - ast: changed_program, - original_file_contents: program.original_file_contents, - }, - cached_body_items, - None, - ) - } - } - CacheResult::CheckImportsOnly { - reapply_settings, - ast: changed_program, - } => { - if reapply_settings - && self - .engine - .reapply_settings(&self.settings, Default::default(), old_state.id_generator()) - .await - .is_err() - { - (true, program, old_ast.body.len(), None) - } else { - // We need to check our imports to see if they changed. - let mut new_exec_state = ExecState::new(self); - let (new_universe, new_universe_map) = self.get_universe(&program, &mut new_exec_state).await?; - let mut clear_scene = false; - - let mut keys = new_universe.keys().clone().collect::>(); - keys.sort(); - for key in keys { - let (_, id, _, _) = &new_universe[key]; - if let (Some(source0), Some(source1)) = - (old_state.get_source(*id), new_exec_state.get_source(*id)) - { - if source0.source != source1.source { - clear_scene = true; - break; - } - } - } - - if !clear_scene { - // Return early we don't need to clear the scene. - let outcome = old_state.to_exec_outcome(result_env).await; - return Ok(outcome); - } - - ( - clear_scene, - crate::Program { - ast: changed_program, - original_file_contents: program.original_file_contents, - }, - old_ast.body.len(), - // We only care about this if we are clearing the scene. - if clear_scene { - Some((new_universe, new_universe_map, new_exec_state)) - } else { - None - }, - ) - } - } - CacheResult::NoAction(true) => { - if self - .engine - .reapply_settings(&self.settings, Default::default(), old_state.id_generator()) - .await - .is_ok() - { - // We need to update the old ast state with the new settings!! - cache::write_old_ast(OldAstState { - ast: old_ast, - exec_state: old_state.clone(), - settings: self.settings.clone(), - result_env, - }) - .await; - - let outcome = old_state.to_exec_outcome(result_env).await; - return Ok(outcome); - } - (true, program, old_ast.body.len(), None) - } - CacheResult::NoAction(false) => { - let outcome = old_state.to_exec_outcome(result_env).await; - return Ok(outcome); - } - }; - - let (exec_state, preserve_mem, universe_info) = - if let Some((new_universe, new_universe_map, mut new_exec_state)) = import_check_info { - // Clear the scene if the imports changed. - self.send_clear_scene(&mut new_exec_state, Default::default()) - .await - .map_err(KclErrorWithOutputs::no_outputs)?; - - (new_exec_state, false, Some((new_universe, new_universe_map))) - } else if clear_scene { - // Pop the execution state, since we are starting fresh. - let mut exec_state = old_state; - exec_state.reset(self); - - self.send_clear_scene(&mut exec_state, Default::default()) - .await - .map_err(KclErrorWithOutputs::no_outputs)?; - - (exec_state, false, None) - } else { - old_state.mut_stack().restore_env(result_env); - - (old_state, true, None) + let (program, exec_state, result) = match cache::read_old_ast().await { + Some(mut cached_state) => { + let old = CacheInformation { + ast: &cached_state.main.ast, + settings: &cached_state.settings, + }; + let new = CacheInformation { + ast: &program.ast, + settings: &self.settings, }; - (program, exec_state, preserve_mem, body_items, universe_info) - } else { - let mut exec_state = ExecState::new(self); - self.send_clear_scene(&mut exec_state, Default::default()) - .await - .map_err(KclErrorWithOutputs::no_outputs)?; - (program, exec_state, false, 0, None) - }; + // Get the program that actually changed from the old and new information. + let (clear_scene, program, import_check_info) = match cache::get_changed_program(old, new).await { + CacheResult::ReExecute { + clear_scene, + reapply_settings, + program: changed_program, + } => { + if reapply_settings + && self + .engine + .reapply_settings( + &self.settings, + Default::default(), + &mut cached_state.main.exec_state.id_generator, + ) + .await + .is_err() + { + (true, program, None) + } else { + ( + clear_scene, + crate::Program { + ast: changed_program, + original_file_contents: program.original_file_contents, + }, + None, + ) + } + } + CacheResult::CheckImportsOnly { + reapply_settings, + ast: changed_program, + } => { + if reapply_settings + && self + .engine + .reapply_settings( + &self.settings, + Default::default(), + &mut cached_state.main.exec_state.id_generator, + ) + .await + .is_err() + { + (true, program, None) + } else { + // We need to check our imports to see if they changed. + let mut new_exec_state = ExecState::new(self); + let (new_universe, new_universe_map) = + self.get_universe(&program, &mut new_exec_state).await?; - let result = self - .run_concurrent(&program, cached_body_items, &mut exec_state, imports_info, preserve_mem) - .await; + let clear_scene = new_universe.keys().any(|key| { + let id = new_universe[key].1; + match ( + cached_state.exec_state.get_source(id), + new_exec_state.global.get_source(id), + ) { + (Some(s0), Some(s1)) => s0.source != s1.source, + _ => false, + } + }); + + if !clear_scene { + // Return early we don't need to clear the scene. + return Ok(cached_state.into_exec_outcome(self).await); + } + + ( + true, + crate::Program { + ast: changed_program, + original_file_contents: program.original_file_contents, + }, + Some((new_universe, new_universe_map, new_exec_state)), + ) + } + } + CacheResult::NoAction(true) => { + if self + .engine + .reapply_settings( + &self.settings, + Default::default(), + &mut cached_state.main.exec_state.id_generator, + ) + .await + .is_ok() + { + // We need to update the old ast state with the new settings!! + cache::write_old_ast(GlobalState::with_settings( + cached_state.clone(), + self.settings.clone(), + )) + .await; + + return Ok(cached_state.into_exec_outcome(self).await); + } + (true, program, None) + } + CacheResult::NoAction(false) => { + return Ok(cached_state.into_exec_outcome(self).await); + } + }; + + let (exec_state, result) = match import_check_info { + Some((new_universe, new_universe_map, mut new_exec_state)) => { + // Clear the scene if the imports changed. + self.send_clear_scene(&mut new_exec_state, Default::default()) + .await + .map_err(KclErrorWithOutputs::no_outputs)?; + + let result = self + .run_concurrent( + &program, + &mut new_exec_state, + Some((new_universe, new_universe_map)), + false, + ) + .await; + + (new_exec_state, result) + } + None if clear_scene => { + // Pop the execution state, since we are starting fresh. + let mut exec_state = cached_state.reconstitute_exec_state(); + exec_state.reset(self); + + self.send_clear_scene(&mut exec_state, Default::default()) + .await + .map_err(KclErrorWithOutputs::no_outputs)?; + + let result = self.run_concurrent(&program, &mut exec_state, None, false).await; + + (exec_state, result) + } + None => { + let mut exec_state = cached_state.reconstitute_exec_state(); + exec_state.mut_stack().restore_env(cached_state.main.result_env); + + let result = self.run_concurrent(&program, &mut exec_state, None, true).await; + + (exec_state, result) + } + }; + + (program, exec_state, result) + } + None => { + let mut exec_state = ExecState::new(self); + self.send_clear_scene(&mut exec_state, Default::default()) + .await + .map_err(KclErrorWithOutputs::no_outputs)?; + + let result = self.run_concurrent(&program, &mut exec_state, None, false).await; + + (program, exec_state, result) + } + }; if result.is_err() { cache::bust_cache().await; @@ -766,15 +764,15 @@ impl ExecutorContext { let result = result?; // Save this as the last successful execution to the cache. - cache::write_old_ast(OldAstState { - ast: program.ast, - exec_state: exec_state.clone(), - settings: self.settings.clone(), - result_env: result.0, - }) + cache::write_old_ast(GlobalState::new( + exec_state.clone(), + self.settings.clone(), + program.ast, + result.0, + )) .await; - let outcome = exec_state.to_exec_outcome(result.0).await; + let outcome = exec_state.to_exec_outcome(result.0, self).await; Ok(outcome) } @@ -789,11 +787,11 @@ impl ExecutorContext { program: &crate::Program, exec_state: &mut ExecState, ) -> Result<(EnvironmentRef, Option), KclErrorWithOutputs> { - self.run_concurrent(program, 0, exec_state, None, false).await + self.run_concurrent(program, exec_state, None, false).await } /// Perform the execution of a program using a concurrent - /// execution model. This has the same signature as [Self::run]. + /// execution model. /// /// You can optionally pass in some initialization memory for partial /// execution. @@ -802,13 +800,12 @@ impl ExecutorContext { pub async fn run_concurrent( &self, program: &crate::Program, - cached_body_items: usize, exec_state: &mut ExecState, universe_info: Option<(Universe, UniverseMap)>, preserve_mem: bool, ) -> Result<(EnvironmentRef, Option), KclErrorWithOutputs> { // Reuse our cached universe if we have one. - #[allow(unused_variables)] + let (universe, universe_map) = if let Some((universe, universe_map)) = universe_info { (universe, universe_map) } else { @@ -822,29 +819,8 @@ impl ExecutorContext { .await .map_err(KclErrorWithOutputs::no_outputs)?; - for modules in crate::walk::import_graph(&universe, self) - .map_err(|err| { - let module_id_to_module_path: IndexMap = exec_state - .global - .path_to_source_id - .iter() - .map(|(k, v)| ((*v), k.clone())) - .collect(); - - KclErrorWithOutputs::new( - err, - exec_state.errors().to_vec(), - #[cfg(feature = "artifact-graph")] - exec_state.global.operations.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_commands.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_graph.clone(), - module_id_to_module_path, - exec_state.global.id_to_source.clone(), - default_planes.clone(), - ) - })? + for modules in import_graph::import_graph(&universe, self) + .map_err(|err| exec_state.error_with_outputs(err, default_planes.clone()))? .into_iter() { #[cfg(not(target_arch = "wasm32"))] @@ -858,7 +834,7 @@ impl ExecutorContext { for module in modules { let Some((import_stmt, module_id, module_path, repr)) = universe.get(&module) else { - return Err(KclErrorWithOutputs::no_outputs(KclError::Internal( + return Err(KclErrorWithOutputs::no_outputs(KclError::new_internal( KclErrorDetails::new(format!("Module {module} not found in universe"), Default::default()), ))); }; @@ -866,7 +842,6 @@ impl ExecutorContext { let module_path = module_path.clone(); let source_range = SourceRange::from(import_stmt); - #[cfg(feature = "artifact-graph")] match &module_path { ModulePath::Main => { // This should never happen. @@ -875,7 +850,7 @@ impl ExecutorContext { // We only want to display the top-level module imports in // the Feature Tree, not transitive imports. if universe_map.contains_key(value) { - exec_state.global.operations.push(Operation::GroupBegin { + exec_state.push_op(Operation::GroupBegin { group: Group::ModuleInstance { name: value.file_name().unwrap_or_default(), module_id, @@ -885,7 +860,7 @@ impl ExecutorContext { // Due to concurrent execution, we cannot easily // group operations by module. So we leave the // group empty and close it immediately. - exec_state.global.operations.push(Operation::GroupEnd); + exec_state.push_op(Operation::GroupEnd); } } ModulePath::Std { .. } => { @@ -920,7 +895,7 @@ impl ExecutorContext { result.map(|val| ModuleRepr::Foreign(geom.clone(), val)) } - ModuleRepr::Dummy | ModuleRepr::Root => Err(KclError::Internal(KclErrorDetails::new( + ModuleRepr::Dummy | ModuleRepr::Root => Err(KclError::new_internal(KclErrorDetails::new( format!("Module {module_path} not found in universe"), vec![source_range], ))), @@ -930,7 +905,6 @@ impl ExecutorContext { #[cfg(target_arch = "wasm32")] { wasm_bindgen_futures::spawn_local(async move { - //set.spawn(async move { let mut exec_state = exec_state; let exec_ctxt = exec_ctxt; @@ -1000,33 +974,13 @@ impl ExecutorContext { exec_state.global.module_infos[&module_id].restore_repr(repr); } Err(e) => { - let module_id_to_module_path: IndexMap = exec_state - .global - .path_to_source_id - .iter() - .map(|(k, v)| ((*v), k.clone())) - .collect(); - - return Err(KclErrorWithOutputs::new( - e, - exec_state.errors().to_vec(), - #[cfg(feature = "artifact-graph")] - exec_state.global.operations.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_commands.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_graph.clone(), - module_id_to_module_path, - exec_state.global.id_to_source.clone(), - default_planes, - )); + return Err(exec_state.error_with_outputs(e, default_planes)); } } } } - self.inner_run(program, cached_body_items, exec_state, preserve_mem) - .await + self.inner_run(program, exec_state, preserve_mem).await } /// Get the universe & universe map of the program. @@ -1042,7 +996,7 @@ impl ExecutorContext { let default_planes = self.engine.get_default_planes().read().await.clone(); - let root_imports = crate::walk::import_universe( + let root_imports = import_graph::import_universe( self, &ModulePath::Main, &ModuleRepr::Kcl(program.ast.clone(), None), @@ -1050,29 +1004,7 @@ impl ExecutorContext { exec_state, ) .await - .map_err(|err| { - println!("Error: {err:?}"); - let module_id_to_module_path: IndexMap = exec_state - .global - .path_to_source_id - .iter() - .map(|(k, v)| ((*v), k.clone())) - .collect(); - - KclErrorWithOutputs::new( - err, - exec_state.errors().to_vec(), - #[cfg(feature = "artifact-graph")] - exec_state.global.operations.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_commands.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_graph.clone(), - module_id_to_module_path, - exec_state.global.id_to_source.clone(), - default_planes, - ) - })?; + .map_err(|err| exec_state.error_with_outputs(err, default_planes))?; Ok((universe, root_imports)) } @@ -1082,7 +1014,6 @@ impl ExecutorContext { async fn inner_run( &self, program: &crate::Program, - cached_body_items: usize, exec_state: &mut ExecState, preserve_mem: bool, ) -> Result<(EnvironmentRef, Option), KclErrorWithOutputs> { @@ -1096,7 +1027,7 @@ impl ExecutorContext { let default_planes = self.engine.get_default_planes().read().await.clone(); let result = self - .execute_and_build_graph(&program.ast, cached_body_items, exec_state, preserve_mem) + .execute_and_build_graph(&program.ast, exec_state, preserve_mem) .await; crate::log::log(format!( @@ -1105,28 +1036,7 @@ impl ExecutorContext { )); crate::log::log(format!("Engine stats: {:?}", self.engine.stats())); - let env_ref = result.map_err(|e| { - let module_id_to_module_path: IndexMap = exec_state - .global - .path_to_source_id - .iter() - .map(|(k, v)| ((*v), k.clone())) - .collect(); - - KclErrorWithOutputs::new( - e, - exec_state.errors().to_vec(), - #[cfg(feature = "artifact-graph")] - exec_state.global.operations.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_commands.clone(), - #[cfg(feature = "artifact-graph")] - exec_state.global.artifact_graph.clone(), - module_id_to_module_path, - exec_state.global.id_to_source.clone(), - default_planes.clone(), - ) - })?; + let env_ref = result.map_err(|e| exec_state.error_with_outputs(e, default_planes))?; if !self.is_mock() { let mut mem = exec_state.stack().deep_clone(); @@ -1143,7 +1053,6 @@ impl ExecutorContext { async fn execute_and_build_graph( &self, program: NodeRef<'_, crate::parsing::ast::types::Program>, - #[cfg_attr(not(feature = "artifact-graph"), expect(unused))] cached_body_items: usize, exec_state: &mut ExecState, preserve_mem: bool, ) -> Result { @@ -1170,40 +1079,9 @@ impl ExecutorContext { // and should be dropped. self.engine.clear_queues().await; - #[cfg(feature = "artifact-graph")] - { - let new_commands = self.engine.take_artifact_commands().await; - let new_responses = self.engine.take_responses().await; - let initial_graph = exec_state.global.artifact_graph.clone(); - - // Build the artifact graph. - let graph_result = build_artifact_graph( - &new_commands, - &new_responses, - program, - cached_body_items, - &mut exec_state.global.artifacts, - initial_graph, - ); - // Move the artifact commands and responses into ExecState to - // simplify cache management and error creation. - exec_state.global.artifact_commands.extend(new_commands); - exec_state.global.artifact_responses.extend(new_responses); - - match graph_result { - Ok(artifact_graph) => { - exec_state.global.artifact_graph = artifact_graph; - exec_result.map(|(_, env_ref, _)| env_ref) - } - Err(err) => { - // Prefer the exec error. - exec_result.and(Err(err)) - } - } - } - #[cfg(not(feature = "artifact-graph"))] - { - exec_result.map(|(_, env_ref, _)| env_ref) + match exec_state.build_artifact_graph(&self.engine, program).await { + Ok(_) => exec_result.map(|(_, env_ref, _)| env_ref), + Err(err) => exec_result.and(Err(err)), } } @@ -1283,7 +1161,7 @@ impl ExecutorContext { .await?; let kittycad_modeling_cmds::websocket::OkWebSocketResponseData::Export { files } = resp else { - return Err(KclError::Internal(crate::errors::KclErrorDetails::new( + return Err(KclError::new_internal(crate::errors::KclErrorDetails::new( format!("Expected Export response, got {resp:?}",), vec![SourceRange::default()], ))); @@ -1303,7 +1181,7 @@ impl ExecutorContext { coords: *kittycad_modeling_cmds::coord::KITTYCAD, created: if deterministic_time { Some("2021-01-01T00:00:00Z".parse().map_err(|e| { - KclError::Internal(crate::errors::KclErrorDetails::new( + KclError::new_internal(crate::errors::KclErrorDetails::new( format!("Failed to parse date: {}", e), vec![SourceRange::default()], )) @@ -1383,14 +1261,13 @@ pub(crate) async fn parse_execute_with_project_dir( let exec_ctxt = ExecutorContext { engine: Arc::new(Box::new( crate::engine::conn_mock::EngineConnection::new().await.map_err(|err| { - KclError::Internal(crate::errors::KclErrorDetails::new( + KclError::new_internal(crate::errors::KclErrorDetails::new( format!("Failed to create mock engine connection: {}", err), vec![SourceRange::default()], )) })?, )), fs: Arc::new(crate::fs::FileManager::new()), - stdlib: Arc::new(crate::std::StdLib::new()), settings: ExecutorSettings { project_directory, ..Default::default() @@ -1799,7 +1676,7 @@ foo let err = result.unwrap_err(); assert_eq!( err, - KclError::Syntax(KclErrorDetails::new( + KclError::new_syntax(KclErrorDetails::new( "Unexpected token: #".to_owned(), vec![SourceRange::new(14, 15, ModuleId::default())], )), @@ -2058,7 +1935,7 @@ notTagIdentifier = !myTag"; // TODO: We don't currently parse this, but we should. It should be // a runtime error instead. parse_execute(code10).await.unwrap_err(), - KclError::Syntax(KclErrorDetails::new( + KclError::new_syntax(KclErrorDetails::new( "Unexpected token: !".to_owned(), vec![SourceRange::new(10, 11, ModuleId::default())], )) @@ -2071,9 +1948,9 @@ notPipeSub = 1 |> identity(!%))"; // TODO: We don't currently parse this, but we should. It should be // a runtime error instead. parse_execute(code11).await.unwrap_err(), - KclError::Syntax(KclErrorDetails::new( - "Unexpected token: |>".to_owned(), - vec![SourceRange::new(44, 46, ModuleId::default())], + KclError::new_syntax(KclErrorDetails::new( + "There was an unexpected !. Try removing it.".to_owned(), + vec![SourceRange::new(56, 57, ModuleId::default())], )) ); @@ -2206,7 +2083,7 @@ w = f() + f() } // Get the id_generator from the first execution. - let id_generator = cache::read_old_ast().await.unwrap().exec_state.mod_local.id_generator; + let id_generator = cache::read_old_ast().await.unwrap().main.exec_state.id_generator; let code = r#"sketch001 = startSketchOn(XZ) |> startProfile(at = [62.74, 206.13]) @@ -2227,7 +2104,7 @@ w = f() + f() // Execute the program. ctx.run_with_caching(program).await.unwrap(); - let new_id_generator = cache::read_old_ast().await.unwrap().exec_state.mod_local.id_generator; + let new_id_generator = cache::read_old_ast().await.unwrap().main.exec_state.id_generator; assert_eq!(id_generator, new_id_generator); } diff --git a/rust/kcl-lib/src/execution/state.rs b/rust/kcl-lib/src/execution/state.rs index d9b69b7d9..bebf7437d 100644 --- a/rust/kcl-lib/src/execution/state.rs +++ b/rust/kcl-lib/src/execution/state.rs @@ -12,19 +12,19 @@ use uuid::Uuid; use crate::execution::{Artifact, ArtifactCommand, ArtifactGraph, ArtifactId}; use crate::{ errors::{KclError, KclErrorDetails, Severity}, + exec::DefaultPlanes, execution::{ annotations, cad_op::Operation, id_generator::IdGenerator, memory::{ProgramMemory, Stack}, - types, - types::NumericType, + types::{self, NumericType}, EnvironmentRef, ExecOutcome, ExecutorSettings, KclValue, UnitAngle, UnitLen, }, modules::{ModuleId, ModuleInfo, ModuleLoader, ModulePath, ModuleRepr, ModuleSource}, - parsing::ast::types::Annotation, + parsing::ast::types::{Annotation, NodeRef}, source_range::SourceRange, - CompilationError, + CompilationError, EngineManager, ExecutorContext, KclErrorWithOutputs, }; /// State for executing a program. @@ -32,7 +32,6 @@ use crate::{ pub struct ExecState { pub(super) global: GlobalState, pub(super) mod_local: ModuleState, - pub(super) exec_context: Option, } pub type ModuleInfoMap = IndexMap; @@ -45,33 +44,39 @@ pub(super) struct GlobalState { pub id_to_source: IndexMap, /// Map from module ID to module info. pub module_infos: ModuleInfoMap, - /// Output map of UUIDs to artifacts. - #[cfg(feature = "artifact-graph")] - pub artifacts: IndexMap, - /// Output commands to allow building the artifact graph by the caller. - /// These are accumulated in the [`ExecutorContext`] but moved here for - /// convenience of the execution cache. - #[cfg(feature = "artifact-graph")] - pub artifact_commands: Vec, - /// Responses from the engine for `artifact_commands`. We need to cache - /// this so that we can build the artifact graph. These are accumulated in - /// the [`ExecutorContext`] but moved here for convenience of the execution - /// cache. - #[cfg(feature = "artifact-graph")] - pub artifact_responses: IndexMap, - /// Output artifact graph. - #[cfg(feature = "artifact-graph")] - pub artifact_graph: ArtifactGraph, - /// Operations that have been performed in execution order, for display in - /// the Feature Tree. - #[cfg(feature = "artifact-graph")] - pub operations: Vec, /// Module loader. pub mod_loader: ModuleLoader, /// Errors and warnings. pub errors: Vec, + #[allow(dead_code)] + pub artifacts: ArtifactState, } +#[cfg(feature = "artifact-graph")] +#[derive(Debug, Clone, Default)] +pub(super) struct ArtifactState { + /// Output map of UUIDs to artifacts. + pub artifacts: IndexMap, + /// Output commands to allow building the artifact graph by the caller. + /// These are accumulated in the [`ExecutorContext`] but moved here for + /// convenience of the execution cache. + pub commands: Vec, + /// Responses from the engine for `artifact_commands`. We need to cache + /// this so that we can build the artifact graph. These are accumulated in + /// the [`ExecutorContext`] but moved here for convenience of the execution + /// cache. + pub responses: IndexMap, + /// Output artifact graph. + pub graph: ArtifactGraph, + /// Operations that have been performed in execution order, for display in + /// the Feature Tree. + pub operations: Vec, +} + +#[cfg(not(feature = "artifact-graph"))] +#[derive(Debug, Clone, Default)] +pub(super) struct ArtifactState {} + #[derive(Debug, Clone)] pub(super) struct ModuleState { /// The id generator for this module. @@ -80,6 +85,11 @@ pub(super) struct ModuleState { /// The current value of the pipe operator returned from the previous /// expression. If we're not currently in a pipeline, this will be None. pub pipe_value: Option, + /// The closest variable declaration being executed in any parent node in the AST. + /// This is used to provide better error messages, e.g. noticing when the user is trying + /// to use the variable `length` inside the RHS of its own definition, like `length = tan(length)`. + /// TODO: Make this a reference. + pub being_declared: Option, /// Identifiers that have been exported from the current module. pub module_exports: Vec, /// Settings specified from annotations. @@ -93,7 +103,6 @@ impl ExecState { ExecState { global: GlobalState::new(&exec_context.settings), mod_local: ModuleState::new(ModulePath::Main, ProgramMemory::new(), Default::default()), - exec_context: Some(exec_context.clone()), } } @@ -103,7 +112,6 @@ impl ExecState { *self = ExecState { global, mod_local: ModuleState::new(self.mod_local.path.clone(), ProgramMemory::new(), Default::default()), - exec_context: Some(exec_context.clone()), }; } @@ -125,45 +133,26 @@ impl ExecState { /// Convert to execution outcome when running in WebAssembly. We want to /// reduce the amount of data that crosses the WASM boundary as much as /// possible. - pub async fn to_exec_outcome(self, main_ref: EnvironmentRef) -> ExecOutcome { + pub async fn to_exec_outcome(self, main_ref: EnvironmentRef, ctx: &ExecutorContext) -> ExecOutcome { // Fields are opt-in so that we don't accidentally leak private internal // state when we add more to ExecState. ExecOutcome { - variables: self - .stack() - .find_all_in_env(main_ref) - .map(|(k, v)| (k.clone(), v.clone())) - .collect(), + variables: self.mod_local.variables(main_ref), + filenames: self.global.filenames(), #[cfg(feature = "artifact-graph")] - operations: self.global.operations, + operations: self.global.artifacts.operations, #[cfg(feature = "artifact-graph")] - artifact_commands: self.global.artifact_commands, + artifact_commands: self.global.artifacts.commands, #[cfg(feature = "artifact-graph")] - artifact_graph: self.global.artifact_graph, + artifact_graph: self.global.artifacts.graph, errors: self.global.errors, - filenames: self - .global - .path_to_source_id - .iter() - .map(|(k, v)| ((*v), k.clone())) - .collect(), - default_planes: if let Some(ctx) = &self.exec_context { - ctx.engine.get_default_planes().read().await.clone() - } else { - None - }, + default_planes: ctx.engine.get_default_planes().read().await.clone(), } } - pub async fn to_mock_exec_outcome(self, main_ref: EnvironmentRef) -> ExecOutcome { - // Fields are opt-in so that we don't accidentally leak private internal - // state when we add more to ExecState. + pub async fn to_mock_exec_outcome(self, main_ref: EnvironmentRef, ctx: &ExecutorContext) -> ExecOutcome { ExecOutcome { - variables: self - .stack() - .find_all_in_env(main_ref) - .map(|(k, v)| (k.clone(), v.clone())) - .collect(), + variables: self.mod_local.variables(main_ref), #[cfg(feature = "artifact-graph")] operations: Default::default(), #[cfg(feature = "artifact-graph")] @@ -172,11 +161,7 @@ impl ExecState { artifact_graph: Default::default(), errors: self.global.errors, filenames: Default::default(), - default_planes: if let Some(ctx) = &self.exec_context { - ctx.engine.get_default_planes().read().await.clone() - } else { - None - }, + default_planes: ctx.engine.get_default_planes().read().await.clone(), } } @@ -199,12 +184,12 @@ impl ExecState { #[cfg(feature = "artifact-graph")] pub(crate) fn add_artifact(&mut self, artifact: Artifact) { let id = artifact.id(); - self.global.artifacts.insert(id, artifact); + self.global.artifacts.artifacts.insert(id, artifact); } pub(crate) fn push_op(&mut self, op: Operation) { #[cfg(feature = "artifact-graph")] - self.global.operations.push(op); + self.global.artifacts.operations.push(op); #[cfg(not(feature = "artifact-graph"))] drop(op); } @@ -246,10 +231,6 @@ impl ExecState { self.global.id_to_source.insert(id, source.clone()); } - pub(super) fn get_source(&self, id: ModuleId) -> Option<&ModuleSource> { - self.global.id_to_source.get(&id) - } - pub(super) fn add_module(&mut self, id: ModuleId, path: ModulePath, repr: ModuleRepr) { debug_assert!(self.global.path_to_source_id.contains_key(&path)); let module_info = ModuleInfo { id, repr, path }; @@ -276,7 +257,7 @@ impl ExecState { } pub(super) fn circular_import_error(&self, path: &ModulePath, source_range: SourceRange) -> KclError { - KclError::ImportCycle(KclErrorDetails::new( + KclError::new_import_cycle(KclErrorDetails::new( format!( "circular import of modules is not allowed: {} -> {}", self.global @@ -295,6 +276,71 @@ impl ExecState { pub(crate) fn pipe_value(&self) -> Option<&KclValue> { self.mod_local.pipe_value.as_ref() } + + pub(crate) fn error_with_outputs( + &self, + error: KclError, + default_planes: Option, + ) -> KclErrorWithOutputs { + let module_id_to_module_path: IndexMap = self + .global + .path_to_source_id + .iter() + .map(|(k, v)| ((*v), k.clone())) + .collect(); + + KclErrorWithOutputs::new( + error, + self.errors().to_vec(), + #[cfg(feature = "artifact-graph")] + self.global.artifacts.operations.clone(), + #[cfg(feature = "artifact-graph")] + self.global.artifacts.commands.clone(), + #[cfg(feature = "artifact-graph")] + self.global.artifacts.graph.clone(), + module_id_to_module_path, + self.global.id_to_source.clone(), + default_planes, + ) + } + + #[cfg(feature = "artifact-graph")] + pub(crate) async fn build_artifact_graph( + &mut self, + engine: &Arc>, + program: NodeRef<'_, crate::parsing::ast::types::Program>, + ) -> Result<(), KclError> { + let new_commands = engine.take_artifact_commands().await; + let new_responses = engine.take_responses().await; + let initial_graph = self.global.artifacts.graph.clone(); + + // Build the artifact graph. + let graph_result = crate::execution::artifact::build_artifact_graph( + &new_commands, + &new_responses, + program, + &mut self.global.artifacts.artifacts, + initial_graph, + ); + // Move the artifact commands and responses into ExecState to + // simplify cache management and error creation. + self.global.artifacts.commands.extend(new_commands); + self.global.artifacts.responses.extend(new_responses); + + let artifact_graph = graph_result?; + self.global.artifacts.graph = artifact_graph; + + Ok(()) + } + + #[cfg(not(feature = "artifact-graph"))] + pub(crate) async fn build_artifact_graph( + &mut self, + _engine: &Arc>, + _program: NodeRef<'_, crate::parsing::ast::types::Program>, + ) -> Result<(), KclError> { + Ok(()) + } } impl GlobalState { @@ -302,16 +348,7 @@ impl GlobalState { let mut global = GlobalState { path_to_source_id: Default::default(), module_infos: Default::default(), - #[cfg(feature = "artifact-graph")] artifacts: Default::default(), - #[cfg(feature = "artifact-graph")] - artifact_commands: Default::default(), - #[cfg(feature = "artifact-graph")] - artifact_responses: Default::default(), - #[cfg(feature = "artifact-graph")] - artifact_graph: Default::default(), - #[cfg(feature = "artifact-graph")] - operations: Default::default(), mod_loader: Default::default(), errors: Default::default(), id_to_source: Default::default(), @@ -334,6 +371,14 @@ impl GlobalState { .insert(ModulePath::Local { value: root_path }, root_id); global } + + pub(super) fn filenames(&self) -> IndexMap { + self.path_to_source_id.iter().map(|(k, v)| ((*v), k.clone())).collect() + } + + pub(super) fn get_source(&self, id: ModuleId) -> Option<&ModuleSource> { + self.id_to_source.get(&id) + } } impl ModuleState { @@ -342,6 +387,7 @@ impl ModuleState { id_generator: IdGenerator::new(module_id), stack: memory.new_stack(), pipe_value: Default::default(), + being_declared: Default::default(), module_exports: Default::default(), explicit_length_units: false, path, @@ -352,6 +398,13 @@ impl ModuleState { }, } } + + pub(super) fn variables(&self, main_ref: EnvironmentRef) -> IndexMap { + self.stack + .find_all_in_env(main_ref) + .map(|(k, v)| (k.clone(), v.clone())) + .collect() + } } #[derive(Debug, Default, Clone, Deserialize, Serialize, PartialEq, Eq, ts_rs::TS, JsonSchema)] @@ -389,7 +442,7 @@ impl MetaSettings { self.kcl_version = value; } name => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Unexpected settings key: `{name}`; expected one of `{}`, `{}`", annotations::SETTINGS_UNIT_LENGTH, diff --git a/rust/kcl-lib/src/execution/typed_path.rs b/rust/kcl-lib/src/execution/typed_path.rs index e65081d9d..d3b4788a0 100644 --- a/rust/kcl-lib/src/execution/typed_path.rs +++ b/rust/kcl-lib/src/execution/typed_path.rs @@ -220,6 +220,7 @@ impl schemars::JsonSchema for TypedPath { /// /// * Does **not** touch `..` or symlinks – call `canonicalize()` if you need that. /// * Returns an owned `PathBuf` only when normalisation was required. +#[cfg(not(target_arch = "wasm32"))] fn normalise_import>(raw: S) -> std::path::PathBuf { let s = raw.as_ref(); // On Unix we need to swap `\` → `/`. On Windows we leave it alone. diff --git a/rust/kcl-lib/src/execution/types.rs b/rust/kcl-lib/src/execution/types.rs index 4ff36ef00..27908e986 100644 --- a/rust/kcl-lib/src/execution/types.rs +++ b/rust/kcl-lib/src/execution/types.rs @@ -44,6 +44,10 @@ impl RuntimeType { RuntimeType::Primitive(PrimitiveType::Sketch) } + pub fn sketch_or_surface() -> Self { + RuntimeType::Union(vec![Self::sketch(), Self::plane(), Self::face()]) + } + /// `[Sketch; 1+]` pub fn sketches() -> Self { RuntimeType::Array( @@ -183,7 +187,7 @@ impl RuntimeType { }; RuntimeType::Primitive(PrimitiveType::Number(ty)) } - AstPrimitiveType::Named(name) => Self::from_alias(&name.name, exec_state, source_range)?, + AstPrimitiveType::Named { id } => Self::from_alias(&id.name, exec_state, source_range)?, AstPrimitiveType::Tag => RuntimeType::Primitive(PrimitiveType::Tag), AstPrimitiveType::ImportedGeometry => RuntimeType::Primitive(PrimitiveType::ImportedGeometry), AstPrimitiveType::Function(_) => RuntimeType::Primitive(PrimitiveType::Function), diff --git a/rust/kcl-lib/src/fs/local.rs b/rust/kcl-lib/src/fs/local.rs index 9b5c29211..ed1dd76ea 100644 --- a/rust/kcl-lib/src/fs/local.rs +++ b/rust/kcl-lib/src/fs/local.rs @@ -28,7 +28,7 @@ impl Default for FileManager { impl FileSystem for FileManager { async fn read(&self, path: &TypedPath, source_range: SourceRange) -> Result, KclError> { tokio::fs::read(&path.0).await.map_err(|e| { - KclError::Io(KclErrorDetails::new( + KclError::new_io(KclErrorDetails::new( format!("Failed to read file `{}`: {}", path.display(), e), vec![source_range], )) @@ -37,7 +37,7 @@ impl FileSystem for FileManager { async fn read_to_string(&self, path: &TypedPath, source_range: SourceRange) -> Result { tokio::fs::read_to_string(&path.0).await.map_err(|e| { - KclError::Io(KclErrorDetails::new( + KclError::new_io(KclErrorDetails::new( format!("Failed to read file `{}`: {}", path.display(), e), vec![source_range], )) @@ -49,7 +49,7 @@ impl FileSystem for FileManager { if e.kind() == std::io::ErrorKind::NotFound { Ok(false) } else { - Err(KclError::Io(KclErrorDetails::new( + Err(KclError::new_io(KclErrorDetails::new( format!("Failed to check if file `{}` exists: {}", path.display(), e), vec![source_range], ))) @@ -71,7 +71,7 @@ impl FileSystem for FileManager { } let mut read_dir = tokio::fs::read_dir(&path).await.map_err(|e| { - KclError::Io(KclErrorDetails::new( + KclError::new_io(KclErrorDetails::new( format!("Failed to read directory `{}`: {}", path.display(), e), vec![source_range], )) diff --git a/rust/kcl-lib/src/fs/wasm.rs b/rust/kcl-lib/src/fs/wasm.rs index b7604b552..03a8c3461 100644 --- a/rust/kcl-lib/src/fs/wasm.rs +++ b/rust/kcl-lib/src/fs/wasm.rs @@ -49,10 +49,10 @@ impl FileSystem for FileManager { let promise = self .manager .read_file(path.to_string_lossy()) - .map_err(|e| KclError::Engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; let value = JsFuture::from(promise).await.map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to wait for promise from engine: {:?}", e), vec![source_range], )) @@ -67,7 +67,7 @@ impl FileSystem for FileManager { async fn read_to_string(&self, path: &TypedPath, source_range: SourceRange) -> Result { let bytes = self.read(path, source_range).await?; let string = String::from_utf8(bytes).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to convert bytes to string: {:?}", e), vec![source_range], )) @@ -80,17 +80,17 @@ impl FileSystem for FileManager { let promise = self .manager .exists(path.to_string_lossy()) - .map_err(|e| KclError::Engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; let value = JsFuture::from(promise).await.map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to wait for promise from engine: {:?}", e), vec![source_range], )) })?; let it_exists = value.as_bool().ok_or_else(|| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( "Failed to convert value to bool".to_string(), vec![source_range], )) @@ -107,24 +107,24 @@ impl FileSystem for FileManager { let promise = self .manager .get_all_files(path.to_string_lossy()) - .map_err(|e| KclError::Engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; + .map_err(|e| KclError::new_engine(KclErrorDetails::new(e.to_string().into(), vec![source_range])))?; let value = JsFuture::from(promise).await.map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to wait for promise from javascript: {:?}", e), vec![source_range], )) })?; let s = value.as_string().ok_or_else(|| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to get string from response from javascript: `{:?}`", value), vec![source_range], )) })?; let files: Vec = serde_json::from_str(&s).map_err(|e| { - KclError::Engine(KclErrorDetails::new( + KclError::new_engine(KclErrorDetails::new( format!("Failed to parse json from javascript: `{}` `{:?}`", s, e), vec![source_range], )) diff --git a/rust/kcl-lib/src/lsp/kcl/mod.rs b/rust/kcl-lib/src/lsp/kcl/mod.rs index bed5cc5ab..30c9ec3eb 100644 --- a/rust/kcl-lib/src/lsp/kcl/mod.rs +++ b/rust/kcl-lib/src/lsp/kcl/mod.rs @@ -175,11 +175,10 @@ impl Backend { zoo_client: kittycad::Client, can_send_telemetry: bool, ) -> Result { - let stdlib = crate::std::StdLib::new(); let kcl_std = crate::docs::kcl_doc::walk_prelude(); - let stdlib_completions = get_completions_from_stdlib(&stdlib, &kcl_std).map_err(|e| e.to_string())?; - let stdlib_signatures = get_signatures_from_stdlib(&stdlib, &kcl_std); - let stdlib_args = get_arg_maps_from_stdlib(&stdlib, &kcl_std); + let stdlib_completions = get_completions_from_stdlib(&kcl_std).map_err(|e| e.to_string())?; + let stdlib_signatures = get_signatures_from_stdlib(&kcl_std); + let stdlib_args = get_arg_maps_from_stdlib(&kcl_std); Ok(Self { client, @@ -1189,7 +1188,6 @@ impl LanguageServer for Backend { } async fn completion(&self, params: CompletionParams) -> RpcResult> { - // ADAM: This is the entrypoint. let mut completions = vec![CompletionItem { label: PIPE_OPERATOR.to_string(), label_details: None, @@ -1635,16 +1633,8 @@ impl LanguageServer for Backend { } /// Get completions from our stdlib. -pub fn get_completions_from_stdlib( - stdlib: &crate::std::StdLib, - kcl_std: &ModData, -) -> Result> { +pub fn get_completions_from_stdlib(kcl_std: &ModData) -> Result> { let mut completions = HashMap::new(); - let combined = stdlib.combined(); - - for internal_fn in combined.values() { - completions.insert(internal_fn.name(), internal_fn.to_completion_item()?); - } for d in kcl_std.all_docs() { if let Some(ci) = d.to_completion_item() { @@ -1661,13 +1651,8 @@ pub fn get_completions_from_stdlib( } /// Get signatures from our stdlib. -pub fn get_signatures_from_stdlib(stdlib: &crate::std::StdLib, kcl_std: &ModData) -> HashMap { +pub fn get_signatures_from_stdlib(kcl_std: &ModData) -> HashMap { let mut signatures = HashMap::new(); - let combined = stdlib.combined(); - - for internal_fn in combined.values() { - signatures.insert(internal_fn.name(), internal_fn.to_signature_help()); - } for d in kcl_std.all_docs() { if let Some(sig) = d.to_signature_help() { @@ -1679,44 +1664,32 @@ pub fn get_signatures_from_stdlib(stdlib: &crate::std::StdLib, kcl_std: &ModData } /// Get signatures from our stdlib. -pub fn get_arg_maps_from_stdlib( - stdlib: &crate::std::StdLib, - kcl_std: &ModData, -) -> HashMap> { +pub fn get_arg_maps_from_stdlib(kcl_std: &ModData) -> HashMap> { let mut result = HashMap::new(); - let combined = stdlib.combined(); - for internal_fn in combined.values() { - let arg_map: HashMap = internal_fn - .args(false) - .into_iter() + for d in kcl_std.all_docs() { + let crate::docs::kcl_doc::DocData::Fn(f) = d else { + continue; + }; + let arg_map: HashMap = f + .args + .iter() .map(|data| { let mut tip = "```\n".to_owned(); - tip.push_str(&data.name.clone()); - if !data.required { - tip.push('?'); - } - if !data.type_.is_empty() { - tip.push_str(": "); - tip.push_str(&data.type_); - } + tip.push_str(&data.to_string()); tip.push_str("\n```"); - if !data.description.is_empty() { + if let Some(docs) = &data.docs { tip.push_str("\n\n"); - tip.push_str(&data.description); + tip.push_str(docs); } - (data.name, tip) + (data.name.clone(), tip) }) .collect(); if !arg_map.is_empty() { - result.insert(internal_fn.name(), arg_map); + result.insert(f.name.clone(), arg_map); } } - for _d in kcl_std.all_docs() { - // TODO add KCL std fns - } - result } diff --git a/rust/kcl-lib/src/lsp/test_util.rs b/rust/kcl-lib/src/lsp/test_util.rs index 3b8aa5011..81baaac4f 100644 --- a/rust/kcl-lib/src/lsp/test_util.rs +++ b/rust/kcl-lib/src/lsp/test_util.rs @@ -5,11 +5,10 @@ use tower_lsp::LanguageServer; // Create a fake kcl lsp server for testing. pub async fn kcl_lsp_server(execute: bool) -> Result { - let stdlib = crate::std::StdLib::new(); let kcl_std = crate::docs::kcl_doc::walk_prelude(); - let stdlib_completions = crate::lsp::kcl::get_completions_from_stdlib(&stdlib, &kcl_std)?; - let stdlib_signatures = crate::lsp::kcl::get_signatures_from_stdlib(&stdlib, &kcl_std); - let stdlib_args = crate::lsp::kcl::get_arg_maps_from_stdlib(&stdlib, &kcl_std); + let stdlib_completions = crate::lsp::kcl::get_completions_from_stdlib(&kcl_std)?; + let stdlib_signatures = crate::lsp::kcl::get_signatures_from_stdlib(&kcl_std); + let stdlib_args = crate::lsp::kcl::get_arg_maps_from_stdlib(&kcl_std); let zoo_client = crate::engine::new_zoo_client(None, None)?; diff --git a/rust/kcl-lib/src/lsp/tests.rs b/rust/kcl-lib/src/lsp/tests.rs index de89e8078..607efa9b2 100644 --- a/rust/kcl-lib/src/lsp/tests.rs +++ b/rust/kcl-lib/src/lsp/tests.rs @@ -928,7 +928,7 @@ startSketchOn(XY) match hover.unwrap().contents { tower_lsp::lsp_types::HoverContents::Markup(tower_lsp::lsp_types::MarkupContent { value, .. }) => { assert!(value.contains("startSketchOn")); - assert!(value.contains(": SketchSurface")); + assert!(value.contains(": Plane | Face")); assert!(value.contains("Start a new 2-dimensional sketch on a specific")); } _ => unreachable!(), @@ -1113,13 +1113,7 @@ async fn test_kcl_lsp_signature_help() { "Expected one signature, got {:?}", signature_help.signatures ); - assert_eq!( - signature_help.signatures[0].label, - r#"startSketchOn( - @planeOrSolid: SketchData, - face?: FaceTag, -): SketchSurface"# - ); + assert!(signature_help.signatures[0].label.starts_with("startSketchOn")); } else { panic!("Expected signature help"); } @@ -1202,17 +1196,7 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) "Expected one signature, got {:?}", signature_help.signatures ); - assert_eq!( - signature_help.signatures[0].label, - r#"extrude( - @sketches: [Sketch], - length: number, - symmetric?: bool, - bidirectionalLength?: number, - tagStart?: TagNode, - tagEnd?: TagNode, -): [Solid]"# - ); + assert!(signature_help.signatures[0].label.starts_with("extrude")); } else { panic!("Expected signature help"); } @@ -1300,17 +1284,7 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) "Expected one signature, got {:?}", signature_help.signatures ); - assert_eq!( - signature_help.signatures[0].label, - r#"extrude( - @sketches: [Sketch], - length: number, - symmetric?: bool, - bidirectionalLength?: number, - tagStart?: TagNode, - tagEnd?: TagNode, -): [Solid]"# - ); + assert!(signature_help.signatures[0].label.starts_with("extrude")); } else { panic!("Expected signature help"); } @@ -1393,17 +1367,7 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) "Expected one signature, got {:?}", signature_help.signatures ); - assert_eq!( - signature_help.signatures[0].label, - r#"extrude( - @sketches: [Sketch], - length: number, - symmetric?: bool, - bidirectionalLength?: number, - tagStart?: TagNode, - tagEnd?: TagNode, -): [Solid]"# - ); + assert!(signature_help.signatures[0].label.starts_with("extrude")); } else { panic!("Expected signature help"); } @@ -1491,17 +1455,7 @@ a1 = startSketchOn(offsetPlane(XY, offset = 10)) "Expected one signature, got {:?}", signature_help.signatures ); - assert_eq!( - signature_help.signatures[0].label, - r#"extrude( - @sketches: [Sketch], - length: number, - symmetric?: bool, - bidirectionalLength?: number, - tagStart?: TagNode, - tagEnd?: TagNode, -): [Solid]"# - ); + assert!(signature_help.signatures[0].label.starts_with("extrude")); } else { panic!("Expected signature help"); } @@ -3924,7 +3878,7 @@ startSketchOn(XY) match hover.unwrap().contents { tower_lsp::lsp_types::HoverContents::Markup(tower_lsp::lsp_types::MarkupContent { value, .. }) => { assert!(value.contains("startSketchOn")); - assert!(value.contains(": SketchSurface")); + assert!(value.contains(": Plane | Face")); assert!(value.contains("Start a new 2-dimensional sketch on a specific")); } _ => unreachable!(), diff --git a/rust/kcl-lib/src/modules.rs b/rust/kcl-lib/src/modules.rs index 030968a82..ab16356cc 100644 --- a/rust/kcl-lib/src/modules.rs +++ b/rust/kcl-lib/src/modules.rs @@ -58,7 +58,7 @@ impl ModuleLoader { } pub(crate) fn import_cycle_error(&self, path: &ModulePath, source_range: SourceRange) -> KclError { - KclError::ImportCycle(KclErrorDetails::new( + KclError::new_import_cycle(KclErrorDetails::new( format!( "circular import of modules is not allowed: {} -> {}", self.import_stack @@ -163,7 +163,7 @@ impl ModulePath { ModulePath::Std { value: name } => Ok(ModuleSource { source: read_std(name) .ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Cannot find standard library module to import: std::{name}."), vec![source_range], )) @@ -202,7 +202,7 @@ impl ModulePath { ModulePath::Std { .. } => { let message = format!("Cannot import a non-std KCL file from std: {path}."); debug_assert!(false, "{}", &message); - return Err(KclError::Internal(KclErrorDetails::new(message, vec![]))); + return Err(KclError::new_internal(KclErrorDetails::new(message, vec![]))); } }; @@ -217,7 +217,7 @@ impl ModulePath { if path.len() != 2 || path[0] != "std" { let message = format!("Invalid std import path: {path:?}."); debug_assert!(false, "{}", &message); - return Err(KclError::Internal(KclErrorDetails::new(message, vec![]))); + return Err(KclError::new_internal(KclErrorDetails::new(message, vec![]))); } Ok(ModulePath::Std { value: path[1].clone() }) diff --git a/rust/kcl-lib/src/parsing/ast/digest.rs b/rust/kcl-lib/src/parsing/ast/digest.rs index 42a413c2f..c1099baf3 100644 --- a/rust/kcl-lib/src/parsing/ast/digest.rs +++ b/rust/kcl-lib/src/parsing/ast/digest.rs @@ -228,7 +228,7 @@ impl PrimitiveType { let mut hasher = Sha256::new(); match self { PrimitiveType::Any => hasher.update(b"any"), - PrimitiveType::Named(id) => hasher.update(id.compute_digest()), + PrimitiveType::Named { id } => hasher.update(id.compute_digest()), PrimitiveType::String => hasher.update(b"string"), PrimitiveType::Number(suffix) => hasher.update(suffix.digestable_id()), PrimitiveType::Boolean => hasher.update(b"bool"), diff --git a/rust/kcl-lib/src/parsing/ast/types/mod.rs b/rust/kcl-lib/src/parsing/ast/types/mod.rs index 769ad1dd6..5905ca528 100644 --- a/rust/kcl-lib/src/parsing/ast/types/mod.rs +++ b/rust/kcl-lib/src/parsing/ast/types/mod.rs @@ -25,7 +25,6 @@ pub use crate::parsing::ast::types::{ none::KclNone, }; use crate::{ - docs::StdLibFn, errors::KclError, execution::{ annotations, @@ -454,7 +453,7 @@ impl Node { alpha: c.a, }, }; - if colors.borrow().iter().any(|c| *c == color) { + if colors.borrow().contains(&color) { return; } colors.borrow_mut().push(color); @@ -529,7 +528,7 @@ impl Node { let new_color = csscolorparser::Color::new(color.red, color.green, color.blue, color.alpha); Ok(Some(ColorPresentation { // The label will be what they replace the color with. - label: new_color.to_hex_string(), + label: new_color.to_css_hex(), text_edit: None, additional_text_edits: None, })) @@ -1950,6 +1949,10 @@ impl CallExpressionKw { } pub fn replace_value(&mut self, source_range: SourceRange, new_value: Expr) { + if let Some(unlabeled) = &mut self.unlabeled { + unlabeled.replace_value(source_range, new_value.clone()); + } + for arg in &mut self.arguments { arg.arg.replace_value(source_range, new_value.clone()); } @@ -1959,37 +1962,16 @@ impl CallExpressionKw { fn rename_identifiers(&mut self, old_name: &str, new_name: &str) { self.callee.rename(old_name, new_name); + if let Some(unlabeled) = &mut self.unlabeled { + unlabeled.rename_identifiers(old_name, new_name); + } + for arg in &mut self.arguments { arg.arg.rename_identifiers(old_name, new_name); } } } -/// A function declaration. -#[derive(Debug, Clone, Default, Serialize, Deserialize, ts_rs::TS, JsonSchema)] -#[ts(export)] -#[serde(tag = "type")] -pub enum Function { - /// A stdlib function written in Rust (aka core lib). - StdLib { - /// The function. - func: Box, - }, - /// A function that is defined in memory. - #[default] - InMemory, -} - -impl PartialEq for Function { - fn eq(&self, other: &Self) -> bool { - match (self, other) { - (Function::StdLib { func: func1 }, Function::StdLib { func: func2 }) => func1.name() == func2.name(), - (Function::InMemory, Function::InMemory) => true, - _ => false, - } - } -} - #[derive(Debug, Default, Clone, Copy, Deserialize, Serialize, PartialEq, ts_rs::TS, JsonSchema, FromStr, Display)] #[ts(export)] #[serde(rename_all = "snake_case")] @@ -3222,7 +3204,7 @@ pub enum PrimitiveType { /// `fn`, type of functions. Function(FunctionType), /// An identifier used as a type (not really a primitive type, but whatever). - Named(Node), + Named { id: Node }, } impl PrimitiveType { @@ -3278,7 +3260,7 @@ impl fmt::Display for PrimitiveType { } Ok(()) } - PrimitiveType::Named(n) => write!(f, "{}", n.name), + PrimitiveType::Named { id: n } => write!(f, "{}", n.name), } } } @@ -4343,7 +4325,7 @@ startSketchOn(XY) } #[test] - fn module_name() { + fn test_module_name() { #[track_caller] fn assert_mod_name(stmt: &str, name: &str) { let tokens = crate::parsing::token::lex(stmt, ModuleId::default()).unwrap(); @@ -4357,4 +4339,36 @@ startSketchOn(XY) assert_mod_name("import 'foo/main.kcl'", "foo"); assert_mod_name("import 'foo\\bar\\main.kcl'", "bar"); } + + #[test] + fn test_rename_in_math_in_std_function() { + let code = r#"rise = 4.5 +run = 8 +angle = atan(rise / run)"#; + let mut program = crate::parsing::top_level_parse(code).unwrap(); + + // We want to rename `run` to `run2`. + let run = program.body.get(1).unwrap().clone(); + let BodyItem::VariableDeclaration(var_decl) = &run else { + panic!("expected a variable declaration") + }; + let Expr::Literal(lit) = &var_decl.declaration.init else { + panic!("expected a literal"); + }; + assert_eq!(lit.raw, "8"); + + // Rename it. + program.rename_symbol("yoyo", var_decl.as_source_range().start() + 1); + + // Recast the program to a string. + let formatted = program.recast(&Default::default(), 0); + + assert_eq!( + formatted, + r#"rise = 4.5 +yoyo = 8 +angle = atan(rise / yoyo) +"# + ); + } } diff --git a/rust/kcl-lib/src/parsing/mod.rs b/rust/kcl-lib/src/parsing/mod.rs index 855db6050..6445c2ac5 100644 --- a/rust/kcl-lib/src/parsing/mod.rs +++ b/rust/kcl-lib/src/parsing/mod.rs @@ -51,7 +51,7 @@ pub fn parse_tokens(mut tokens: TokenStream) -> ParseResult { } else { format!("found unknown tokens [{}]", token_list.join(", ")) }; - return KclError::Lexical(KclErrorDetails::new(message, source_ranges)).into(); + return KclError::new_lexical(KclErrorDetails::new(message, source_ranges)).into(); } // Important, to not call this before the unknown tokens check. @@ -110,7 +110,7 @@ impl ParseResult { let (p, errs) = self.0?; if let Some(err) = errs.iter().find(|e| e.severity.is_err()) { - return Err(KclError::Syntax(err.clone().into())); + return Err(KclError::new_syntax(err.clone().into())); } match p { Some(p) => Ok(p), diff --git a/rust/kcl-lib/src/parsing/parser.rs b/rust/kcl-lib/src/parsing/parser.rs index 526643027..1215c80ec 100644 --- a/rust/kcl-lib/src/parsing/parser.rs +++ b/rust/kcl-lib/src/parsing/parser.rs @@ -979,12 +979,18 @@ fn property_separator(i: &mut TokenSlice) -> ModalResult<()> { } /// Match something that separates the labeled arguments of a fn call. -fn labeled_arg_separator(i: &mut TokenSlice) -> ModalResult<()> { +/// Returns the source range of the erroneous separator, if any was found. +fn labeled_arg_separator(i: &mut TokenSlice) -> ModalResult> { alt(( // Normally you need a comma. - comma_sep, + comma_sep.map(|_| None), // But, if the argument list is ending, no need for a comma. - peek(preceded(opt(whitespace), close_paren)).void(), + peek(preceded(opt(whitespace), close_paren)).void().map(|_| None), + whitespace.map(|mut tokens| { + // Safe to unwrap here because `whitespace` is guaranteed to return at least 1 whitespace. + let first_token = tokens.pop().unwrap(); + Some(SourceRange::from(&first_token)) + }), )) .parse_next(i) } @@ -2474,32 +2480,13 @@ impl TryFrom for Node { } } -impl Node { - fn into_valid_binding_name(self) -> Result { - // Make sure they are not assigning a variable to a stdlib function. - if crate::std::name_in_stdlib(&self.name) { - return Err(CompilationError::fatal( - SourceRange::from(&self), - format!("Cannot assign a tag to a reserved keyword: {}", self.name), - )); - } - Ok(self) - } -} - /// Parse a Kcl tag that starts with a `$`. fn tag(i: &mut TokenSlice) -> ModalResult> { dollar.parse_next(i)?; - let tag_declarator = any - .try_map(Node::::try_from) + any.try_map(Node::::try_from) .context(expected("a tag, e.g. '$seg01' or '$line01'")) .parse_next(i) - .map_err(|e: ErrMode| e.cut())?; - // Now that we've parsed a tag declarator, verify that it's not a stdlib - // name. If it is, stop backtracking. - tag_declarator - .into_valid_binding_name() - .map_err(|e| ErrMode::Cut(ContextError::from(e))) + .map_err(|e: ErrMode| e.cut()) } /// Helper function. Matches any number of whitespace tokens and ignores them. @@ -2932,7 +2919,7 @@ fn primitive_type(i: &mut TokenSlice) -> ModalResult> { (identifier, opt(delimited(open_paren, uom_for_type, close_paren))).map(|(ident, suffix)| { let mut result = Node::new(PrimitiveType::Boolean, ident.start, ident.end, ident.module_id); result.inner = - PrimitiveType::primitive_from_str(&ident.name, suffix).unwrap_or(PrimitiveType::Named(ident)); + PrimitiveType::primitive_from_str(&ident.name, suffix).unwrap_or(PrimitiveType::Named { id: ident }); result }), )) @@ -3135,7 +3122,7 @@ fn binding_name(i: &mut TokenSlice) -> ModalResult> { /// Either a positional or keyword function call. fn fn_call_pos_or_kw(i: &mut TokenSlice) -> ModalResult { - alt((fn_call_kw.map(Box::new).map(Expr::CallExpressionKw),)).parse_next(i) + fn_call_kw.map(Box::new).map(Expr::CallExpressionKw).parse_next(i) } fn labelled_fn_call(i: &mut TokenSlice) -> ModalResult { @@ -3198,7 +3185,7 @@ fn fn_call_kw(i: &mut TokenSlice) -> ModalResult> { #[allow(clippy::large_enum_variant)] enum ArgPlace { NonCode(Node), - LabeledArg(LabeledArg), + LabeledArg((LabeledArg, Option)), UnlabeledArg(Expr), Keyword(Token), } @@ -3208,7 +3195,7 @@ fn fn_call_kw(i: &mut TokenSlice) -> ModalResult> { alt(( terminated(non_code_node.map(ArgPlace::NonCode), whitespace), terminated(any_keyword.map(ArgPlace::Keyword), whitespace), - terminated(labeled_argument, labeled_arg_separator).map(ArgPlace::LabeledArg), + (labeled_argument, labeled_arg_separator).map(ArgPlace::LabeledArg), expression.map(ArgPlace::UnlabeledArg), )), ) @@ -3220,7 +3207,16 @@ fn fn_call_kw(i: &mut TokenSlice) -> ModalResult> { ArgPlace::NonCode(x) => { non_code_nodes.insert(index, vec![x]); } - ArgPlace::LabeledArg(x) => { + ArgPlace::LabeledArg((x, bad_token_source_range)) => { + if let Some(bad_token_source_range) = bad_token_source_range { + return Err(ErrMode::Cut( + CompilationError::fatal( + bad_token_source_range, + "Missing comma between arguments, try adding a comma in", + ) + .into(), + )); + } args.push(x); } ArgPlace::Keyword(kw) => { @@ -3255,7 +3251,22 @@ fn fn_call_kw(i: &mut TokenSlice) -> ModalResult> { )?; ignore_whitespace(i); opt(comma_sep).parse_next(i)?; - let end = close_paren.parse_next(i)?.end; + let end = match close_paren.parse_next(i) { + Ok(tok) => tok.end, + Err(e) => { + if let Some(tok) = i.next_token() { + return Err(ErrMode::Cut( + CompilationError::fatal( + SourceRange::from(&tok), + format!("There was an unexpected {}. Try removing it.", tok.value), + ) + .into(), + )); + } else { + return Err(e); + } + } + }; // Validate there aren't any duplicate labels. let mut counted_labels = IndexMap::with_capacity(args.len()); @@ -3376,8 +3387,7 @@ mod tests { fn kw_call_as_operand() { let tokens = crate::parsing::token::lex("f(x = 1)", ModuleId::default()).unwrap(); let tokens = tokens.as_slice(); - let op = operand.parse(tokens).unwrap(); - println!("{op:#?}"); + operand.parse(tokens).unwrap(); } #[test] @@ -4383,7 +4393,7 @@ secondExtrude = startSketchOn(XY) #[test] fn test_parse_parens_unicode() { let result = crate::parsing::top_level_parse("(ޜ"); - let KclError::Lexical(details) = result.0.unwrap_err() else { + let KclError::Lexical { details } = result.0.unwrap_err() else { panic!(); }; // TODO: Better errors when program cannot tokenize. @@ -4417,8 +4427,8 @@ z(-[["#, assert_err( r#"z (--#"#, - "Unexpected token: (", - [2, 3], + "There was an unexpected -. Try removing it.", + [3, 4], ); } @@ -4869,19 +4879,6 @@ let myBox = box(p=[0,0], h=-3, l=-16, w=-10) } } - #[test] - fn test_parse_tag_named_std_lib() { - let some_program_string = r#"startSketchOn(XY) - |> startProfile(at = [0, 0]) - |> line(%, end = [5, 5], tag = $xLine) -"#; - assert_err( - some_program_string, - "Cannot assign a tag to a reserved keyword: xLine", - [86, 92], - ); - } - #[test] fn test_parse_empty_tag_brace() { let some_program_string = r#"startSketchOn(XY) @@ -5133,6 +5130,27 @@ bar = 1 assert_eq!(actual.operator, UnaryOperator::Not); crate::parsing::top_level_parse(some_program_string).unwrap(); // Updated import path } + #[test] + fn test_sensible_error_when_missing_comma_between_fn_args() { + let program_source = "startSketchOn(XY) +|> arc( + endAbsolute = [0, 50] + interiorAbsolute = [-50, 0] +)"; + let expected_src_start = program_source.find("]").unwrap(); + let tokens = crate::parsing::token::lex(program_source, ModuleId::default()).unwrap(); + ParseContext::init(); + let err = program + .parse(tokens.as_slice()) + .expect_err("Program succeeded, but it should have failed"); + let cause = err + .inner() + .cause + .as_ref() + .expect("Found an error, but there was no cause. Add a cause."); + assert_eq!(cause.message, "Missing comma between arguments, try adding a comma in",); + assert_eq!(cause.source_range.start() - 1, expected_src_start); + } #[test] fn test_sensible_error_when_missing_rhs_of_kw_arg() { @@ -5152,14 +5170,32 @@ bar = 1 } } + #[test] + fn test_sensible_error_when_unexpected_token_in_fn_call() { + let program_source = "1 +|> extrude( + length=depth, +})"; + let expected_src_start = program_source.find("}").expect("Program should have an extraneous }"); + let tokens = crate::parsing::token::lex(program_source, ModuleId::default()).unwrap(); + ParseContext::init(); + let err = program.parse(tokens.as_slice()).unwrap_err(); + let cause = err + .inner() + .cause + .as_ref() + .expect("Found an error, but there was no cause. Add a cause."); + assert_eq!(cause.message, "There was an unexpected }. Try removing it.",); + assert_eq!(cause.source_range.start(), expected_src_start); + } + #[test] fn test_sensible_error_when_using_keyword_as_arg_label() { for (i, program) in ["pow(2, fn = 8)"].into_iter().enumerate() { let tokens = crate::parsing::token::lex(program, ModuleId::default()).unwrap(); let err = match fn_call_kw.parse(tokens.as_slice()) { Err(e) => e, - Ok(ast) => { - eprintln!("{ast:#?}"); + Ok(_ast) => { panic!("Expected this to error but it didn't"); } }; diff --git a/rust/kcl-lib/src/parsing/token/mod.rs b/rust/kcl-lib/src/parsing/token/mod.rs index 743924bee..7ccd79d93 100644 --- a/rust/kcl-lib/src/parsing/token/mod.rs +++ b/rust/kcl-lib/src/parsing/token/mod.rs @@ -597,7 +597,7 @@ impl From, winnow::error::ContextError>> for KclError { // This is an offset, not an index, and may point to // the end of input (input.len()) on eof errors. - return KclError::Lexical(crate::errors::KclErrorDetails::new( + return KclError::new_lexical(crate::errors::KclErrorDetails::new( "unexpected EOF while parsing".to_owned(), vec![SourceRange::new(offset, offset, module_id)], )); @@ -608,7 +608,7 @@ impl From, winnow::error::ContextError>> for KclError { let bad_token = &input[offset]; // TODO: Add the Winnow parser context to the error. // See https://github.com/KittyCAD/modeling-app/issues/784 - KclError::Lexical(crate::errors::KclErrorDetails::new( + KclError::new_lexical(crate::errors::KclErrorDetails::new( format!("found unknown token '{}'", bad_token), vec![SourceRange::new(offset, offset + 1, module_id)], )) diff --git a/rust/kcl-lib/src/simulation_tests.rs b/rust/kcl-lib/src/simulation_tests.rs index 6e4d0855c..78927417d 100644 --- a/rust/kcl-lib/src/simulation_tests.rs +++ b/rust/kcl-lib/src/simulation_tests.rs @@ -163,7 +163,7 @@ async fn execute_test(test: &Test, render_to_png: bool, export_step: bool) { // Run the program. let exec_res = crate::test_server::execute_and_snapshot_ast(ast, Some(test.entry_point.clone()), export_step).await; match exec_res { - Ok((exec_state, env_ref, png, step)) => { + Ok((exec_state, ctx, env_ref, png, step)) => { let fail_path = test.output_dir.join("execution_error.snap"); if std::fs::exists(&fail_path).unwrap() { panic!("This test case is expected to fail, but it passed. If this is intended, and the test should actually be passing now, please delete kcl-lib/{}", fail_path.to_string_lossy()) @@ -181,7 +181,7 @@ async fn execute_test(test: &Test, render_to_png: bool, export_step: bool) { panic!("Step data was empty"); } } - let outcome = exec_state.to_exec_outcome(env_ref).await; + let outcome = exec_state.to_exec_outcome(env_ref, &ctx).await; let mem_result = catch_unwind(AssertUnwindSafe(|| { assert_snapshot(test, "Variables in memory after executing", || { @@ -3483,3 +3483,66 @@ mod spheres { super::execute(TEST_NAME, true).await } } +mod var_ref_in_own_def { + const TEST_NAME: &str = "var_ref_in_own_def"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[tokio::test(flavor = "multi_thread")] + async fn unparse() { + super::unparse(TEST_NAME).await + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod ascription_unknown_type { + const TEST_NAME: &str = "ascription_unknown_type"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[tokio::test(flavor = "multi_thread")] + async fn unparse() { + super::unparse(TEST_NAME).await + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} +mod var_ref_in_own_def_decl { + const TEST_NAME: &str = "var_ref_in_own_def_decl"; + + /// Test parsing KCL. + #[test] + fn parse() { + super::parse(TEST_NAME) + } + + /// Test that parsing and unparsing KCL produces the original KCL input. + #[tokio::test(flavor = "multi_thread")] + async fn unparse() { + super::unparse(TEST_NAME).await + } + + /// Test that KCL is executed correctly. + #[tokio::test(flavor = "multi_thread")] + async fn kcl_test_execute() { + super::execute(TEST_NAME, true).await + } +} diff --git a/rust/kcl-lib/src/std/appearance.rs b/rust/kcl-lib/src/std/appearance.rs index ec791a07a..62ffb2c76 100644 --- a/rust/kcl-lib/src/std/appearance.rs +++ b/rust/kcl-lib/src/std/appearance.rs @@ -30,7 +30,7 @@ pub async fn hex_string(exec_state: &mut ExecState, args: Args) -> Result 255.0) { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("Colors are given between 0 and 255, so {} is invalid", component.n), vec![args.source_range], ))); @@ -62,7 +62,7 @@ pub async fn appearance(exec_state: &mut ExecState, args: Args) -> Result::from_hex(&color).map_err(|err| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("Invalid hex color (`{color}`): {err}"), vec![args.source_range], )) diff --git a/rust/kcl-lib/src/std/args.rs b/rust/kcl-lib/src/std/args.rs index 483b220d2..f979da19a 100644 --- a/rust/kcl-lib/src/std/args.rs +++ b/rust/kcl-lib/src/std/args.rs @@ -28,6 +28,8 @@ use crate::{ ModuleId, }; +use super::fillet::EdgeReference; + const ERROR_STRING_SKETCH_TO_SOLID_HELPER: &str = "You can convert a sketch (2D) into a Solid (3D) by calling a function like `extrude` or `revolve`"; @@ -121,7 +123,7 @@ impl Args { } T::from_kcl_val(&arg.value).map(Some).ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!( "The arg {label} was given, but it was the wrong type. It should be type {} but it was {}", tynm::type_name::(), @@ -141,9 +143,14 @@ impl Args { where T: for<'a> FromKclValue<'a>, { - if self.kw_args.labeled.get(label).is_none() { - return Ok(None); - }; + match self.kw_args.labeled.get(label) { + None => return Ok(None), + Some(a) => { + if let KclValue::KclNone { .. } = &a.value { + return Ok(None); + } + } + } self.get_kw_arg_typed(label, ty, exec_state).map(Some) } @@ -154,7 +161,7 @@ impl Args { T: FromKclValue<'a>, { self.get_kw_arg_opt(label)?.ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!("This function requires a keyword argument '{label}'"), vec![self.source_range], )) @@ -171,8 +178,8 @@ impl Args { T: for<'a> FromKclValue<'a>, { let Some(arg) = self.kw_args.labeled.get(label) else { - return Err(KclError::Semantic(KclErrorDetails::new( - format!("This function requires a keyword argument '{label}'"), + return Err(KclError::new_semantic(KclErrorDetails::new( + format!("This function requires a keyword argument `{label}`"), vec![self.source_range], ))); }; @@ -184,7 +191,7 @@ impl Args { .map(|t| t.to_string()) .unwrap_or_else(|| arg.value.human_friendly_type().to_owned()); let msg_base = format!( - "This function expected the input argument to be {} but it's actually of type {actual_type_name}", + "This function expected its `{label}` argument to be {} but it's actually of type {actual_type_name}", ty.human_friendly_type(), ); let suggestion = match (ty, actual_type) { @@ -205,7 +212,7 @@ impl Args { if message.contains("one or more Solids or imported geometry but it's actually of type Sketch") { message = format!("{message}. {ERROR_STRING_SKETCH_TO_SOLID_HELPER}"); } - KclError::Semantic(KclErrorDetails::new(message, arg.source_ranges())) + KclError::new_semantic(KclErrorDetails::new(message, arg.source_ranges())) })?; // TODO unnecessary cloning @@ -214,12 +221,12 @@ impl Args { /// Get a labelled keyword arg, check it's an array, and return all items in the array /// plus their source range. - pub(crate) fn kw_arg_array_and_source(&self, label: &str) -> Result, KclError> - where - T: for<'a> FromKclValue<'a>, - { + pub(crate) fn kw_arg_edge_array_and_source( + &self, + label: &str, + ) -> Result, KclError> { let Some(arg) = self.kw_args.labeled.get(label) else { - let err = KclError::Semantic(KclErrorDetails::new( + let err = KclError::new_semantic(KclErrorDetails::new( format!("This function requires a keyword argument '{label}'"), vec![self.source_range], )); @@ -232,12 +239,8 @@ impl Args { .map(|item| { let source = SourceRange::from(item); let val = FromKclValue::from_kcl_val(item).ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( - format!( - "Expected a {} but found {}", - tynm::type_name::(), - arg.value.human_friendly_type() - ), + KclError::new_semantic(KclErrorDetails::new( + format!("Expected an Edge but found {}", arg.value.human_friendly_type()), arg.source_ranges(), )) })?; @@ -259,30 +262,6 @@ impl Args { }) } - /// Get the unlabeled keyword argument. If not set, returns Err. If it - /// can't be converted to the given type, returns Err. - pub(crate) fn get_unlabeled_kw_arg<'a, T>(&'a self, label: &str) -> Result - where - T: FromKclValue<'a>, - { - let arg = self - .unlabeled_kw_arg_unconverted() - .ok_or(KclError::Semantic(KclErrorDetails::new( - format!("This function requires a value for the special unlabeled first parameter, '{label}'"), - vec![self.source_range], - )))?; - - T::from_kcl_val(&arg.value).ok_or_else(|| { - let expected_type_name = tynm::type_name::(); - let actual_type_name = arg.value.human_friendly_type(); - let message = format!("This function expected the input argument to be of type {expected_type_name} but it's actually of type {actual_type_name}"); - KclError::Semantic(KclErrorDetails::new( - message, - arg.source_ranges(), - )) - }) - } - /// Get the unlabeled keyword argument. If not set, returns Err. If it /// can't be converted to the given type, returns Err. pub(crate) fn get_unlabeled_kw_arg_typed( @@ -296,7 +275,7 @@ impl Args { { let arg = self .unlabeled_kw_arg_unconverted() - .ok_or(KclError::Semantic(KclErrorDetails::new( + .ok_or(KclError::new_semantic(KclErrorDetails::new( format!("This function requires a value for the special unlabeled first parameter, '{label}'"), vec![self.source_range], )))?; @@ -330,11 +309,11 @@ impl Args { if message.contains("one or more Solids or imported geometry but it's actually of type Sketch") { message = format!("{message}. {ERROR_STRING_SKETCH_TO_SOLID_HELPER}"); } - KclError::Semantic(KclErrorDetails::new(message, arg.source_ranges())) + KclError::new_semantic(KclErrorDetails::new(message, arg.source_ranges())) })?; T::from_kcl_val(&arg).ok_or_else(|| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("Mismatch between type coercion and value extraction (this isn't your fault).\nTo assist in bug-reporting, expected type: {ty:?}; actual value: {arg:?}"), vec![self.source_range], )) @@ -380,14 +359,14 @@ impl Args { exec_state.stack().get_from_call_stack(&tag.value, self.source_range)? { let info = t.get_info(epoch).ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Tag `{}` does not have engine info", tag.value), vec![self.source_range], )) })?; Ok(info) } else { - Err(KclError::Type(KclErrorDetails::new( + Err(KclError::new_type(KclErrorDetails::new( format!("Tag `{}` does not exist", tag.value), vec![self.source_range], ))) @@ -519,7 +498,7 @@ impl Args { must_be_planar: bool, ) -> Result { if tag.value.is_empty() { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Expected a non-empty tag for the face".to_string(), vec![self.source_range], ))); @@ -528,7 +507,7 @@ impl Args { let engine_info = self.get_tag_engine_info_check_surface(exec_state, tag)?; let surface = engine_info.surface.as_ref().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Tag `{}` does not have a surface", tag.value), vec![self.source_range], )) @@ -547,7 +526,7 @@ impl Args { } } // The must be planar check must be called before the arc check. - ExtrudeSurface::ExtrudeArc(_) if must_be_planar => Some(Err(KclError::Type(KclErrorDetails::new( + ExtrudeSurface::ExtrudeArc(_) if must_be_planar => Some(Err(KclError::new_type(KclErrorDetails::new( format!("Tag `{}` is a non-planar surface", tag.value), vec![self.source_range], )))), @@ -574,7 +553,7 @@ impl Args { } } // The must be planar check must be called before the fillet check. - ExtrudeSurface::Fillet(_) if must_be_planar => Some(Err(KclError::Type(KclErrorDetails::new( + ExtrudeSurface::Fillet(_) if must_be_planar => Some(Err(KclError::new_type(KclErrorDetails::new( format!("Tag `{}` is a non-planar surface", tag.value), vec![self.source_range], )))), @@ -594,7 +573,7 @@ impl Args { } // If we still haven't found the face, return an error. - Err(KclError::Type(KclErrorDetails::new( + Err(KclError::new_type(KclErrorDetails::new( format!("Expected a face with the tag `{}`", tag.value), vec![self.source_range], ))) @@ -619,13 +598,13 @@ where { fn from_args(args: &'a Args, i: usize) -> Result { let Some(arg) = args.args.get(i) else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("Expected an argument at index {i}"), vec![args.source_range], ))); }; let Some(val) = T::from_kcl_val(&arg.value) else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Argument at index {i} was supposed to be type {} but found {}", tynm::type_name::(), @@ -648,7 +627,7 @@ where return Ok(None); } let Some(val) = T::from_kcl_val(&arg.value) else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Argument at index {i} was supposed to be type Option<{}> but found {}", tynm::type_name::(), diff --git a/rust/kcl-lib/src/std/array.rs b/rust/kcl-lib/src/std/array.rs index fa836caa6..c5f022060 100644 --- a/rust/kcl-lib/src/std/array.rs +++ b/rust/kcl-lib/src/std/array.rs @@ -58,7 +58,7 @@ async fn call_map_closure( let output = map_fn.call_kw(None, exec_state, ctxt, args, source_range).await?; let source_ranges = vec![source_range]; let output = output.ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( "Map function must return a value".to_owned(), source_ranges, )) @@ -70,7 +70,7 @@ async fn call_map_closure( pub async fn reduce(exec_state: &mut ExecState, args: Args) -> Result { let array: Vec = args.get_unlabeled_kw_arg_typed("array", &RuntimeType::any_array(), exec_state)?; let f: &FunctionSource = args.get_kw_arg("f")?; - let initial: KclValue = args.get_kw_arg("initial")?; + let initial: KclValue = args.get_kw_arg_typed("initial", &RuntimeType::any(), exec_state)?; inner_reduce(array, initial, f, exec_state, &args).await } @@ -118,7 +118,7 @@ async fn call_reduce_closure( // Unpack the returned transform object. let source_ranges = vec![source_range]; let out = transform_fn_return.ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( "Reducer function must return a value".to_string(), source_ranges.clone(), )) @@ -128,7 +128,7 @@ async fn call_reduce_closure( pub async fn push(exec_state: &mut ExecState, args: Args) -> Result { let (mut array, ty) = args.get_unlabeled_kw_arg_array_and_type("array", exec_state)?; - let item: KclValue = args.get_kw_arg("item")?; + let item: KclValue = args.get_kw_arg_typed("item", &RuntimeType::any(), exec_state)?; array.push(item); @@ -138,7 +138,7 @@ pub async fn push(exec_state: &mut ExecState, args: Args) -> Result Result { let (mut array, ty) = args.get_unlabeled_kw_arg_array_and_type("array", exec_state)?; if array.is_empty() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Cannot pop from an empty array".to_string(), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/assert.rs b/rust/kcl-lib/src/std/assert.rs index ab6145638..afde7469a 100644 --- a/rust/kcl-lib/src/std/assert.rs +++ b/rust/kcl-lib/src/std/assert.rs @@ -1,18 +1,17 @@ //! Standard library assert functions. use anyhow::Result; -use kcl_derive_docs::stdlib; use super::args::TyF64; use crate::{ errors::{KclError, KclErrorDetails}, - execution::{ExecState, KclValue}, + execution::{types::RuntimeType, ExecState, KclValue}, std::Args, }; async fn _assert(value: bool, message: &str, args: &Args) -> Result<(), KclError> { if !value { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( format!("assert failed: {}", message), vec![args.source_range], ))); @@ -20,41 +19,28 @@ async fn _assert(value: bool, message: &str, args: &Args) -> Result<(), KclError Ok(()) } -pub async fn assert_is(_exec_state: &mut ExecState, args: Args) -> Result { - let actual = args.get_unlabeled_kw_arg("actual")?; - let error = args.get_kw_arg_opt("error")?; +pub async fn assert_is(exec_state: &mut ExecState, args: Args) -> Result { + let actual = args.get_unlabeled_kw_arg_typed("actual", &RuntimeType::bool(), exec_state)?; + let error = args.get_kw_arg_opt_typed("error", &RuntimeType::string(), exec_state)?; inner_assert_is(actual, error, &args).await?; Ok(KclValue::none()) } /// Check that the provided value is true, or raise a [KclError] /// with the provided description. -pub async fn assert(_exec_state: &mut ExecState, args: Args) -> Result { - let actual = args.get_unlabeled_kw_arg("actual")?; - let gt = args.get_kw_arg_opt("isGreaterThan")?; - let lt = args.get_kw_arg_opt("isLessThan")?; - let gte = args.get_kw_arg_opt("isGreaterThanOrEqual")?; - let lte = args.get_kw_arg_opt("isLessThanOrEqual")?; - let eq = args.get_kw_arg_opt("isEqualTo")?; - let tolerance = args.get_kw_arg_opt("tolerance")?; - let error = args.get_kw_arg_opt("error")?; +pub async fn assert(exec_state: &mut ExecState, args: Args) -> Result { + let actual = args.get_unlabeled_kw_arg_typed("actual", &RuntimeType::num_any(), exec_state)?; + let gt = args.get_kw_arg_opt_typed("isGreaterThan", &RuntimeType::num_any(), exec_state)?; + let lt = args.get_kw_arg_opt_typed("isLessThan", &RuntimeType::num_any(), exec_state)?; + let gte = args.get_kw_arg_opt_typed("isGreaterThanOrEqual", &RuntimeType::num_any(), exec_state)?; + let lte = args.get_kw_arg_opt_typed("isLessThanOrEqual", &RuntimeType::num_any(), exec_state)?; + let eq = args.get_kw_arg_opt_typed("isEqualTo", &RuntimeType::num_any(), exec_state)?; + let tolerance = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::num_any(), exec_state)?; + let error = args.get_kw_arg_opt_typed("error", &RuntimeType::string(), exec_state)?; inner_assert(actual, gt, lt, gte, lte, eq, tolerance, error, &args).await?; Ok(KclValue::none()) } -/// Asserts that a value is the boolean value true. -/// ```no_run -/// kclIsFun = true -/// assertIs(kclIsFun) -/// ``` -#[stdlib{ - name = "assertIs", - unlabeled_first = true, - args = { - actual = { docs = "Value to check. If this is the boolean value true, assert passes. Otherwise it fails." }, - error = { docs = "If the value was false, the program will terminate with this error message" }, - } -}] async fn inner_assert_is(actual: bool, error: Option, args: &Args) -> Result<(), KclError> { let error_msg = match &error { Some(x) => x, @@ -63,29 +49,6 @@ async fn inner_assert_is(actual: bool, error: Option, args: &Args) -> Re _assert(actual, error_msg, args).await } -/// Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. -/// If you provide multiple conditions, they will all be checked and all must be met. -/// -/// ```no_run -/// n = 10 -/// assert(n, isEqualTo = 10) -/// assert(n, isGreaterThanOrEqual = 0, isLessThan = 100, error = "number should be between 0 and 100") -/// assert(1.0000000000012, isEqualTo = 1, tolerance = 0.0001, error = "number should be almost exactly 1") -/// ``` -#[stdlib { - name = "assert", - unlabeled_first = true, - args = { - actual = { docs = "Value to check. It will be compared with one of the comparison arguments." }, - is_greater_than = { docs = "Comparison argument. If given, checks the `actual` value is greater than this." }, - is_less_than = { docs = "Comparison argument. If given, checks the `actual` value is less than this." }, - is_greater_than_or_equal = { docs = "Comparison argument. If given, checks the `actual` value is greater than or equal to this." }, - is_less_than_or_equal = { docs = "Comparison argument. If given, checks the `actual` value is less than or equal to this." }, - is_equal_to = { docs = "Comparison argument. If given, checks the `actual` value is less than or equal to this.", include_in_snippet = true }, - tolerance = { docs = "If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places." }, - error = { docs = "If the value was false, the program will terminate with this error message" }, - } -}] #[allow(clippy::too_many_arguments)] async fn inner_assert( actual: TyF64, @@ -109,14 +72,14 @@ async fn inner_assert( .iter() .all(|cond| cond.is_none()); if no_condition_given { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "You must provide at least one condition in this assert (for example, isEqualTo)".to_owned(), vec![args.source_range], ))); } if tolerance.is_some() && is_equal_to.is_none() { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "The `tolerance` arg is only used with `isEqualTo`. Either remove `tolerance` or add an `isEqualTo` arg." .to_owned(), vec![args.source_range], diff --git a/rust/kcl-lib/src/std/chamfer.rs b/rust/kcl-lib/src/std/chamfer.rs index 3bd72adee..61b9deb2c 100644 --- a/rust/kcl-lib/src/std/chamfer.rs +++ b/rust/kcl-lib/src/std/chamfer.rs @@ -21,7 +21,7 @@ pub(crate) const DEFAULT_TOLERANCE: f64 = 0.0000001; pub async fn chamfer(exec_state: &mut ExecState, args: Args) -> Result { let solid = args.get_unlabeled_kw_arg_typed("solid", &RuntimeType::Primitive(PrimitiveType::Solid), exec_state)?; let length: TyF64 = args.get_kw_arg_typed("length", &RuntimeType::length(), exec_state)?; - let tags = args.kw_arg_array_and_source::("tags")?; + let tags = args.kw_arg_edge_array_and_source("tags")?; let tag = args.get_kw_arg_opt("tag")?; super::fillet::validate_unique(&tags)?; @@ -41,7 +41,7 @@ async fn inner_chamfer( // If you try and tag multiple edges with a tagged chamfer, we want to return an // error to the user that they can only tag one edge at a time. if tag.is_some() && tags.len() > 1 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "You can only tag one edge at a time with a tagged chamfer. Either delete the tag for the chamfer fn if you don't need it OR separate into individual chamfer functions for each tag.".to_string(), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/clone.rs b/rust/kcl-lib/src/std/clone.rs index 373ef199f..bdd5832d6 100644 --- a/rust/kcl-lib/src/std/clone.rs +++ b/rust/kcl-lib/src/std/clone.rs @@ -84,7 +84,7 @@ async fn inner_clone( fix_tags_and_references(&mut new_geometry, old_id, exec_state, &args) .await .map_err(|e| { - KclError::Internal(KclErrorDetails::new( + KclError::new_internal(KclErrorDetails::new( format!("failed to fix tags and references: {:?}", e), vec![args.source_range], )) diff --git a/rust/kcl-lib/src/std/csg.rs b/rust/kcl-lib/src/std/csg.rs index 300d1e9e2..ef767d964 100644 --- a/rust/kcl-lib/src/std/csg.rs +++ b/rust/kcl-lib/src/std/csg.rs @@ -23,7 +23,7 @@ pub async fn union(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::length(), exec_state)?; if solids.len() < 2 { - return Err(KclError::UndefinedValue(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "At least two solids are required for a union operation.".to_string(), vec![args.source_range], ))); @@ -66,7 +66,7 @@ pub(crate) async fn inner_union( modeling_response: OkModelingCmdResponse::BooleanUnion(BooleanUnion { extra_solid_ids }), } = result else { - return Err(KclError::Internal(KclErrorDetails::new( + return Err(KclError::new_internal(KclErrorDetails::new( "Failed to get the result of the union operation.".to_string(), vec![args.source_range], ))); @@ -88,7 +88,7 @@ pub async fn intersect(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::length(), exec_state)?; if solids.len() < 2 { - return Err(KclError::UndefinedValue(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "At least two solids are required for an intersect operation.".to_string(), vec![args.source_range], ))); @@ -131,7 +131,7 @@ pub(crate) async fn inner_intersect( modeling_response: OkModelingCmdResponse::BooleanIntersection(BooleanIntersection { extra_solid_ids }), } = result else { - return Err(KclError::Internal(KclErrorDetails::new( + return Err(KclError::new_internal(KclErrorDetails::new( "Failed to get the result of the intersection operation.".to_string(), vec![args.source_range], ))); @@ -193,7 +193,7 @@ pub(crate) async fn inner_subtract( modeling_response: OkModelingCmdResponse::BooleanSubtract(BooleanSubtract { extra_solid_ids }), } = result else { - return Err(KclError::Internal(KclErrorDetails::new( + return Err(KclError::new_internal(KclErrorDetails::new( "Failed to get the result of the subtract operation.".to_string(), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/edge.rs b/rust/kcl-lib/src/std/edge.rs index 6861d6ed5..c41ad1180 100644 --- a/rust/kcl-lib/src/std/edge.rs +++ b/rust/kcl-lib/src/std/edge.rs @@ -1,14 +1,16 @@ //! Edge helper functions. use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{each_cmd as mcmd, ok_response::OkModelingCmdResponse, websocket::OkWebSocketResponseData, ModelingCmd}; use kittycad_modeling_cmds as kcmc; use uuid::Uuid; use crate::{ errors::{KclError, KclErrorDetails}, - execution::{types::RuntimeType, ExecState, ExtrudeSurface, KclValue, TagIdentifier}, + execution::{ + types::{ArrayLen, RuntimeType}, + ExecState, ExtrudeSurface, KclValue, TagIdentifier, + }, std::Args, }; @@ -23,42 +25,6 @@ pub async fn get_opposite_edge(exec_state: &mut ExecState, args: Args) -> Result }) } -/// Get the opposite edge to the edge given. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> angledLine( -/// angle = 120, -/// length = 10, -/// ) -/// |> line(end = [-10, 0]) -/// |> angledLine( -/// angle = 240, -/// length = 10, -/// tag = $referenceEdge, -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// |> fillet( -/// radius = 3, -/// tags = [getOppositeEdge(referenceEdge)], -/// ) -/// ``` -#[stdlib { - name = "getOppositeEdge", - unlabeled_first = true, - args = { - edge = { docs = "The tag of the edge you want to find the opposite edge of." }, - }, - tags = ["sketch"] -}] async fn inner_get_opposite_edge( edge: TagIdentifier, exec_state: &mut ExecState, @@ -86,7 +52,7 @@ async fn inner_get_opposite_edge( modeling_response: OkModelingCmdResponse::Solid3dGetOppositeEdge(opposite_edge), } = &resp else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!("mcmd::Solid3dGetOppositeEdge response was not as expected: {:?}", resp), vec![args.source_range], ))); @@ -106,42 +72,6 @@ pub async fn get_next_adjacent_edge(exec_state: &mut ExecState, args: Args) -> R }) } -/// Get the next adjacent edge to the edge given. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> angledLine( -/// angle = 120, -/// length = 10, -/// ) -/// |> line(end = [-10, 0]) -/// |> angledLine( -/// angle = 240, -/// length = 10, -/// tag = $referenceEdge, -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// |> fillet( -/// radius = 3, -/// tags = [getNextAdjacentEdge(referenceEdge)], -/// ) -/// ``` -#[stdlib { - name = "getNextAdjacentEdge", - unlabeled_first = true, - args = { - edge = { docs = "The tag of the edge you want to find the next adjacent edge of." }, - }, - tags = ["sketch"] -}] async fn inner_get_next_adjacent_edge( edge: TagIdentifier, exec_state: &mut ExecState, @@ -170,7 +100,7 @@ async fn inner_get_next_adjacent_edge( modeling_response: OkModelingCmdResponse::Solid3dGetNextAdjacentEdge(adjacent_edge), } = &resp else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!( "mcmd::Solid3dGetNextAdjacentEdge response was not as expected: {:?}", resp @@ -180,7 +110,7 @@ async fn inner_get_next_adjacent_edge( }; adjacent_edge.edge.ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("No edge found next adjacent to tag: `{}`", edge.value), vec![args.source_range], )) @@ -198,42 +128,6 @@ pub async fn get_previous_adjacent_edge(exec_state: &mut ExecState, args: Args) }) } -/// Get the previous adjacent edge to the edge given. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> angledLine( -/// angle = 120, -/// length = 10, -/// ) -/// |> line(end = [-10, 0]) -/// |> angledLine( -/// angle = 240, -/// length = 10, -/// tag = $referenceEdge, -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// |> fillet( -/// radius = 3, -/// tags = [getPreviousAdjacentEdge(referenceEdge)], -/// ) -/// ``` -#[stdlib { - name = "getPreviousAdjacentEdge", - unlabeled_first = true, - args = { - edge = { docs = "The tag of the edge you want to find the previous adjacent edge of." }, - }, - tags = ["sketch"] -}] async fn inner_get_previous_adjacent_edge( edge: TagIdentifier, exec_state: &mut ExecState, @@ -261,7 +155,7 @@ async fn inner_get_previous_adjacent_edge( modeling_response: OkModelingCmdResponse::Solid3dGetPrevAdjacentEdge(adjacent_edge), } = &resp else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!( "mcmd::Solid3dGetPrevAdjacentEdge response was not as expected: {:?}", resp @@ -271,7 +165,7 @@ async fn inner_get_previous_adjacent_edge( }; adjacent_edge.edge.ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("No edge found previous adjacent to tag: `{}`", edge.value), vec![args.source_range], )) @@ -280,7 +174,11 @@ async fn inner_get_previous_adjacent_edge( /// Get the shared edge between two faces. pub async fn get_common_edge(exec_state: &mut ExecState, args: Args) -> Result { - let faces: Vec = args.get_kw_arg("faces")?; + let faces: Vec = args.get_kw_arg_typed( + "faces", + &RuntimeType::Array(Box::new(RuntimeType::tag_identifier()), ArrayLen::Known(2)), + exec_state, + )?; let edge = inner_get_common_edge(faces, exec_state, args.clone()).await?; Ok(KclValue::Uuid { @@ -289,38 +187,6 @@ pub async fn get_common_edge(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [0, scale]) -/// |> line(end = [scale, 0]) -/// |> line(end = [0, -scale]) -/// |> close(tag = $line0) -/// |> extrude(length = 20, tagEnd = $end0) -/// // We tag the chamfer to reference it later. -/// |> chamfer(length = 10, tags = [getOppositeEdge(line0)], tag = $chamfer0) -/// -/// // Get the shared edge between the chamfer and the extrusion. -/// commonEdge = getCommonEdge(faces = [chamfer0, end0]) -/// -/// // Chamfer the shared edge. -/// // TODO: uncomment this when ssi for fillets lands -/// // chamfer(part001, length = 5, tags = [commonEdge]) -/// ``` -#[stdlib { - name = "getCommonEdge", - feature_tree_operation = false, - unlabeled_first = false, - args = { - faces = { docs = "The tags of the faces you want to find the common edge between" }, - }, - tags = ["sketch"] -}] async fn inner_get_common_edge( faces: Vec, exec_state: &mut ExecState, @@ -332,7 +198,7 @@ async fn inner_get_common_edge( } if faces.len() != 2 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "getCommonEdge requires exactly two tags for faces".to_string(), vec![args.source_range], ))); @@ -344,7 +210,7 @@ async fn inner_get_common_edge( let second_tagged_path = args.get_tag_engine_info(exec_state, &faces[1])?; if first_tagged_path.sketch != second_tagged_path.sketch { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "getCommonEdge requires the faces to be in the same original sketch".to_string(), vec![args.source_range], ))); @@ -373,14 +239,14 @@ async fn inner_get_common_edge( modeling_response: OkModelingCmdResponse::Solid3dGetCommonEdge(common_edge), } = &resp else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!("mcmd::Solid3dGetCommonEdge response was not as expected: {:?}", resp), vec![args.source_range], ))); }; common_edge.edge.ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!( "No common edge was found between `{}` and `{}`", faces[0].value, faces[1].value diff --git a/rust/kcl-lib/src/std/extrude.rs b/rust/kcl-lib/src/std/extrude.rs index 53dd1bee2..1a23943ac 100644 --- a/rust/kcl-lib/src/std/extrude.rs +++ b/rust/kcl-lib/src/std/extrude.rs @@ -3,7 +3,6 @@ use std::collections::HashMap; use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{ each_cmd as mcmd, length_unit::LengthUnit, @@ -31,7 +30,7 @@ use crate::{ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result { let sketches = args.get_unlabeled_kw_arg_typed("sketches", &RuntimeType::sketches(), exec_state)?; let length: TyF64 = args.get_kw_arg_typed("length", &RuntimeType::length(), exec_state)?; - let symmetric = args.get_kw_arg_opt("symmetric")?; + let symmetric = args.get_kw_arg_opt_typed("symmetric", &RuntimeType::bool(), exec_state)?; let bidirectional_length: Option = args.get_kw_arg_opt_typed("bidirectionalLength", &RuntimeType::length(), exec_state)?; let tag_start = args.get_kw_arg_opt("tagStart")?; @@ -52,113 +51,6 @@ pub async fn extrude(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> arc( -/// angleStart = 120, -/// angleEnd = 0, -/// radius = 5, -/// ) -/// |> line(end = [5, 0]) -/// |> line(end = [0, 10]) -/// |> bezierCurve( -/// control1 = [-10, 0], -/// control2 = [2, 10], -/// end = [-5, 10], -/// ) -/// |> line(end = [-5, -2]) -/// |> close() -/// |> extrude(length = 10) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [-10, 0]) -/// |> arc( -/// angleStart = 120, -/// angleEnd = -60, -/// radius = 5, -/// ) -/// |> line(end = [10, 0]) -/// |> line(end = [5, 0]) -/// |> bezierCurve( -/// control1 = [-3, 0], -/// control2 = [2, 10], -/// end = [-5, 10], -/// ) -/// |> line(end = [-4, 10]) -/// |> line(end = [-5, -2]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [-10, 0]) -/// |> arc( -/// angleStart = 120, -/// angleEnd = -60, -/// radius = 5, -/// ) -/// |> line(end = [10, 0]) -/// |> line(end = [5, 0]) -/// |> bezierCurve( -/// control1 = [-3, 0], -/// control2 = [2, 10], -/// end = [-5, 10], -/// ) -/// |> line(end = [-4, 10]) -/// |> line(end = [-5, -2]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 20, symmetric = true) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [-10, 0]) -/// |> arc( -/// angleStart = 120, -/// angleEnd = -60, -/// radius = 5, -/// ) -/// |> line(end = [10, 0]) -/// |> line(end = [5, 0]) -/// |> bezierCurve( -/// control1 = [-3, 0], -/// control2 = [2, 10], -/// end = [-5, 10], -/// ) -/// |> line(end = [-4, 10]) -/// |> line(end = [-5, -2]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10, bidirectionalLength = 50) -/// ``` -#[stdlib { - name = "extrude", - feature_tree_operation = true, - unlabeled_first = true, - args = { - sketches = { docs = "Which sketch or sketches should be extruded"}, - length = { docs = "How far to extrude the given sketches"}, - symmetric = { docs = "If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch." }, - bidirectional_length = { docs = "If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored."}, - tag_start = { docs = "A named tag for the face at the start of the extrusion, i.e. the original sketch" }, - tag_end = { docs = "A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch" }, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_extrude( sketches: Vec, @@ -174,7 +66,7 @@ async fn inner_extrude( let mut solids = Vec::new(); if symmetric.unwrap_or(false) && bidirectional_length.is_some() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "You cannot give both `symmetric` and `bidirectional` params, you have to choose one or the other" .to_owned(), vec![args.source_range], @@ -261,7 +153,7 @@ pub(crate) async fn do_post_extrude<'a>( // The "get extrusion face info" API call requires *any* edge on the sketch being extruded. // So, let's just use the first one. let Some(any_edge_id) = sketch.paths.first().map(|edge| edge.get_base().geo_meta.id) else { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Expected a non-empty sketch".to_owned(), vec![args.source_range], ))); @@ -389,7 +281,7 @@ pub(crate) async fn do_post_extrude<'a>( // Add the tags for the start or end caps. if let Some(tag_start) = named_cap_tags.start { let Some(start_cap_id) = start_cap_id else { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( format!( "Expected a start cap ID for tag `{}` for extrusion of sketch {:?}", tag_start.name, sketch.id @@ -409,7 +301,7 @@ pub(crate) async fn do_post_extrude<'a>( } if let Some(tag_end) = named_cap_tags.end { let Some(end_cap_id) = end_cap_id else { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( format!( "Expected an end cap ID for tag `{}` for extrusion of sketch {:?}", tag_end.name, sketch.id diff --git a/rust/kcl-lib/src/std/fillet.rs b/rust/kcl-lib/src/std/fillet.rs index e272c3257..f30699447 100644 --- a/rust/kcl-lib/src/std/fillet.rs +++ b/rust/kcl-lib/src/std/fillet.rs @@ -49,7 +49,7 @@ pub(super) fn validate_unique(tags: &[(T, SourceRange)] } } if !duplicate_tags_source.is_empty() { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "The same edge ID is being referenced multiple times, which is not allowed. Please select a different edge" .to_string(), duplicate_tags_source, @@ -63,7 +63,7 @@ pub async fn fillet(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::length(), exec_state)?; - let tags = args.kw_arg_array_and_source::("tags")?; + let tags = args.kw_arg_edge_array_and_source("tags")?; let tag = args.get_kw_arg_opt("tag")?; // Run the function. @@ -85,14 +85,14 @@ async fn inner_fillet( // If you try and tag multiple edges with a tagged fillet, we want to return an // error to the user that they can only tag one edge at a time. if tag.is_some() && tags.len() > 1 { - return Err(KclError::Type(KclErrorDetails { + return Err(KclError::new_type(KclErrorDetails { message: "You can only tag one edge at a time with a tagged fillet. Either delete the tag for the fillet fn if you don't need it OR separate into individual fillet functions for each tag.".to_string(), source_ranges: vec![args.source_range], backtrace: Default::default(), })); } if tags.is_empty() { - return Err(KclError::Semantic(KclErrorDetails { + return Err(KclError::new_semantic(KclErrorDetails { source_ranges: vec![args.source_range], message: "You must fillet at least one tag".to_owned(), backtrace: Default::default(), diff --git a/rust/kcl-lib/src/std/helix.rs b/rust/kcl-lib/src/std/helix.rs index a60dafcb6..c4802a2f3 100644 --- a/rust/kcl-lib/src/std/helix.rs +++ b/rust/kcl-lib/src/std/helix.rs @@ -18,7 +18,7 @@ use crate::{ pub async fn helix(exec_state: &mut ExecState, args: Args) -> Result { let angle_start: TyF64 = args.get_kw_arg_typed("angleStart", &RuntimeType::degrees(), exec_state)?; let revolutions: TyF64 = args.get_kw_arg_typed("revolutions", &RuntimeType::count(), exec_state)?; - let ccw = args.get_kw_arg_opt("ccw")?; + let ccw = args.get_kw_arg_opt_typed("ccw", &RuntimeType::bool(), exec_state)?; let radius: Option = args.get_kw_arg_opt_typed("radius", &RuntimeType::length(), exec_state)?; let axis: Option = args.get_kw_arg_opt_typed( "axis", @@ -33,7 +33,7 @@ pub async fn helix(exec_state: &mut ExecState, args: Args) -> Result Result Result Result Result Result { // Make sure they gave us a length. let Some(length) = length else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Length is required when creating a helix around an axis.".to_owned(), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/loft.rs b/rust/kcl-lib/src/std/loft.rs index 365936672..38f44d1a1 100644 --- a/rust/kcl-lib/src/std/loft.rs +++ b/rust/kcl-lib/src/std/loft.rs @@ -3,7 +3,6 @@ use std::num::NonZeroU32; use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; use kittycad_modeling_cmds as kcmc; @@ -24,14 +23,17 @@ const DEFAULT_V_DEGREE: u32 = 2; pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result { let sketches = args.get_unlabeled_kw_arg_typed("sketches", &RuntimeType::sketches(), exec_state)?; let v_degree: NonZeroU32 = args - .get_kw_arg_opt("vDegree")? + .get_kw_arg_opt_typed("vDegree", &RuntimeType::count(), exec_state)? .unwrap_or(NonZeroU32::new(DEFAULT_V_DEGREE).unwrap()); // Attempt to approximate rational curves (such as arcs) using a bezier. // This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios // Over time, this field won't be necessary. - let bez_approximate_rational = args.get_kw_arg_opt("bezApproximateRational")?.unwrap_or(false); + let bez_approximate_rational = args + .get_kw_arg_opt_typed("bezApproximateRational", &RuntimeType::bool(), exec_state)? + .unwrap_or(false); // This can be set to override the automatically determined topological base curve, which is usually the first section encountered. - let base_curve_index: Option = args.get_kw_arg_opt("baseCurveIndex")?; + let base_curve_index: Option = + args.get_kw_arg_opt_typed("baseCurveIndex", &RuntimeType::count(), exec_state)?; // Tolerance for the loft operation. let tolerance: Option = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::length(), exec_state)?; let tag_start = args.get_kw_arg_opt("tagStart")?; @@ -52,87 +54,6 @@ pub async fn loft(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [-100, 200]) -/// |> line(end = [200, 0]) -/// |> line(end = [0, -200]) -/// |> line(end = [-200, 0]) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// triangleSketch = startSketchOn(offsetPlane(XY, offset = 75)) -/// |> startProfile(at = [0, 125]) -/// |> line(end = [-15, -30]) -/// |> line(end = [30, 0]) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// loft([triangleSketch, squareSketch]) -/// ``` -/// -/// ```no_run -/// // Loft a square, a circle, and another circle. -/// squareSketch = startSketchOn(XY) -/// |> startProfile(at = [-100, 200]) -/// |> line(end = [200, 0]) -/// |> line(end = [0, -200]) -/// |> line(end = [-200, 0]) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// circleSketch0 = startSketchOn(offsetPlane(XY, offset = 75)) -/// |> circle( center = [0, 100], radius = 50 ) -/// -/// circleSketch1 = startSketchOn(offsetPlane(XY, offset = 150)) -/// |> circle( center = [0, 100], radius = 20 ) -/// -/// loft([squareSketch, circleSketch0, circleSketch1]) -/// ``` -/// -/// ```no_run -/// // Loft a square, a circle, and another circle with options. -/// squareSketch = startSketchOn(XY) -/// |> startProfile(at = [-100, 200]) -/// |> line(end = [200, 0]) -/// |> line(end = [0, -200]) -/// |> line(end = [-200, 0]) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// circleSketch0 = startSketchOn(offsetPlane(XY, offset = 75)) -/// |> circle( center = [0, 100], radius = 50 ) -/// -/// circleSketch1 = startSketchOn(offsetPlane(XY, offset = 150)) -/// |> circle( center = [0, 100], radius = 20 ) -/// -/// loft([squareSketch, circleSketch0, circleSketch1], -/// baseCurveIndex = 0, -/// bezApproximateRational = false, -/// tolerance = 0.000001, -/// vDegree = 2, -/// ) -/// ``` -#[stdlib { - name = "loft", - feature_tree_operation = true, - unlabeled_first = true, - args = { - sketches = {docs = "Which sketches to loft. Must include at least 2 sketches."}, - v_degree = {docs = "Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. This defaults to 2, if not specified."}, - bez_approximate_rational = {docs = "Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios Over time, this field won't be necessary."}, - base_curve_index = {docs = "This can be set to override the automatically determined topological base curve, which is usually the first section encountered."}, - tolerance = {docs = "Tolerance for the loft operation."}, - tag_start = { docs = "A named tag for the face at the start of the loft, i.e. the original sketch" }, - tag_end = { docs = "A named tag for the face at the end of the loft, i.e. the last sketch" }, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_loft( sketches: Vec, @@ -147,7 +68,7 @@ async fn inner_loft( ) -> Result, KclError> { // Make sure we have at least two sketches. if sketches.len() < 2 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Loft requires at least two sketches, but only {} were provided.", sketches.len() diff --git a/rust/kcl-lib/src/std/math.rs b/rust/kcl-lib/src/std/math.rs index 4bc22a9e6..2c9c05560 100644 --- a/rust/kcl-lib/src/std/math.rs +++ b/rust/kcl-lib/src/std/math.rs @@ -56,7 +56,7 @@ pub async fn sqrt(exec_state: &mut ExecState, args: Args) -> Result= 2".to_string(), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/mod.rs b/rust/kcl-lib/src/std/mod.rs index e700b6cad..939e2f1a4 100644 --- a/rust/kcl-lib/src/std/mod.rs +++ b/rust/kcl-lib/src/std/mod.rs @@ -28,14 +28,10 @@ pub mod utils; use anyhow::Result; pub use args::Args; -use indexmap::IndexMap; -use lazy_static::lazy_static; use crate::{ - docs::StdLibFn, errors::KclError, execution::{types::PrimitiveType, ExecState, KclValue}, - parsing::ast::types::Name, }; pub type StdFn = fn( @@ -43,70 +39,6 @@ pub type StdFn = fn( Args, ) -> std::pin::Pin> + Send + '_>>; -lazy_static! { - static ref CORE_FNS: Vec> = vec![ - Box::new(crate::std::extrude::Extrude), - Box::new(crate::std::segment::SegEnd), - Box::new(crate::std::segment::SegEndX), - Box::new(crate::std::segment::SegEndY), - Box::new(crate::std::segment::SegStart), - Box::new(crate::std::segment::SegStartX), - Box::new(crate::std::segment::SegStartY), - Box::new(crate::std::segment::LastSegX), - Box::new(crate::std::segment::LastSegY), - Box::new(crate::std::segment::SegLen), - Box::new(crate::std::segment::SegAng), - Box::new(crate::std::segment::TangentToEnd), - Box::new(crate::std::shapes::CircleThreePoint), - // Box::new(crate::std::shapes::Ellipse), - Box::new(crate::std::shapes::Polygon), - Box::new(crate::std::sketch::Conic), - Box::new(crate::std::sketch::Elliptic), - Box::new(crate::std::sketch::EllipticPoint), - Box::new(crate::std::sketch::Hyperbolic), - Box::new(crate::std::sketch::HyperbolicPoint), - Box::new(crate::std::sketch::InvoluteCircular), - Box::new(crate::std::sketch::Line), - Box::new(crate::std::sketch::Parabolic), - Box::new(crate::std::sketch::ParabolicPoint), - Box::new(crate::std::sketch::XLine), - Box::new(crate::std::sketch::YLine), - Box::new(crate::std::sketch::AngledLine), - Box::new(crate::std::sketch::AngledLineThatIntersects), - Box::new(crate::std::sketch::StartSketchOn), - Box::new(crate::std::sketch::StartProfile), - Box::new(crate::std::sketch::ProfileStartX), - Box::new(crate::std::sketch::ProfileStartY), - Box::new(crate::std::sketch::ProfileStart), - Box::new(crate::std::sketch::Close), - Box::new(crate::std::sketch::Arc), - Box::new(crate::std::sketch::TangentialArc), - Box::new(crate::std::sketch::BezierCurve), - Box::new(crate::std::sketch::Subtract2D), - Box::new(crate::std::patterns::PatternLinear2D), - Box::new(crate::std::patterns::PatternCircular2D), - Box::new(crate::std::edge::GetOppositeEdge), - Box::new(crate::std::edge::GetNextAdjacentEdge), - Box::new(crate::std::edge::GetPreviousAdjacentEdge), - Box::new(crate::std::edge::GetCommonEdge), - Box::new(crate::std::sweep::Sweep), - Box::new(crate::std::loft::Loft), - Box::new(crate::std::assert::Assert), - Box::new(crate::std::assert::AssertIs), - Box::new(crate::std::transform::Scale), - Box::new(crate::std::transform::Translate), - Box::new(crate::std::transform::Rotate), - ]; -} - -pub fn name_in_stdlib(name: &str) -> bool { - CORE_FNS.iter().any(|f| f.name() == name) -} - -pub fn get_stdlib_fn(name: &str) -> Option> { - CORE_FNS.iter().find(|f| f.name() == name).cloned() -} - #[derive(Clone, Debug, PartialEq, Eq)] pub struct StdFnProps { pub name: String, @@ -240,14 +172,30 @@ pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProp |e, a| Box::pin(crate::std::mirror::mirror_2d(e, a)), StdFnProps::default("std::transform::mirror2d"), ), - ("sketch", "revolve") => ( - |e, a| Box::pin(crate::std::revolve::revolve(e, a)), - StdFnProps::default("std::sketch::revolve").include_in_feature_tree(), + ("transform", "translate") => ( + |e, a| Box::pin(crate::std::transform::translate(e, a)), + StdFnProps::default("std::transform::translate").include_in_feature_tree(), + ), + ("transform", "rotate") => ( + |e, a| Box::pin(crate::std::transform::rotate(e, a)), + StdFnProps::default("std::transform::rotate").include_in_feature_tree(), + ), + ("transform", "scale") => ( + |e, a| Box::pin(crate::std::transform::scale(e, a)), + StdFnProps::default("std::transform::scale").include_in_feature_tree(), ), ("prelude", "offsetPlane") => ( |e, a| Box::pin(crate::std::planes::offset_plane(e, a)), StdFnProps::default("std::offsetPlane").include_in_feature_tree(), ), + ("prelude", "assert") => ( + |e, a| Box::pin(crate::std::assert::assert(e, a)), + StdFnProps::default("std::assert"), + ), + ("prelude", "assertIs") => ( + |e, a| Box::pin(crate::std::assert::assert_is(e, a)), + StdFnProps::default("std::assertIs"), + ), ("solid", "fillet") => ( |e, a| Box::pin(crate::std::fillet::fillet(e, a)), StdFnProps::default("std::solid::fillet").include_in_feature_tree(), @@ -312,10 +260,170 @@ pub(crate) fn std_fn(path: &str, fn_name: &str) -> (crate::std::StdFn, StdFnProp |e, a| Box::pin(crate::std::clone::clone(e, a)), StdFnProps::default("std::clone").include_in_feature_tree(), ), + ("sketch", "circle") => ( + |e, a| Box::pin(crate::std::shapes::circle(e, a)), + StdFnProps::default("std::sketch::circle"), + ), + ("sketch", "extrude") => ( + |e, a| Box::pin(crate::std::extrude::extrude(e, a)), + StdFnProps::default("std::sketch::extrude").include_in_feature_tree(), + ), ("sketch", "patternTransform2d") => ( |e, a| Box::pin(crate::std::patterns::pattern_transform_2d(e, a)), StdFnProps::default("std::sketch::patternTransform2d"), ), + ("sketch", "revolve") => ( + |e, a| Box::pin(crate::std::revolve::revolve(e, a)), + StdFnProps::default("std::sketch::revolve").include_in_feature_tree(), + ), + ("sketch", "sweep") => ( + |e, a| Box::pin(crate::std::sweep::sweep(e, a)), + StdFnProps::default("std::sketch::sweep").include_in_feature_tree(), + ), + ("sketch", "loft") => ( + |e, a| Box::pin(crate::std::loft::loft(e, a)), + StdFnProps::default("std::sketch::loft").include_in_feature_tree(), + ), + ("sketch", "polygon") => ( + |e, a| Box::pin(crate::std::shapes::polygon(e, a)), + StdFnProps::default("std::sketch::polygon"), + ), + ("sketch", "circleThreePoint") => ( + |e, a| Box::pin(crate::std::shapes::circle_three_point(e, a)), + StdFnProps::default("std::sketch::circleThreePoint"), + ), + ("sketch", "getCommonEdge") => ( + |e, a| Box::pin(crate::std::edge::get_common_edge(e, a)), + StdFnProps::default("std::sketch::getCommonEdge"), + ), + ("sketch", "getNextAdjacentEdge") => ( + |e, a| Box::pin(crate::std::edge::get_next_adjacent_edge(e, a)), + StdFnProps::default("std::sketch::getNextAdjacentEdge"), + ), + ("sketch", "getOppositeEdge") => ( + |e, a| Box::pin(crate::std::edge::get_opposite_edge(e, a)), + StdFnProps::default("std::sketch::revolve"), + ), + ("sketch", "getPreviousAdjacentEdge") => ( + |e, a| Box::pin(crate::std::edge::get_previous_adjacent_edge(e, a)), + StdFnProps::default("std::sketch::getPreviousAdjacentEdge"), + ), + ("sketch", "patternLinear2d") => ( + |e, a| Box::pin(crate::std::patterns::pattern_linear_2d(e, a)), + StdFnProps::default("std::sketch::patternLinear2d"), + ), + ("sketch", "patternCircular2d") => ( + |e, a| Box::pin(crate::std::patterns::pattern_circular_2d(e, a)), + StdFnProps::default("std::sketch::patternCircular2d"), + ), + ("sketch", "segEnd") => ( + |e, a| Box::pin(crate::std::segment::segment_end(e, a)), + StdFnProps::default("std::sketch::segEnd"), + ), + ("sketch", "segEndX") => ( + |e, a| Box::pin(crate::std::segment::segment_end_x(e, a)), + StdFnProps::default("std::sketch::segEndX"), + ), + ("sketch", "segEndY") => ( + |e, a| Box::pin(crate::std::segment::segment_end_y(e, a)), + StdFnProps::default("std::sketch::segEndY"), + ), + ("sketch", "segStart") => ( + |e, a| Box::pin(crate::std::segment::segment_start(e, a)), + StdFnProps::default("std::sketch::segStart"), + ), + ("sketch", "segStartX") => ( + |e, a| Box::pin(crate::std::segment::segment_start_x(e, a)), + StdFnProps::default("std::sketch::segStartX"), + ), + ("sketch", "segStartY") => ( + |e, a| Box::pin(crate::std::segment::segment_start_y(e, a)), + StdFnProps::default("std::sketch::segStartY"), + ), + ("sketch", "lastSegX") => ( + |e, a| Box::pin(crate::std::segment::last_segment_x(e, a)), + StdFnProps::default("std::sketch::lastSegX"), + ), + ("sketch", "lastSegY") => ( + |e, a| Box::pin(crate::std::segment::last_segment_y(e, a)), + StdFnProps::default("std::sketch::lastSegY"), + ), + ("sketch", "segLen") => ( + |e, a| Box::pin(crate::std::segment::segment_length(e, a)), + StdFnProps::default("std::sketch::segLen"), + ), + ("sketch", "segAng") => ( + |e, a| Box::pin(crate::std::segment::segment_angle(e, a)), + StdFnProps::default("std::sketch::segAng"), + ), + ("sketch", "tangentToEnd") => ( + |e, a| Box::pin(crate::std::segment::tangent_to_end(e, a)), + StdFnProps::default("std::sketch::tangentToEnd"), + ), + ("sketch", "profileStart") => ( + |e, a| Box::pin(crate::std::sketch::profile_start(e, a)), + StdFnProps::default("std::sketch::profileStart"), + ), + ("sketch", "profileStartX") => ( + |e, a| Box::pin(crate::std::sketch::profile_start_x(e, a)), + StdFnProps::default("std::sketch::profileStartX"), + ), + ("sketch", "profileStartY") => ( + |e, a| Box::pin(crate::std::sketch::profile_start_y(e, a)), + StdFnProps::default("std::sketch::profileStartY"), + ), + ("sketch", "startSketchOn") => ( + |e, a| Box::pin(crate::std::sketch::start_sketch_on(e, a)), + StdFnProps::default("std::sketch::startSketchOn").include_in_feature_tree(), + ), + ("sketch", "startProfile") => ( + |e, a| Box::pin(crate::std::sketch::start_profile(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "involuteCircular") => ( + |e, a| Box::pin(crate::std::sketch::involute_circular(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "line") => ( + |e, a| Box::pin(crate::std::sketch::line(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "xLine") => ( + |e, a| Box::pin(crate::std::sketch::x_line(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "yLine") => ( + |e, a| Box::pin(crate::std::sketch::y_line(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "angledLine") => ( + |e, a| Box::pin(crate::std::sketch::angled_line(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "angledLineThatIntersects") => ( + |e, a| Box::pin(crate::std::sketch::angled_line_that_intersects(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "close") => ( + |e, a| Box::pin(crate::std::sketch::close(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "arc") => ( + |e, a| Box::pin(crate::std::sketch::arc(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "tangentialArc") => ( + |e, a| Box::pin(crate::std::sketch::tangential_arc(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "bezierCurve") => ( + |e, a| Box::pin(crate::std::sketch::bezier_curve(e, a)), + StdFnProps::default("std::sketch::startProfile"), + ), + ("sketch", "subtract2d") => ( + |e, a| Box::pin(crate::std::sketch::subtract_2d(e, a)), + StdFnProps::default("std::sketch::startProfile").include_in_feature_tree(), + ), ("appearance", "hexString") => ( |e, a| Box::pin(crate::std::appearance::hex_string(e, a)), StdFnProps::default("std::appearance::hexString"), @@ -340,56 +448,5 @@ pub(crate) fn std_ty(path: &str, fn_name: &str) -> (PrimitiveType, StdFnProps) { } } -pub struct StdLib { - pub fns: IndexMap>, -} - -impl std::fmt::Debug for StdLib { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - f.debug_struct("StdLib").field("fns.len()", &self.fns.len()).finish() - } -} - -impl StdLib { - pub fn new() -> Self { - let fns = CORE_FNS - .clone() - .into_iter() - .map(|internal_fn| (internal_fn.name(), internal_fn)) - .collect(); - - Self { fns } - } - - // Get the combined hashmaps. - pub fn combined(&self) -> IndexMap> { - self.fns.clone() - } - - pub fn get(&self, name: &str) -> Option> { - self.fns.get(name).cloned() - } - - pub fn get_rust_function(&self, name: &Name) -> Option> { - if let Some(name) = name.local_ident() { - if let Some(f) = self.get(name.inner) { - return Some(f); - } - } - - None - } - - pub fn contains_key(&self, key: &str) -> bool { - self.fns.contains_key(key) - } -} - -impl Default for StdLib { - fn default() -> Self { - Self::new() - } -} - /// The default tolerance for modeling commands in [`kittycad_modeling_cmds::length_unit::LengthUnit`]. const DEFAULT_TOLERANCE: f64 = 0.0000001; diff --git a/rust/kcl-lib/src/std/patterns.rs b/rust/kcl-lib/src/std/patterns.rs index 904a5c2d8..6b90c1009 100644 --- a/rust/kcl-lib/src/std/patterns.rs +++ b/rust/kcl-lib/src/std/patterns.rs @@ -3,7 +3,6 @@ use std::cmp::Ordering; use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{ each_cmd as mcmd, length_unit::LengthUnit, ok_response::OkModelingCmdResponse, shared::Transform, websocket::OkWebSocketResponseData, ModelingCmd, @@ -37,9 +36,9 @@ const MUST_HAVE_ONE_INSTANCE: &str = "There must be at least 1 instance of your /// Repeat some 3D solid, changing each repetition slightly. pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result { let solids = args.get_unlabeled_kw_arg_typed("solids", &RuntimeType::solids(), exec_state)?; - let instances: u32 = args.get_kw_arg("instances")?; + let instances: u32 = args.get_kw_arg_typed("instances", &RuntimeType::count(), exec_state)?; let transform: &FunctionSource = args.get_kw_arg("transform")?; - let use_original: Option = args.get_kw_arg_opt("useOriginal")?; + let use_original = args.get_kw_arg_opt_typed("useOriginal", &RuntimeType::bool(), exec_state)?; let solids = inner_pattern_transform(solids, instances, transform, use_original, exec_state, &args).await?; Ok(solids.into()) @@ -48,9 +47,9 @@ pub async fn pattern_transform(exec_state: &mut ExecState, args: Args) -> Result /// Repeat some 2D sketch, changing each repetition slightly. pub async fn pattern_transform_2d(exec_state: &mut ExecState, args: Args) -> Result { let sketches = args.get_unlabeled_kw_arg_typed("sketches", &RuntimeType::sketches(), exec_state)?; - let instances: u32 = args.get_kw_arg("instances")?; + let instances: u32 = args.get_kw_arg_typed("instances", &RuntimeType::count(), exec_state)?; let transform: &FunctionSource = args.get_kw_arg("transform")?; - let use_original: Option = args.get_kw_arg_opt("useOriginal")?; + let use_original = args.get_kw_arg_opt_typed("useOriginal", &RuntimeType::bool(), exec_state)?; let sketches = inner_pattern_transform_2d(sketches, instances, transform, use_original, exec_state, &args).await?; Ok(sketches.into()) @@ -67,7 +66,7 @@ async fn inner_pattern_transform<'a>( // Build the vec of transforms, one for each repetition. let mut transform_vec = Vec::with_capacity(usize::try_from(instances).unwrap()); if instances < 1 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( MUST_HAVE_ONE_INSTANCE.to_owned(), vec![args.source_range], ))); @@ -97,7 +96,7 @@ async fn inner_pattern_transform_2d<'a>( // Build the vec of transforms, one for each repetition. let mut transform_vec = Vec::with_capacity(usize::try_from(instances).unwrap()); if instances < 1 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( MUST_HAVE_ONE_INSTANCE.to_owned(), vec![args.source_range], ))); @@ -177,7 +176,7 @@ async fn send_pattern_transform( } &mock_ids } else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!("EntityLinearPattern response was not as expected: {:?}", resp), vec![args.source_range], ))); @@ -223,7 +222,7 @@ async fn make_transform( // Unpack the returned transform object. let source_ranges = vec![source_range]; let transform_fn_return = transform_fn_return.ok_or_else(|| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( "Transform function must return a value".to_string(), source_ranges.clone(), )) @@ -234,7 +233,7 @@ async fn make_transform( let transforms: Vec<_> = value .into_iter() .map(|val| { - val.into_object().ok_or(KclError::Semantic(KclErrorDetails::new( + val.into_object().ok_or(KclError::new_semantic(KclErrorDetails::new( "Transform function must return a transform object".to_string(), source_ranges.clone(), ))) @@ -243,7 +242,7 @@ async fn make_transform( transforms } _ => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Transform function must return a transform object".to_string(), source_ranges.clone(), ))) @@ -266,7 +265,7 @@ fn transform_from_obj_fields( Some(KclValue::Bool { value: true, .. }) => true, Some(KclValue::Bool { value: false, .. }) => false, Some(_) => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "The 'replicate' key must be a bool".to_string(), source_ranges.clone(), ))); @@ -298,7 +297,7 @@ fn transform_from_obj_fields( let mut rotation = Rotation::default(); if let Some(rot) = transform.get("rotation") { let KclValue::Object { value: rot, meta: _ } = rot else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "The 'rotation' key must be an object (with optional fields 'angle', 'axis' and 'origin')".to_owned(), source_ranges.clone(), ))); @@ -312,7 +311,7 @@ fn transform_from_obj_fields( rotation.angle = Angle::from_degrees(*number); } _ => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "The 'rotation.angle' key must be a number (of degrees)".to_owned(), source_ranges.clone(), ))); @@ -346,7 +345,7 @@ fn array_to_point3d( ) -> Result<[TyF64; 3], KclError> { val.coerce(&RuntimeType::point3d(), true, exec_state) .map_err(|e| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "Expected an array of 3 numbers (i.e., a 3D point), found {}", e.found @@ -366,7 +365,7 @@ fn array_to_point2d( ) -> Result<[TyF64; 2], KclError> { val.coerce(&RuntimeType::point2d(), true, exec_state) .map_err(|e| { - KclError::Semantic(KclErrorDetails::new( + KclError::new_semantic(KclErrorDetails::new( format!( "Expected an array of 2 numbers (i.e., a 2D point), found {}", e.found @@ -521,7 +520,7 @@ mod tests { /// A linear pattern on a 2D sketch. pub async fn pattern_linear_2d(exec_state: &mut ExecState, args: Args) -> Result { let sketches = args.get_unlabeled_kw_arg_typed("sketches", &RuntimeType::sketches(), exec_state)?; - let instances: u32 = args.get_kw_arg("instances")?; + let instances: u32 = args.get_kw_arg_typed("instances", &RuntimeType::count(), exec_state)?; let distance: TyF64 = args.get_kw_arg_typed("distance", &RuntimeType::length(), exec_state)?; let axis: Axis2dOrPoint2d = args.get_kw_arg_typed( "axis", @@ -531,11 +530,11 @@ pub async fn pattern_linear_2d(exec_state: &mut ExecState, args: Args) -> Result ]), exec_state, )?; - let use_original: Option = args.get_kw_arg_opt("useOriginal")?; + let use_original = args.get_kw_arg_opt_typed("useOriginal", &RuntimeType::bool(), exec_state)?; let axis = axis.to_point2d(); if axis[0].n == 0.0 && axis[1].n == 0.0 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "The axis of the linear pattern cannot be the zero vector. Otherwise they will just duplicate in place." .to_owned(), vec![args.source_range], @@ -546,47 +545,6 @@ pub async fn pattern_linear_2d(exec_state: &mut ExecState, args: Args) -> Result Ok(sketches.into()) } -/// Repeat a 2-dimensional sketch along some dimension, with a dynamic amount -/// of distance between each repetition, some specified number of times. -/// -/// ```no_run -/// /// Pattern using a named axis. -/// -/// exampleSketch = startSketchOn(XZ) -/// |> circle(center = [0, 0], radius = 1) -/// |> patternLinear2d( -/// axis = X, -/// instances = 7, -/// distance = 4 -/// ) -/// -/// example = extrude(exampleSketch, length = 1) -/// ``` -/// -/// ```no_run -/// /// Pattern using a raw axis. -/// -/// exampleSketch = startSketchOn(XZ) -/// |> circle(center = [0, 0], radius = 1) -/// |> patternLinear2d( -/// axis = [1, 0], -/// instances = 7, -/// distance = 4 -/// ) -/// -/// example = extrude(exampleSketch, length = 1) -/// ``` -#[stdlib { - name = "patternLinear2d", - unlabeled_first = true, - args = { - sketches = { docs = "The sketch(es) to duplicate" }, - instances = { docs = "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect." }, - distance = { docs = "Distance between each repetition. Also known as 'spacing'."}, - axis = { docs = "The axis of the pattern. A 2D vector.", snippet_value_array = ["1", "0"] }, - use_original = { docs = "If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false." }, - } -}] async fn inner_pattern_linear_2d( sketches: Vec, instances: u32, @@ -622,7 +580,7 @@ async fn inner_pattern_linear_2d( /// A linear pattern on a 3D model. pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result { let solids = args.get_unlabeled_kw_arg_typed("solids", &RuntimeType::solids(), exec_state)?; - let instances: u32 = args.get_kw_arg("instances")?; + let instances: u32 = args.get_kw_arg_typed("instances", &RuntimeType::count(), exec_state)?; let distance: TyF64 = args.get_kw_arg_typed("distance", &RuntimeType::length(), exec_state)?; let axis: Axis3dOrPoint3d = args.get_kw_arg_typed( "axis", @@ -632,11 +590,11 @@ pub async fn pattern_linear_3d(exec_state: &mut ExecState, args: Args) -> Result ]), exec_state, )?; - let use_original: Option = args.get_kw_arg_opt("useOriginal")?; + let use_original = args.get_kw_arg_opt_typed("useOriginal", &RuntimeType::bool(), exec_state)?; let axis = axis.to_point3d(); if axis[0].n == 0.0 && axis[1].n == 0.0 && axis[2].n == 0.0 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "The axis of the linear pattern cannot be the zero vector. Otherwise they will just duplicate in place." .to_owned(), vec![args.source_range], @@ -790,11 +748,11 @@ impl CircularPattern { /// A circular pattern on a 2D sketch. pub async fn pattern_circular_2d(exec_state: &mut ExecState, args: Args) -> Result { let sketches = args.get_unlabeled_kw_arg_typed("sketches", &RuntimeType::sketches(), exec_state)?; - let instances: u32 = args.get_kw_arg("instances")?; + let instances: u32 = args.get_kw_arg_typed("instances", &RuntimeType::count(), exec_state)?; let center: [TyF64; 2] = args.get_kw_arg_typed("center", &RuntimeType::point2d(), exec_state)?; let arc_degrees: Option = args.get_kw_arg_opt_typed("arcDegrees", &RuntimeType::degrees(), exec_state)?; - let rotate_duplicates: Option = args.get_kw_arg_opt("rotateDuplicates")?; - let use_original: Option = args.get_kw_arg_opt("useOriginal")?; + let rotate_duplicates = args.get_kw_arg_opt_typed("rotateDuplicates", &RuntimeType::bool(), exec_state)?; + let use_original = args.get_kw_arg_opt_typed("useOriginal", &RuntimeType::bool(), exec_state)?; let sketches = inner_pattern_circular_2d( sketches, @@ -810,40 +768,6 @@ pub async fn pattern_circular_2d(exec_state: &mut ExecState, args: Args) -> Resu Ok(sketches.into()) } -/// Repeat a 2-dimensional sketch some number of times along a partial or -/// complete circle some specified number of times. Each object may -/// additionally be rotated along the circle, ensuring orientation of the -/// solid with respect to the center of the circle is maintained. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [.5, 25]) -/// |> line(end = [0, 5]) -/// |> line(end = [-1, 0]) -/// |> line(end = [0, -5]) -/// |> close() -/// |> patternCircular2d( -/// center = [0, 0], -/// instances = 13, -/// arcDegrees = 360, -/// rotateDuplicates = true -/// ) -/// -/// example = extrude(exampleSketch, length = 1) -/// ``` -#[stdlib { - name = "patternCircular2d", - unlabeled_first = true, - args = { - sketch_set = { docs = "Which sketch(es) to pattern" }, - instances = { docs = "The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect."}, - center = { docs = "The center about which to make the pattern. This is a 2D vector.", snippet_value_array = ["0", "0"]}, - arc_degrees = { docs = "The arc angle (in degrees) to place the repetitions. Must be greater than 0. Defaults to 360."}, - rotate_duplicates= { docs = "Whether or not to rotate the duplicates as they are copied. Defaults to true."}, - use_original= { docs = "If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. Defaults to false."}, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_pattern_circular_2d( sketch_set: Vec, @@ -879,7 +803,7 @@ async fn inner_pattern_circular_2d( .await?; let Geometries::Sketches(new_sketches) = geometries else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Expected a vec of sketches".to_string(), vec![args.source_range], ))); @@ -915,10 +839,10 @@ pub async fn pattern_circular_3d(exec_state: &mut ExecState, args: Args) -> Resu // The arc angle (in degrees) to place the repetitions. Must be greater than 0. let arc_degrees: Option = args.get_kw_arg_opt_typed("arcDegrees", &RuntimeType::degrees(), exec_state)?; // Whether or not to rotate the duplicates as they are copied. - let rotate_duplicates: Option = args.get_kw_arg_opt("rotateDuplicates")?; + let rotate_duplicates = args.get_kw_arg_opt_typed("rotateDuplicates", &RuntimeType::bool(), exec_state)?; // If the target being patterned is itself a pattern, then, should you use the original solid, // or the pattern? - let use_original: Option = args.get_kw_arg_opt("useOriginal")?; + let use_original = args.get_kw_arg_opt_typed("useOriginal", &RuntimeType::bool(), exec_state)?; let solids = inner_pattern_circular_3d( solids, @@ -977,7 +901,7 @@ async fn inner_pattern_circular_3d( .await?; let Geometries::Solids(new_solids) = geometries else { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Expected a vec of solids".to_string(), vec![args.source_range], ))); @@ -1002,7 +926,7 @@ async fn pattern_circular( return Ok(Geometries::from(geometry)); } RepetitionsNeeded::Invalid => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( MUST_HAVE_ONE_INSTANCE.to_owned(), vec![args.source_range], ))); @@ -1047,7 +971,7 @@ async fn pattern_circular( } &mock_ids } else { - return Err(KclError::Engine(KclErrorDetails::new( + return Err(KclError::new_engine(KclErrorDetails::new( format!("EntityCircularPattern response was not as expected: {:?}", resp), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/planes.rs b/rust/kcl-lib/src/std/planes.rs index 2b1dceaed..fad737460 100644 --- a/rust/kcl-lib/src/std/planes.rs +++ b/rust/kcl-lib/src/std/planes.rs @@ -12,7 +12,7 @@ use crate::{ /// Offset a plane by a distance along its normal. pub async fn offset_plane(exec_state: &mut ExecState, args: Args) -> Result { - let std_plane = args.get_unlabeled_kw_arg("plane")?; + let std_plane = args.get_unlabeled_kw_arg_typed("plane", &RuntimeType::plane(), exec_state)?; let offset: TyF64 = args.get_kw_arg_typed("offset", &RuntimeType::length(), exec_state)?; let plane = inner_offset_plane(std_plane, offset, exec_state, &args).await?; Ok(KclValue::Plane { value: Box::new(plane) }) diff --git a/rust/kcl-lib/src/std/revolve.rs b/rust/kcl-lib/src/std/revolve.rs index b21d7265a..f5be1704b 100644 --- a/rust/kcl-lib/src/std/revolve.rs +++ b/rust/kcl-lib/src/std/revolve.rs @@ -37,7 +37,7 @@ pub async fn revolve(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::length(), exec_state)?; let tag_start = args.get_kw_arg_opt("tagStart")?; let tag_end = args.get_kw_arg_opt("tagEnd")?; - let symmetric = args.get_kw_arg_opt("symmetric")?; + let symmetric = args.get_kw_arg_opt_typed("symmetric", &RuntimeType::bool(), exec_state)?; let bidirectional_angle: Option = args.get_kw_arg_opt_typed("bidirectionalAngle", &RuntimeType::angle(), exec_state)?; @@ -75,7 +75,7 @@ async fn inner_revolve( // We don't use validate() here because we want to return a specific error message that is // nice and we use the other data in the docs, so we still need use the derive above for the json schema. if !(-360.0..=360.0).contains(&angle) || angle == 0.0 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("Expected angle to be between -360 and 360 and not 0, found `{}`", angle), vec![args.source_range], ))); @@ -87,7 +87,7 @@ async fn inner_revolve( // We don't use validate() here because we want to return a specific error message that is // nice and we use the other data in the docs, so we still need use the derive above for the json schema. if !(-360.0..=360.0).contains(&bidirectional_angle) || bidirectional_angle == 0.0 { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Expected bidirectional angle to be between -360 and 360 and not 0, found `{}`", bidirectional_angle @@ -99,7 +99,7 @@ async fn inner_revolve( if let Some(angle) = angle { let ang = angle.signum() * bidirectional_angle + angle; if !(-360.0..=360.0).contains(&ang) { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!( "Combined angle and bidirectional must be between -360 and 360, found '{}'", ang @@ -111,7 +111,7 @@ async fn inner_revolve( } if symmetric.unwrap_or(false) && bidirectional_angle.is_some() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "You cannot give both `symmetric` and `bidirectional` params, you have to choose one or the other" .to_owned(), vec![args.source_range], diff --git a/rust/kcl-lib/src/std/segment.rs b/rust/kcl-lib/src/std/segment.rs index b0a3ad299..b2ec281a7 100644 --- a/rust/kcl-lib/src/std/segment.rs +++ b/rust/kcl-lib/src/std/segment.rs @@ -1,7 +1,6 @@ //! Functions related to line segments. use anyhow::Result; -use kcl_derive_docs::stdlib; use kittycad_modeling_cmds::shared::Angle; use super::utils::untype_point; @@ -16,49 +15,16 @@ use crate::{ /// Returns the point at the end of the given segment. pub async fn segment_end(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let pt = inner_segment_end(&tag, exec_state, args.clone())?; args.make_kcl_val_from_point([pt[0].n, pt[1].n], pt[0].ty.clone()) } -/// Compute the ending point of the provided line segment. -/// -/// ```no_run -/// w = 15 -/// cube = startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [w, 0], tag = $line1) -/// |> line(end = [0, w], tag = $line2) -/// |> line(end = [-w, 0], tag = $line3) -/// |> line(end = [0, -w], tag = $line4) -/// |> close() -/// |> extrude(length = 5) -/// -/// fn cylinder(radius, tag) { -/// return startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> circle(radius = radius, center = segEnd(tag) ) -/// |> extrude(length = radius) -/// } -/// -/// cylinder(radius = 1, tag = line1) -/// cylinder(radius = 2, tag = line2) -/// cylinder(radius = 3, tag = line3) -/// cylinder(radius = 4, tag = line4) -/// ``` -#[stdlib { - name = "segEnd", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_end(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result<[TyF64; 2], KclError> { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -72,37 +38,16 @@ fn inner_segment_end(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args /// Returns the segment end of x. pub async fn segment_end_x(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_segment_end_x(&tag, exec_state, args.clone())?; Ok(args.make_user_val_from_f64_with_type(result)) } -/// Compute the ending point of the provided line segment along the 'x' axis. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [20, 0], tag = $thing) -/// |> line(end = [0, 5]) -/// |> line(end = [segEndX(thing), 0]) -/// |> line(end = [-20, 10]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "segEndX", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_end_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -113,38 +58,16 @@ fn inner_segment_end_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar /// Returns the segment end of y. pub async fn segment_end_y(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_segment_end_y(&tag, exec_state, args.clone())?; Ok(args.make_user_val_from_f64_with_type(result)) } -/// Compute the ending point of the provided line segment along the 'y' axis. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [20, 0]) -/// |> line(end = [0, 3], tag = $thing) -/// |> line(end = [-10, 0]) -/// |> line(end = [0, segEndY(thing)]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "segEndY", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_end_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -155,49 +78,16 @@ fn inner_segment_end_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar /// Returns the point at the start of the given segment. pub async fn segment_start(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let pt = inner_segment_start(&tag, exec_state, args.clone())?; args.make_kcl_val_from_point([pt[0].n, pt[1].n], pt[0].ty.clone()) } -/// Compute the starting point of the provided line segment. -/// -/// ```no_run -/// w = 15 -/// cube = startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [w, 0], tag = $line1) -/// |> line(end = [0, w], tag = $line2) -/// |> line(end = [-w, 0], tag = $line3) -/// |> line(end = [0, -w], tag = $line4) -/// |> close() -/// |> extrude(length = 5) -/// -/// fn cylinder(radius, tag) { -/// return startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> circle( radius = radius, center = segStart(tag) ) -/// |> extrude(length = radius) -/// } -/// -/// cylinder(radius = 1, tag = line1) -/// cylinder(radius = 2, tag = line2) -/// cylinder(radius = 3, tag = line3) -/// cylinder(radius = 4, tag = line4) -/// ``` -#[stdlib { - name = "segStart", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_start(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result<[TyF64; 2], KclError> { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -211,37 +101,16 @@ fn inner_segment_start(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar /// Returns the segment start of x. pub async fn segment_start_x(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_segment_start_x(&tag, exec_state, args.clone())?; Ok(args.make_user_val_from_f64_with_type(result)) } -/// Compute the starting point of the provided line segment along the 'x' axis. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [20, 0], tag = $thing) -/// |> line(end = [0, 5]) -/// |> line(end = [20 - segStartX(thing), 0]) -/// |> line(end = [-20, 10]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "segStartX", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_start_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -252,38 +121,16 @@ fn inner_segment_start_x(tag: &TagIdentifier, exec_state: &mut ExecState, args: /// Returns the segment start of y. pub async fn segment_start_y(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_segment_start_y(&tag, exec_state, args.clone())?; Ok(args.make_user_val_from_f64_with_type(result)) } -/// Compute the starting point of the provided line segment along the 'y' axis. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [20, 0]) -/// |> line(end = [0, 3], tag = $thing) -/// |> line(end = [-10, 0]) -/// |> line(end = [0, 20-segStartY(thing)]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "segStartY", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_start_y(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -300,34 +147,12 @@ pub async fn last_segment_x(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [5, 0]) -/// |> line(end = [20, 5]) -/// |> line(end = [lastSegX(%), 0]) -/// |> line(end = [-15, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "lastSegX", - unlabeled_first = true, - args = { - sketch = { docs = "The sketch whose line segment is being queried"}, - }, - tags = ["sketch"] -}] fn inner_last_segment_x(sketch: Sketch, args: Args) -> Result { let last_line = sketch .paths .last() .ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a Sketch with at least one segment, found `{:?}`", sketch), vec![args.source_range], )) @@ -346,34 +171,12 @@ pub async fn last_segment_y(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [5, 0]) -/// |> line(end = [20, 5]) -/// |> line(end = [0, lastSegY(%)]) -/// |> line(end = [-15, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "lastSegY", - unlabeled_first = true, - args = { - sketch = { docs = "The sketch whose line segment is being queried"}, - }, - tags = ["sketch"] -}] fn inner_last_segment_y(sketch: Sketch, args: Args) -> Result { let last_line = sketch .paths .last() .ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a Sketch with at least one segment, found `{:?}`", sketch), vec![args.source_range], )) @@ -385,42 +188,15 @@ fn inner_last_segment_y(sketch: Sketch, args: Args) -> Result { /// Returns the length of the segment. pub async fn segment_length(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_segment_length(&tag, exec_state, args.clone())?; Ok(args.make_user_val_from_f64_with_type(result)) } -/// Compute the length of the provided line segment. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// tag = $thing, -/// ) -/// |> tangentialArc(angle = -120, radius = 5) -/// |> angledLine( -/// angle = -60, -/// length = segLen(thing), -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "segLen", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_length(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -431,39 +207,16 @@ fn inner_segment_length(tag: &TagIdentifier, exec_state: &mut ExecState, args: A /// Returns the angle of the segment. pub async fn segment_angle(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_segment_angle(&tag, exec_state, args.clone())?; Ok(args.make_user_val_from_f64_with_type(TyF64::new(result, NumericType::degrees()))) } -/// Compute the angle (in degrees) of the provided line segment. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> line(end = [5, 10], tag = $seg01) -/// |> line(end = [-10, 0]) -/// |> angledLine(angle = segAng(seg01), length = 10) -/// |> line(end = [-10, 0]) -/// |> angledLine(angle = segAng(seg01), length = -15) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 4) -/// ``` -#[stdlib { - name = "segAng", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] fn inner_segment_angle(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) @@ -476,95 +229,16 @@ fn inner_segment_angle(tag: &TagIdentifier, exec_state: &mut ExecState, args: Ar /// Returns the angle coming out of the end of the segment in degrees. pub async fn tangent_to_end(exec_state: &mut ExecState, args: Args) -> Result { - let tag: TagIdentifier = args.get_unlabeled_kw_arg("tag")?; + let tag: TagIdentifier = args.get_unlabeled_kw_arg_typed("tag", &RuntimeType::tag_identifier(), exec_state)?; let result = inner_tangent_to_end(&tag, exec_state, args.clone()).await?; Ok(args.make_user_val_from_f64_with_type(TyF64::new(result, NumericType::degrees()))) } -/// Returns the angle coming out of the end of the segment in degrees. -/// -/// ```no_run -/// // Horizontal pill. -/// pillSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [20, 0]) -/// |> tangentialArc(end = [0, 10], tag = $arc1) -/// |> angledLine( -/// angle = tangentToEnd(arc1), -/// length = 20, -/// ) -/// |> tangentialArc(end = [0, -10]) -/// |> close() -/// -/// pillExtrude = extrude(pillSketch, length = 10) -/// ``` -/// -/// ```no_run -/// // Vertical pill. Use absolute coordinate for arc. -/// pillSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [0, 20]) -/// |> tangentialArc(endAbsolute = [10, 20], tag = $arc1) -/// |> angledLine( -/// angle = tangentToEnd(arc1), -/// length = 20, -/// ) -/// |> tangentialArc(end = [-10, 0]) -/// |> close() -/// -/// pillExtrude = extrude(pillSketch, length = 10) -/// ``` -/// -/// ```no_run -/// rectangleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0], tag = $seg1) -/// |> angledLine( -/// angle = tangentToEnd(seg1), -/// length = 10, -/// ) -/// |> line(end = [0, 10]) -/// |> line(end = [-20, 0]) -/// |> close() -/// -/// rectangleExtrude = extrude(rectangleSketch, length = 10) -/// ``` -/// -/// ```no_run -/// bottom = startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> arc( -/// endAbsolute = [10, 10], -/// interiorAbsolute = [5, 1], -/// tag = $arc1, -/// ) -/// |> angledLine(angle = tangentToEnd(arc1), length = 20) -/// |> close() -/// ``` -/// -/// ```no_run -/// circSketch = startSketchOn(XY) -/// |> circle( center= [0, 0], radius= 3 , tag= $circ) -/// -/// triangleSketch = startSketchOn(XY) -/// |> startProfile(at = [-5, 0]) -/// |> angledLine(angle = tangentToEnd(circ), length = 10) -/// |> line(end = [-15, 0]) -/// |> close() -/// ``` -#[stdlib { - name = "tangentToEnd", - unlabeled_first = true, - args = { - tag = { docs = "The line segment being queried by its tag"}, - }, - tags = ["sketch"] -}] async fn inner_tangent_to_end(tag: &TagIdentifier, exec_state: &mut ExecState, args: Args) -> Result { let line = args.get_tag_engine_info(exec_state, tag)?; let path = line.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected a line segment with a path, found `{:?}`", line), vec![args.source_range], )) diff --git a/rust/kcl-lib/src/std/shapes.rs b/rust/kcl-lib/src/std/shapes.rs index 11fbfdb3b..2be1e4268 100644 --- a/rust/kcl-lib/src/std/shapes.rs +++ b/rust/kcl-lib/src/std/shapes.rs @@ -1,7 +1,6 @@ //! Standard library shapes. use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{ each_cmd as mcmd, length_unit::LengthUnit, @@ -29,6 +28,7 @@ use crate::{ utils::{calculate_circle_center, distance}, Args, }, + SourceRange, }; /// A sketch surface or a sketch. @@ -42,7 +42,8 @@ pub enum SketchOrSurface { /// Sketch a circle. pub async fn circle(exec_state: &mut ExecState, args: Args) -> Result { - let sketch_or_surface = args.get_unlabeled_kw_arg("sketchOrSurface")?; + let sketch_or_surface = + args.get_unlabeled_kw_arg_typed("sketchOrSurface", &RuntimeType::sketch_or_surface(), exec_state)?; let center = args.get_kw_arg_typed("center", &RuntimeType::point2d(), exec_state)?; let radius: Option = args.get_kw_arg_opt_typed("radius", &RuntimeType::length(), exec_state)?; let diameter: Option = args.get_kw_arg_opt_typed("diameter", &RuntimeType::length(), exec_state)?; @@ -70,25 +71,7 @@ async fn inner_circle( let (center_u, ty) = untype_point(center.clone()); let units = ty.expect_length(); - let radius = match (radius, diameter) { - (Some(radius), None) => radius, - (None, Some(mut diameter)) => { - diameter.n /= 2.0; - diameter - } - (None, None) => { - return Err(KclError::Type(KclErrorDetails::new( - "This function needs either `diameter` or `radius`".to_string(), - vec![args.source_range], - ))) - } - (Some(_), Some(_)) => { - return Err(KclError::Type(KclErrorDetails::new( - "You cannot specify both `diameter` and `radius`, please remove one".to_string(), - vec![args.source_range], - ))) - } - }; + let radius = get_radius(radius, diameter, args.source_range)?; let from = [center_u[0] + radius.to_length_units(units), center_u[1]]; let from_t = [TyF64::new(from[0], ty.clone()), TyF64::new(from[1], ty)]; @@ -146,38 +129,19 @@ async fn inner_circle( /// Sketch a 3-point circle. pub async fn circle_three_point(exec_state: &mut ExecState, args: Args) -> Result { - let sketch_surface_or_group = args.get_unlabeled_kw_arg("sketch_surface_or_group")?; + let sketch_or_surface = + args.get_unlabeled_kw_arg_typed("sketchOrSurface", &RuntimeType::sketch_or_surface(), exec_state)?; let p1 = args.get_kw_arg_typed("p1", &RuntimeType::point2d(), exec_state)?; let p2 = args.get_kw_arg_typed("p2", &RuntimeType::point2d(), exec_state)?; let p3 = args.get_kw_arg_typed("p3", &RuntimeType::point2d(), exec_state)?; let tag = args.get_kw_arg_opt("tag")?; - let sketch = inner_circle_three_point(sketch_surface_or_group, p1, p2, p3, tag, exec_state, args).await?; + let sketch = inner_circle_three_point(sketch_or_surface, p1, p2, p3, tag, exec_state, args).await?; Ok(KclValue::Sketch { value: Box::new(sketch), }) } -/// Construct a circle derived from 3 points. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XY) -/// |> circleThreePoint(p1 = [10,10], p2 = [20,8], p3 = [15,5]) -/// |> extrude(length = 5) -/// ``` -#[stdlib { - name = "circleThreePoint", - unlabeled_first = true, - args = { - sketch_surface_or_group = {docs = "Plane or surface to sketch on."}, - p1 = {docs = "1st point to derive the circle."}, - p2 = {docs = "2nd point to derive the circle."}, - p3 = {docs = "3rd point to derive the circle."}, - tag = {docs = "Identifier for the circle to reference elsewhere."}, - }, - tags = ["sketch"] -}] - // Similar to inner_circle, but needs to retain 3-point information in the // path so it can be used for other features, otherwise it's lost. async fn inner_circle_three_point( @@ -274,14 +238,15 @@ pub enum PolygonType { /// Create a regular polygon with the specified number of sides and radius. pub async fn polygon(exec_state: &mut ExecState, args: Args) -> Result { - let sketch_surface_or_group = args.get_unlabeled_kw_arg("sketchOrSurface")?; + let sketch_or_surface = + args.get_unlabeled_kw_arg_typed("sketchOrSurface", &RuntimeType::sketch_or_surface(), exec_state)?; let radius: TyF64 = args.get_kw_arg_typed("radius", &RuntimeType::length(), exec_state)?; let num_sides: TyF64 = args.get_kw_arg_typed("numSides", &RuntimeType::count(), exec_state)?; let center = args.get_kw_arg_typed("center", &RuntimeType::point2d(), exec_state)?; let inscribed = args.get_kw_arg_opt_typed("inscribed", &RuntimeType::bool(), exec_state)?; let sketch = inner_polygon( - sketch_surface_or_group, + sketch_or_surface, radius, num_sides.n as u64, center, @@ -295,44 +260,6 @@ pub async fn polygon(exec_state: &mut ExecState, args: Args) -> Result polygon( -/// radius = 10, -/// numSides = 6, -/// center = [0, 0], -/// inscribed = true, -/// ) -/// -/// example = extrude(hex, length = 5) -/// ``` -/// -/// ```no_run -/// // Create a square circumscribed around a circle of radius 5 -/// square = startSketchOn(XY) -/// |> polygon( -/// radius = 5.0, -/// numSides = 4, -/// center = [10, 10], -/// inscribed = false, -/// ) -/// example = extrude(square, length = 5) -/// ``` -#[stdlib { - name = "polygon", - unlabeled_first = true, - args = { - sketch_surface_or_group = { docs = "Plane or surface to sketch on" }, - radius = { docs = "The radius of the polygon", include_in_snippet = true }, - num_sides = { docs = "The number of sides in the polygon", include_in_snippet = true }, - center = { docs = "The center point of the polygon", snippet_value_array = ["0", "0"] }, - inscribed = { docs = "Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius" }, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_polygon( sketch_surface_or_group: SketchOrSurface, @@ -344,14 +271,14 @@ async fn inner_polygon( args: Args, ) -> Result { if num_sides < 3 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Polygon must have at least 3 sides".to_string(), vec![args.source_range], ))); } if radius.n <= 0.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Radius must be greater than 0".to_string(), vec![args.source_range], ))); @@ -565,4 +492,22 @@ async fn inner_ellipse( .await?; Ok(new_sketch) + +pub(crate) fn get_radius( + radius: Option, + diameter: Option, + source_range: SourceRange, +) -> Result { + match (radius, diameter) { + (Some(radius), None) => Ok(radius), + (None, Some(diameter)) => Ok(TyF64::new(diameter.n / 2.0, diameter.ty)), + (None, None) => Err(KclError::new_type(KclErrorDetails::new( + "This function needs either `diameter` or `radius`".to_string(), + vec![source_range], + ))), + (Some(_), Some(_)) => Err(KclError::new_type(KclErrorDetails::new( + "You cannot specify both `diameter` and `radius`, please remove one".to_string(), + vec![source_range], + ))), + } } diff --git a/rust/kcl-lib/src/std/shell.rs b/rust/kcl-lib/src/std/shell.rs index 79ee8b820..a9a1d0bfd 100644 --- a/rust/kcl-lib/src/std/shell.rs +++ b/rust/kcl-lib/src/std/shell.rs @@ -36,14 +36,14 @@ async fn inner_shell( args: Args, ) -> Result, KclError> { if faces.is_empty() { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "You must shell at least one face".to_owned(), vec![args.source_range], ))); } if solids.is_empty() { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "You must shell at least one solid".to_owned(), vec![args.source_range], ))); @@ -63,7 +63,7 @@ async fn inner_shell( } if face_ids.is_empty() { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Expected at least one valid face".to_owned(), vec![args.source_range], ))); @@ -72,7 +72,7 @@ async fn inner_shell( // Make sure all the solids have the same id, as we are going to shell them all at // once. if !solids.iter().all(|eg| eg.id == solids[0].id) { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "All solids stem from the same root object, like multiple sketch on face extrusions, etc.".to_owned(), vec![args.source_range], ))); diff --git a/rust/kcl-lib/src/std/sketch.rs b/rust/kcl-lib/src/std/sketch.rs index 1e084ed64..d9af8b60b 100644 --- a/rust/kcl-lib/src/std/sketch.rs +++ b/rust/kcl-lib/src/std/sketch.rs @@ -2,7 +2,6 @@ use anyhow::Result; use indexmap::IndexMap; -use kcl_derive_docs::stdlib; use kcmc::shared::Point2d as KPoint2d; // Point2d is already defined in this pkg, to impl ts_rs traits. use kcmc::shared::Point3d as KPoint3d; // Point3d is already defined in this pkg, to impl ts_rs traits. use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, shared::Angle, websocket::ModelingCmdReq, ModelingCmd}; @@ -12,6 +11,7 @@ use parse_display::{Display, FromStr}; use schemars::JsonSchema; use serde::{Deserialize, Serialize}; +use super::shapes::get_radius; #[cfg(feature = "artifact-graph")] use crate::execution::{Artifact, ArtifactId, CodeRef, StartSketchOnFace, StartSketchOnPlane}; use crate::{ @@ -67,13 +67,13 @@ impl FaceTag { match self { FaceTag::Tag(ref t) => args.get_adjacent_face_to_tag(exec_state, t, must_be_planar).await, FaceTag::StartOrEnd(StartOrEnd::Start) => solid.start_cap_id.ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( "Expected a start face".to_string(), vec![args.source_range], )) }), FaceTag::StartOrEnd(StartOrEnd::End) => solid.end_cap_id.ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( "Expected an end face".to_string(), vec![args.source_range], )) @@ -102,13 +102,12 @@ pub enum StartOrEnd { pub const NEW_TAG_KW: &str = "tag"; pub async fn involute_circular(exec_state: &mut ExecState, args: Args) -> Result { - let sketch = - args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::Primitive(PrimitiveType::Sketch), exec_state)?; + let sketch = args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::sketch(), exec_state)?; let start_radius: TyF64 = args.get_kw_arg_typed("startRadius", &RuntimeType::length(), exec_state)?; let end_radius: TyF64 = args.get_kw_arg_typed("endRadius", &RuntimeType::length(), exec_state)?; let angle: TyF64 = args.get_kw_arg_typed("angle", &RuntimeType::angle(), exec_state)?; - let reverse = args.get_kw_arg_opt("reverse")?; + let reverse = args.get_kw_arg_opt_typed("reverse", &RuntimeType::bool(), exec_state)?; let tag = args.get_kw_arg_opt(NEW_TAG_KW)?; let new_sketch = inner_involute_circular(sketch, start_radius, end_radius, angle, reverse, tag, exec_state, args).await?; @@ -124,29 +123,6 @@ fn involute_curve(radius: f64, angle: f64) -> (f64, f64) { ) } -/// Extend the current sketch with a new involute circular curve. -/// -/// ```no_run -/// a = 10 -/// b = 14 -/// startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> involuteCircular(startRadius = a, endRadius = b, angle = 60) -/// |> involuteCircular(startRadius = a, endRadius = b, angle = 60, reverse = true) -/// ``` -#[stdlib { - name = "involuteCircular", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - start_radius = { docs = "The involute is described between two circles, start_radius is the radius of the inner circle."}, - end_radius = { docs = "The involute is described between two circles, end_radius is the radius of the outer circle."}, - angle = { docs = "The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve."}, - reverse = { docs = "If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. Defaults to false."}, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_involute_circular( sketch: Sketch, @@ -230,41 +206,6 @@ pub async fn line(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// // The END argument means it ends at exactly [10, 0]. -/// // This is an absolute measurement, it is NOT relative to -/// // the start of the sketch. -/// |> line(endAbsolute = [10, 0]) -/// |> line(endAbsolute = [0, 10]) -/// |> line(endAbsolute = [-10, 0], tag = $thirdLineOfTriangle) -/// |> close() -/// |> extrude(length = 5) -/// -/// box = startSketchOn(XZ) -/// |> startProfile(at = [10, 10]) -/// // The 'to' argument means move the pen this much. -/// // So, [10, 0] is a relative distance away from the current point. -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> line(end = [-10, 0], tag = $thirdLineOfBox) -/// |> close() -/// |> extrude(length = 5) -/// ``` -#[stdlib { - name = "line", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - end_absolute = { docs = "Which absolute point should this line go to? Incompatible with `end`."}, - end = { docs = "How far away (along the X and Y axes) should this line go? Incompatible with `endAbsolute`.", include_in_snippet = true}, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] async fn inner_line( sketch: Sketch, end_absolute: Option<[TyF64; 2]>, @@ -330,7 +271,7 @@ async fn straight_line( let from = sketch.current_pen_position()?; let (point, is_absolute) = match (end_absolute, end) { (Some(_), Some(_)) => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "You cannot give both `end` and `endAbsolute` params, you have to choose one or the other".to_owned(), vec![args.source_range], ))); @@ -338,7 +279,7 @@ async fn straight_line( (Some(end_absolute), None) => (end_absolute, true), (None, Some(end)) => (end, false), (None, None) => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( format!("You must supply either `{relative_name}` or `endAbsolute` arguments"), vec![args.source_range], ))); @@ -403,39 +344,6 @@ pub async fn x_line(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> xLine(length = 15) -/// |> angledLine( -/// angle = 80, -/// length = 15, -/// ) -/// |> line(end = [8, -10]) -/// |> xLine(length = 10) -/// |> angledLine( -/// angle = 120, -/// length = 30, -/// ) -/// |> xLine(length = -15) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "xLine", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - length = { docs = "How far away along the X axis should this line go? Incompatible with `endAbsolute`.", include_in_snippet = true}, - end_absolute = { docs = "Which absolute X value should this line go to? Incompatible with `length`."}, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] async fn inner_x_line( sketch: Sketch, length: Option, @@ -473,34 +381,6 @@ pub async fn y_line(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> yLine(length = 15) -/// |> angledLine( -/// angle = 30, -/// length = 15, -/// ) -/// |> line(end = [8, -10]) -/// |> yLine(length = -5) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "yLine", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - length = { docs = "How far away along the Y axis should this line go? Incompatible with `endAbsolute`.", include_in_snippet = true}, - end_absolute = { docs = "Which absolute Y value should this line go to? Incompatible with `length`."}, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] async fn inner_y_line( sketch: Sketch, length: Option, @@ -555,38 +435,6 @@ pub async fn angled_line(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> yLine(endAbsolute = 15) -/// |> angledLine( -/// angle = 30, -/// length = 15, -/// ) -/// |> line(end = [8, -10]) -/// |> yLine(endAbsolute = 0) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "angledLine", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - angle = { docs = "Which angle should the line be drawn at?" }, - length = { docs = "Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given."}, - length_x = { docs = "Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given."}, - length_y = { docs = "Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given."}, - end_absolute_x = { docs = "Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given."}, - end_absolute_y = { docs = "Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given."}, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_angled_line( sketch: Sketch, @@ -605,7 +453,7 @@ async fn inner_angled_line( .filter(|x| x.is_some()) .count(); if options_given > 1 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( " one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given".to_string(), vec![args.source_range], ))); @@ -633,11 +481,11 @@ async fn inner_angled_line( (None, None, None, None, Some(end_absolute_y)) => { inner_angled_line_to_y(angle_degrees, end_absolute_y, sketch, tag, exec_state, args).await } - (None, None, None, None, None) => Err(KclError::Type(KclErrorDetails::new( + (None, None, None, None, None) => Err(KclError::new_type(KclErrorDetails::new( "One of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` must be given".to_string(), vec![args.source_range], ))), - _ => Err(KclError::Type(KclErrorDetails::new( + _ => Err(KclError::new_type(KclErrorDetails::new( "Only One of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given".to_owned(), vec![args.source_range], ))), @@ -711,14 +559,14 @@ async fn inner_angled_line_of_x_length( args: Args, ) -> Result { if angle_degrees.abs() == 270.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have an x constrained angle of 270 degrees".to_string(), vec![args.source_range], ))); } if angle_degrees.abs() == 90.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have an x constrained angle of 90 degrees".to_string(), vec![args.source_range], ))); @@ -743,14 +591,14 @@ async fn inner_angled_line_to_x( let from = sketch.current_pen_position()?; if angle_degrees.abs() == 270.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have an x constrained angle of 270 degrees".to_string(), vec![args.source_range], ))); } if angle_degrees.abs() == 90.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have an x constrained angle of 90 degrees".to_string(), vec![args.source_range], ))); @@ -778,14 +626,14 @@ async fn inner_angled_line_of_y_length( args: Args, ) -> Result { if angle_degrees.abs() == 0.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have a y constrained angle of 0 degrees".to_string(), vec![args.source_range], ))); } if angle_degrees.abs() == 180.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have a y constrained angle of 180 degrees".to_string(), vec![args.source_range], ))); @@ -810,14 +658,14 @@ async fn inner_angled_line_to_y( let from = sketch.current_pen_position()?; if angle_degrees.abs() == 0.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have a y constrained angle of 0 degrees".to_string(), vec![args.source_range], ))); } if angle_degrees.abs() == 180.0 { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Cannot have a y constrained angle of 180 degrees".to_string(), vec![args.source_range], ))); @@ -840,9 +688,10 @@ async fn inner_angled_line_to_y( pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) -> Result { let sketch = args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::Primitive(PrimitiveType::Sketch), exec_state)?; - let angle: TyF64 = args.get_kw_arg("angle")?; - let intersect_tag: TagIdentifier = args.get_kw_arg("intersectTag")?; - let offset: Option = args.get_kw_arg_opt("offset")?; + let angle: TyF64 = args.get_kw_arg_typed("angle", &RuntimeType::angle(), exec_state)?; + let intersect_tag: TagIdentifier = + args.get_kw_arg_typed("intersectTag", &RuntimeType::tag_identifier(), exec_state)?; + let offset = args.get_kw_arg_opt_typed("offset", &RuntimeType::length(), exec_state)?; let tag: Option = args.get_kw_arg_opt("tag")?; let new_sketch = inner_angled_line_that_intersects(sketch, angle, intersect_tag, offset, tag, exec_state, args).await?; @@ -851,37 +700,6 @@ pub async fn angled_line_that_intersects(exec_state: &mut ExecState, args: Args) }) } -/// Draw an angled line from the current origin, constructing a line segment -/// such that the newly created line intersects the desired target line -/// segment. -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(endAbsolute = [5, 10]) -/// |> line(endAbsolute = [-10, 10], tag = $lineToIntersect) -/// |> line(endAbsolute = [0, 20]) -/// |> angledLineThatIntersects( -/// angle = 80, -/// intersectTag = lineToIntersect, -/// offset = 10, -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "angledLineThatIntersects", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - angle = { docs = "Which angle should the line be drawn at?" }, - intersect_tag = { docs = "The tag of the line to intersect with" }, - offset = { docs = "The offset from the intersecting line. Defaults to 0." }, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] pub async fn inner_angled_line_that_intersects( sketch: Sketch, angle: TyF64, @@ -893,7 +711,7 @@ pub async fn inner_angled_line_that_intersects( ) -> Result { let intersect_path = args.get_tag_engine_info(exec_state, &intersect_tag)?; let path = intersect_path.path.clone().ok_or_else(|| { - KclError::Type(KclErrorDetails::new( + KclError::new_type(KclErrorDetails::new( format!("Expected an intersect path with a path, found `{:?}`", intersect_path), vec![args.source_range], )) @@ -964,7 +782,7 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result Ok(KclValue::Plane { value }), @@ -972,190 +790,6 @@ pub async fn start_sketch_on(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// -/// exampleSketch002 = startSketchOn(example, face = END) -/// |> startProfile(at = [1, 1]) -/// |> line(end = [8, 0]) -/// |> line(end = [0, 8]) -/// |> line(end = [-8, 0]) -/// |> close() -/// -/// example002 = extrude(exampleSketch002, length = 5) -/// -/// exampleSketch003 = startSketchOn(example002, face = END) -/// |> startProfile(at = [2, 2]) -/// |> line(end = [6, 0]) -/// |> line(end = [0, 6]) -/// |> line(end = [-6, 0]) -/// |> close() -/// -/// example003 = extrude(exampleSketch003, length = 5) -/// ``` -/// -/// ```no_run -/// // Sketch on the end of an extruded face by tagging the end face. -/// -/// exampleSketch = startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5, tagEnd = $end01) -/// -/// exampleSketch002 = startSketchOn(example, face = end01) -/// |> startProfile(at = [1, 1]) -/// |> line(end = [8, 0]) -/// |> line(end = [0, 8]) -/// |> line(end = [-8, 0]) -/// |> close() -/// -/// example002 = extrude(exampleSketch002, length = 5, tagEnd = $end02) -/// -/// exampleSketch003 = startSketchOn(example002, face = end02) -/// |> startProfile(at = [2, 2]) -/// |> line(end = [6, 0]) -/// |> line(end = [0, 6]) -/// |> line(end = [-6, 0]) -/// |> close() -/// -/// example003 = extrude(exampleSketch003, length = 5) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XY) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10], tag = $sketchingFace) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// -/// exampleSketch002 = startSketchOn(example, face = sketchingFace) -/// |> startProfile(at = [1, 1]) -/// |> line(end = [8, 0]) -/// |> line(end = [0, 8]) -/// |> line(end = [-8, 0]) -/// |> close(tag = $sketchingFace002) -/// -/// example002 = extrude(exampleSketch002, length = 10) -/// -/// exampleSketch003 = startSketchOn(example002, face = sketchingFace002) -/// |> startProfile(at = [-8, 12]) -/// |> line(end = [0, 6]) -/// |> line(end = [6, 0]) -/// |> line(end = [0, -6]) -/// |> close() -/// -/// example003 = extrude(exampleSketch003, length = 5) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XY) -/// |> startProfile(at = [4, 12]) -/// |> line(end = [2, 0]) -/// |> line(end = [0, -6]) -/// |> line(end = [4, -6]) -/// |> line(end = [0, -6]) -/// |> line(end = [-3.75, -4.5]) -/// |> line(end = [0, -5.5]) -/// |> line(end = [-2, 0]) -/// |> close() -/// -/// example = revolve(exampleSketch, axis = Y, angle = 180) -/// -/// exampleSketch002 = startSketchOn(example, face = END) -/// |> startProfile(at = [4.5, -5]) -/// |> line(end = [0, 5]) -/// |> line(end = [5, 0]) -/// |> line(end = [0, -5]) -/// |> close() -/// -/// example002 = extrude(exampleSketch002, length = 5) -/// ``` -/// -/// ```no_run -/// // Sketch on the end of a revolved face by tagging the end face. -/// -/// exampleSketch = startSketchOn(XY) -/// |> startProfile(at = [4, 12]) -/// |> line(end = [2, 0]) -/// |> line(end = [0, -6]) -/// |> line(end = [4, -6]) -/// |> line(end = [0, -6]) -/// |> line(end = [-3.75, -4.5]) -/// |> line(end = [0, -5.5]) -/// |> line(end = [-2, 0]) -/// |> close() -/// -/// example = revolve(exampleSketch, axis = Y, angle = 180, tagEnd = $end01) -/// -/// exampleSketch002 = startSketchOn(example, face = end01) -/// |> startProfile(at = [4.5, -5]) -/// |> line(end = [0, 5]) -/// |> line(end = [5, 0]) -/// |> line(end = [0, -5]) -/// |> close() -/// -/// example002 = extrude(exampleSketch002, length = 5) -/// ``` -/// -/// ```no_run -/// a1 = startSketchOn({ -/// origin = { x = 0, y = 0, z = 0 }, -/// xAxis = { x = 1, y = 0, z = 0 }, -/// yAxis = { x = 0, y = 1, z = 0 }, -/// zAxis = { x = 0, y = 0, z = 1 } -/// }) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [100.0, 0]) -/// |> yLine(length = -100.0) -/// |> xLine(length = -100.0) -/// |> yLine(length = 100.0) -/// |> close() -/// |> extrude(length = 3.14) -/// ``` -#[stdlib { - name = "startSketchOn", - feature_tree_operation = true, - unlabeled_first = true, - args = { - plane_or_solid = { docs = "The plane or solid to sketch on"}, - face = { docs = "Identify a face of a solid if a solid is specified as the input argument (`plane_or_solid`)"}, - }, - tags = ["sketch"] -}] async fn inner_start_sketch_on( plane_or_solid: SketchData, face: Option, @@ -1170,7 +804,7 @@ async fn inner_start_sketch_on( SketchData::Plane(plane) => { if plane.value == crate::exec::PlaneType::Uninit { if plane.info.origin.units == UnitLen::Unknown { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Origin of plane has unknown units".to_string(), vec![args.source_range], ))); @@ -1194,7 +828,7 @@ async fn inner_start_sketch_on( } SketchData::Solid(solid) => { let Some(tag) = face else { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Expected a tag for the face to sketch on".to_string(), vec![args.source_range], ))); @@ -1267,8 +901,11 @@ async fn make_sketch_plane_from_orientation( /// Start a new profile at a given point. pub async fn start_profile(exec_state: &mut ExecState, args: Args) -> Result { - // let (start, sketch_surface, tag) = args.get_data_and_sketch_surface()?; - let sketch_surface = args.get_unlabeled_kw_arg("startProfileOn")?; + let sketch_surface = args.get_unlabeled_kw_arg_typed( + "startProfileOn", + &RuntimeType::Union(vec![RuntimeType::plane(), RuntimeType::face()]), + exec_state, + )?; let start: [TyF64; 2] = args.get_kw_arg_typed("at", &RuntimeType::point2d(), exec_state)?; let tag = args.get_kw_arg_opt(NEW_TAG_KW)?; @@ -1278,50 +915,6 @@ pub async fn start_profile(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(-XZ) -/// |> startProfile(at = [10, 10]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(-XZ) -/// |> startProfile(at = [-10, 23]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 5) -/// ``` -#[stdlib { - name = "startProfile", - unlabeled_first = true, - args = { - sketch_surface = { docs = "What to start the profile on" }, - at = { docs = "Where to start the profile. An absolute point.", snippet_value_array = ["0", "0"] }, - tag = { docs = "Tag this first starting point" }, - }, - tags = ["sketch"] -}] pub(crate) async fn inner_start_profile( sketch_surface: SketchSurface, at: [TyF64; 2], @@ -1438,91 +1031,36 @@ pub(crate) async fn inner_start_profile( /// Returns the X component of the sketch profile start point. pub async fn profile_start_x(exec_state: &mut ExecState, args: Args) -> Result { - let sketch: Sketch = args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::sketch(), exec_state)?; + let sketch: Sketch = args.get_unlabeled_kw_arg_typed("profile", &RuntimeType::sketch(), exec_state)?; let ty = sketch.units.into(); let x = inner_profile_start_x(sketch)?; Ok(args.make_user_val_from_f64_with_type(TyF64::new(x, ty))) } -/// Extract the provided 2-dimensional sketch's profile's origin's 'x' -/// value. -/// -/// ```no_run -/// sketch001 = startSketchOn(XY) -/// |> startProfile(at = [5, 2]) -/// |> angledLine(angle = -26.6, length = 50) -/// |> angledLine(angle = 90, length = 50) -/// |> angledLine(angle = 30, endAbsoluteX = profileStartX(%)) -/// ``` -#[stdlib { - name = "profileStartX", - unlabeled_first = true, - args = { - profile = {docs = "Profile whose start is being used"}, - }, - tags = ["sketch"] -}] pub(crate) fn inner_profile_start_x(profile: Sketch) -> Result { Ok(profile.start.to[0]) } /// Returns the Y component of the sketch profile start point. pub async fn profile_start_y(exec_state: &mut ExecState, args: Args) -> Result { - let sketch: Sketch = args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::sketch(), exec_state)?; + let sketch: Sketch = args.get_unlabeled_kw_arg_typed("profile", &RuntimeType::sketch(), exec_state)?; let ty = sketch.units.into(); let x = inner_profile_start_y(sketch)?; Ok(args.make_user_val_from_f64_with_type(TyF64::new(x, ty))) } -/// Extract the provided 2-dimensional sketch's profile's origin's 'y' -/// value. -/// -/// ```no_run -/// sketch001 = startSketchOn(XY) -/// |> startProfile(at = [5, 2]) -/// |> angledLine(angle = -60, length = 14 ) -/// |> angledLine(angle = 30, endAbsoluteY = profileStartY(%)) -/// ``` -#[stdlib { - name = "profileStartY", - unlabeled_first = true, - args = { - profile = {docs = "Profile whose start is being used"}, - }, - tags = ["sketch"] -}] pub(crate) fn inner_profile_start_y(profile: Sketch) -> Result { Ok(profile.start.to[1]) } /// Returns the sketch profile start point. pub async fn profile_start(exec_state: &mut ExecState, args: Args) -> Result { - let sketch: Sketch = args.get_unlabeled_kw_arg_typed("sketch", &RuntimeType::sketch(), exec_state)?; + let sketch: Sketch = args.get_unlabeled_kw_arg_typed("profile", &RuntimeType::sketch(), exec_state)?; let ty = sketch.units.into(); let point = inner_profile_start(sketch)?; Ok(KclValue::from_point2d(point, ty, args.into())) } -/// Extract the provided 2-dimensional sketch's profile's origin -/// value. -/// -/// ```no_run -/// sketch001 = startSketchOn(XY) -/// |> startProfile(at = [5, 2]) -/// |> angledLine(angle = 120, length = 50 , tag = $seg01) -/// |> angledLine(angle = segAng(seg01) + 120, length = 50 ) -/// |> line(end = profileStart(%)) -/// |> close() -/// |> extrude(length = 20) -/// ``` -#[stdlib { - name = "profileStart", - unlabeled_first = true, - args = { - profile = {docs = "Profile whose start is being used"}, - }, - tags = ["sketch"] -}] pub(crate) fn inner_profile_start(profile: Sketch) -> Result<[f64; 2], KclError> { Ok(profile.start.to) } @@ -1538,36 +1076,6 @@ pub async fn close(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [10, 10]) -/// |> line(end = [10, 0]) -/// |> close() -/// |> extrude(length = 10) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(-XZ) -/// |> startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> line(end = [0, 10]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "close", - unlabeled_first = true, - args = { - sketch = { docs = "The sketch you want to close"}, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] pub(crate) async fn inner_close( sketch: Sketch, tag: Option, @@ -1613,6 +1121,7 @@ pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("angleStart", &RuntimeType::degrees(), exec_state)?; let angle_end: Option = args.get_kw_arg_opt_typed("angleEnd", &RuntimeType::degrees(), exec_state)?; let radius: Option = args.get_kw_arg_opt_typed("radius", &RuntimeType::length(), exec_state)?; + let diameter: Option = args.get_kw_arg_opt_typed("diameter", &RuntimeType::length(), exec_state)?; let end_absolute: Option<[TyF64; 2]> = args.get_kw_arg_opt_typed("endAbsolute", &RuntimeType::point2d(), exec_state)?; let interior_absolute: Option<[TyF64; 2]> = @@ -1623,6 +1132,7 @@ pub async fn arc(exec_state: &mut ExecState, args: Args) -> Result Result startProfile(at = [0, 0]) -/// |> line(end = [10, 0]) -/// |> arc( -/// angleStart = 0, -/// angleEnd = 280, -/// radius = 16 -/// ) -/// |> close() -/// example = extrude(exampleSketch, length = 10) -/// ``` -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> arc( -/// endAbsolute = [10,0], -/// interiorAbsolute = [5,5] -/// ) -/// |> close() -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "arc", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?" }, - angle_start = { docs = "Where along the circle should this arc start?", include_in_snippet = true }, - angle_end = { docs = "Where along the circle should this arc end?", include_in_snippet = true }, - radius = { docs = "How large should the circle be?", include_in_snippet = true }, - interior_absolute = { docs = "Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd`" }, - end_absolute = { docs = "Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd`" }, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] pub(crate) async fn inner_arc( sketch: Sketch, angle_start: Option, angle_end: Option, radius: Option, + diameter: Option, interior_absolute: Option<[TyF64; 2]>, end_absolute: Option<[TyF64; 2]>, tag: Option, @@ -1697,15 +1161,16 @@ pub(crate) async fn inner_arc( let from: Point2d = sketch.current_pen_position()?; let id = exec_state.next_uuid(); - match (angle_start, angle_end, radius, interior_absolute, end_absolute) { - (Some(angle_start), Some(angle_end), Some(radius), None, None) => { + match (angle_start, angle_end, radius, diameter, interior_absolute, end_absolute) { + (Some(angle_start), Some(angle_end), radius, diameter, None, None) => { + let radius = get_radius(radius, diameter, args.source_range)?; relative_arc(&args, id, exec_state, sketch, from, angle_start, angle_end, radius, tag).await } - (None, None, None, Some(interior_absolute), Some(end_absolute)) => { + (None, None, None, None, Some(interior_absolute), Some(end_absolute)) => { absolute_arc(&args, id, exec_state, sketch, from, interior_absolute, end_absolute, tag).await } _ => { - Err(KclError::Type(KclErrorDetails::new( + Err(KclError::new_type(KclErrorDetails::new( "Invalid combination of arguments. Either provide (angleStart, angleEnd, radius) or (endAbsolute, interiorAbsolute)".to_owned(), vec![args.source_range], ))) @@ -1792,7 +1257,7 @@ pub async fn relative_arc( let radius = radius.to_length_units(from.units); let (center, end) = arc_center_and_end(from.ignore_units(), a_start, a_end, radius); if a_start == a_end { - return Err(KclError::Type(KclErrorDetails::new( + return Err(KclError::new_type(KclErrorDetails::new( "Arc start and end angles must be different".to_string(), vec![args.source_range], ))); @@ -1847,114 +1312,57 @@ pub async fn tangential_arc(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> angledLine( -/// angle = 45, -/// length = 10, -/// ) -/// |> tangentialArc(end = [0, -10]) -/// |> line(end = [-10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> tangentialArc(endAbsolute = [15, 15]) -/// |> line(end = [10, -15]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -/// -/// ```no_run -/// exampleSketch = startSketchOn(XZ) -/// |> startProfile(at = [0, 0]) -/// |> angledLine( -/// angle = 60, -/// length = 10, -/// ) -/// |> tangentialArc(radius = 10, angle = -120) -/// |> angledLine( -/// angle = -60, -/// length = 10, -/// ) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -#[stdlib { - name = "tangentialArc", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - end_absolute = { docs = "Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`."}, - end = { docs = "How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`.", include_in_snippet = true }, - radius = { docs = "Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute`."}, - angle = { docs = "Offset of the arc in degrees. `radius` must be given. Incompatible with `end` and `endAbsolute`."}, - tag = { docs = "Create a new tag which refers to this arc"}, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_tangential_arc( sketch: Sketch, end_absolute: Option<[TyF64; 2]>, end: Option<[TyF64; 2]>, radius: Option, + diameter: Option, angle: Option, tag: Option, exec_state: &mut ExecState, args: Args, ) -> Result { - match (end_absolute, end, radius, angle) { - (Some(point), None, None, None) => { + match (end_absolute, end, radius, diameter, angle) { + (Some(point), None, None, None, None) => { inner_tangential_arc_to_point(sketch, point, true, tag, exec_state, args).await } - (None, Some(point), None, None) => { + (None, Some(point), None, None, None) => { inner_tangential_arc_to_point(sketch, point, false, tag, exec_state, args).await } - (None, None, Some(radius), Some(angle)) => { + (None, None, radius, diameter, Some(angle)) => { + let radius = get_radius(radius, diameter, args.source_range)?; let data = TangentialArcData::RadiusAndOffset { radius, offset: angle }; inner_tangential_arc_radius_angle(data, sketch, tag, exec_state, args).await } - (Some(_), Some(_), None, None) => Err(KclError::Semantic(KclErrorDetails::new( + (Some(_), Some(_), None, None, None) => Err(KclError::new_semantic(KclErrorDetails::new( "You cannot give both `end` and `endAbsolute` params, you have to choose one or the other".to_owned(), vec![args.source_range], ))), - (None, None, Some(_), None) | (None, None, None, Some(_)) => Err(KclError::Semantic(KclErrorDetails::new( - "You must supply both `radius` and `angle` arguments".to_owned(), - vec![args.source_range], - ))), - (_, _, _, _) => Err(KclError::Semantic(KclErrorDetails::new( - "You must supply `end`, `endAbsolute`, or both `radius` and `angle` arguments".to_owned(), + (_, _, _, _, _) => Err(KclError::new_semantic(KclErrorDetails::new( + "You must supply `end`, `endAbsolute`, or both `angle` and `radius`/`diameter` arguments".to_owned(), vec![args.source_range], ))), } @@ -2107,13 +1515,13 @@ async fn inner_tangential_arc_to_point( }); if result.center[0].is_infinite() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "could not sketch tangential arc, because its center would be infinitely far away in the X direction" .to_owned(), vec![args.source_range], ))); } else if result.center[1].is_infinite() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "could not sketch tangential arc, because its center would be infinitely far away in the Y direction" .to_owned(), vec![args.source_range], @@ -2183,48 +1591,6 @@ pub async fn bezier_curve(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [0, 10]) -/// |> bezierCurve( -/// control1 = [5, 0], -/// control2 = [5, 10], -/// end = [10, 10], -/// ) -/// |> line(endAbsolute = [10, 0]) -/// |> close() -/// -/// example = extrude(exampleSketch, length = 10) -/// ``` -/// ```no_run -/// // Example using absolute control points. -/// startSketchOn(XY) -/// |> startProfile(at = [300, 300]) -/// |> bezierCurve(control1Absolute = [600, 300], control2Absolute = [-300, -100], endAbsolute = [600, 600]) -/// |> close() -/// |> extrude(length = 10) -/// ``` -#[stdlib { - name = "bezierCurve", - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?"}, - control1 = { docs = "First control point for the cubic" }, - control2 = { docs = "Second control point for the cubic" }, - end = { docs = "How far away (along the X and Y axes) should this line go?" }, - control1_absolute = { docs = "First control point for the cubic. Absolute point." }, - control2_absolute = { docs = "Second control point for the cubic. Absolute point." }, - end_absolute = { docs = "Coordinate on the plane at which this line should end." }, - tag = { docs = "Create a new tag which refers to this line"}, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_bezier_curve( sketch: Sketch, @@ -2291,7 +1657,7 @@ async fn inner_bezier_curve( to } _ => { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "You must either give `control1`, `control2` and `end`, or `control1Absolute`, `control2Absolute` and `endAbsolute`.".to_owned(), vec![args.source_range], ))); @@ -2341,47 +1707,6 @@ pub async fn subtract_2d(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0, 0]) -/// |> line(end = [0, 5]) -/// |> line(end = [5, 0]) -/// |> line(end = [0, -5]) -/// |> close() -/// |> subtract2d(tool =circle( center = [1, 1], radius = .25 )) -/// |> subtract2d(tool =circle( center = [1, 4], radius = .25 )) -/// -/// example = extrude(exampleSketch, length = 1) -/// ``` -/// -/// ```no_run -/// fn squareHoleSketch() { -/// squareSketch = startSketchOn(-XZ) -/// |> startProfile(at = [-1, -1]) -/// |> line(end = [2, 0]) -/// |> line(end = [0, 2]) -/// |> line(end = [-2, 0]) -/// |> close() -/// return squareSketch -/// } -/// -/// exampleSketch = startSketchOn(-XZ) -/// |> circle( center = [0, 0], radius = 3 ) -/// |> subtract2d(tool = squareHoleSketch()) -/// example = extrude(exampleSketch, length = 1) -/// ``` -#[stdlib { - name = "subtract2d", - feature_tree_operation = true, - unlabeled_first = true, - args = { - sketch = { docs = "Which sketch should this path be added to?" }, - tool = { docs = "The shape(s) which should be cut out of the sketch." }, - }, - tags = ["sketch"] -}] async fn inner_subtract_2d( sketch: Sketch, tool: Vec, diff --git a/rust/kcl-lib/src/std/sweep.rs b/rust/kcl-lib/src/std/sweep.rs index 000a76013..9c6358a28 100644 --- a/rust/kcl-lib/src/std/sweep.rs +++ b/rust/kcl-lib/src/std/sweep.rs @@ -1,7 +1,6 @@ //! Standard library sweep. use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{each_cmd as mcmd, length_unit::LengthUnit, ModelingCmd}; use kittycad_modeling_cmds::{self as kcmc, shared::RelativeTo}; use schemars::JsonSchema; @@ -22,6 +21,7 @@ use crate::{ #[derive(Debug, Clone, Serialize, PartialEq, ts_rs::TS, JsonSchema)] #[ts(export)] #[serde(untagged)] +#[allow(clippy::large_enum_variant)] pub enum SweepPath { Sketch(Sketch), Helix(Box), @@ -35,7 +35,7 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("tolerance", &RuntimeType::length(), exec_state)?; let relative_to: Option = args.get_kw_arg_opt_typed("relativeTo", &RuntimeType::string(), exec_state)?; let tag_start = args.get_kw_arg_opt("tagStart")?; @@ -56,122 +56,6 @@ pub async fn sweep(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// ``` -/// -/// ```no_run -/// // Create a spring by sweeping around a helix path. -/// -/// // Create a helix around the Z axis. -/// helixPath = helix( -/// angleStart = 0, -/// ccw = true, -/// revolutions = 4, -/// length = 10, -/// radius = 5, -/// axis = Z, -/// ) -/// -/// -/// // Create a spring by sweeping around the helix path. -/// springSketch = startSketchOn(XZ) -/// |> circle( center = [5, 0], radius = 1) -/// |> sweep(path = helixPath) -/// ``` -/// -/// ```no_run -/// // Sweep two sketches along the same path. -/// -/// sketch001 = startSketchOn(XY) -/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) -/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001) - 90, -/// length = 50.61, -/// ) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001), -/// length = -segLen(rectangleSegmentA001), -/// ) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) -/// -/// sketch002 = startSketchOn(YZ) -/// sweepPath = startProfile(sketch002, at = [0, 0]) -/// |> yLine(length = 231.81) -/// |> tangentialArc(radius = 80, angle = -90) -/// |> xLine(length = 384.93) -/// -/// sweep([rectangleSketch, circleSketch], path = sweepPath) -/// ``` -/// ``` -/// // Sectionally sweep one sketch along the path -/// -/// sketch001 = startSketchOn(XY) -/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) -/// -/// sketch002 = startSketchOn(YZ) -/// sweepPath = startProfile(sketch002, at = [0, 0]) -/// |> yLine(length = 231.81) -/// |> tangentialArc(radius = 80, angle = -90) -/// |> xLine(length = 384.93) -/// -/// sweep(circleSketch, path = sweepPath, sectional = true) -/// ``` - -#[stdlib { - name = "sweep", - feature_tree_operation = true, - unlabeled_first = true, - args = { - sketches = { docs = "The sketch or set of sketches that should be swept in space" }, - path = { docs = "The path to sweep the sketch along" }, - sectional = { docs = "If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components." }, - tolerance = { docs = "Tolerance for this operation" }, - relative_to = { docs = "What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. Defaults to trajectoryCurve."}, - tag_start = { docs = "A named tag for the face at the start of the sweep, i.e. the original sketch" }, - tag_end = { docs = "A named tag for the face at the end of the sweep" }, - }, - tags = ["sketch"] -}] #[allow(clippy::too_many_arguments)] async fn inner_sweep( sketches: Vec, @@ -192,7 +76,7 @@ async fn inner_sweep( Some("sketchPlane") => RelativeTo::SketchPlane, Some("trajectoryCurve") | None => RelativeTo::TrajectoryCurve, Some(_) => { - return Err(KclError::Syntax(crate::errors::KclErrorDetails::new( + return Err(KclError::new_syntax(crate::errors::KclErrorDetails::new( "If you provide relativeTo, it must either be 'sketchPlane' or 'trajectoryCurve'".to_owned(), vec![args.source_range], ))) diff --git a/rust/kcl-lib/src/std/transform.rs b/rust/kcl-lib/src/std/transform.rs index 56cc8b0d9..6da141684 100644 --- a/rust/kcl-lib/src/std/transform.rs +++ b/rust/kcl-lib/src/std/transform.rs @@ -1,7 +1,6 @@ //! Standard library transforms. use anyhow::Result; -use kcl_derive_docs::stdlib; use kcmc::{ each_cmd as mcmd, length_unit::LengthUnit, @@ -34,11 +33,11 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("x", &RuntimeType::count(), exec_state)?; let scale_y: Option = args.get_kw_arg_opt_typed("y", &RuntimeType::count(), exec_state)?; let scale_z: Option = args.get_kw_arg_opt_typed("z", &RuntimeType::count(), exec_state)?; - let global = args.get_kw_arg_opt("global")?; + let global = args.get_kw_arg_opt_typed("global", &RuntimeType::bool(), exec_state)?; // Ensure at least one scale value is provided. if scale_x.is_none() && scale_y.is_none() && scale_z.is_none() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Expected `x`, `y`, or `z` to be provided.".to_string(), vec![args.source_range], ))); @@ -57,106 +56,6 @@ pub async fn scale(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// |> scale( -/// z = 2.5, -/// ) -/// ``` -/// -/// ```no_run -/// // Scale an imported model. -/// -/// import "tests/inputs/cube.sldprt" as cube -/// -/// cube -/// |> scale( -/// y = 2.5, -/// ) -/// ``` -/// -/// ``` -/// // Sweep two sketches along the same path. -/// -/// sketch001 = startSketchOn(XY) -/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) -/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001) - 90, -/// length = 50.61, -/// ) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001), -/// length = -segLen(rectangleSegmentA001), -/// ) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) -/// -/// sketch002 = startSketchOn(YZ) -/// sweepPath = startProfile(sketch002, at = [0, 0]) -/// |> yLine(length = 231.81) -/// |> tangentialArc(radius = 80, angle = -90) -/// |> xLine(length = 384.93) -/// -/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) -/// -/// // Scale the sweep. -/// scale(parts, z = 0.5) -/// ``` -#[stdlib { - name = "scale", - feature_tree_operation = false, - unlabeled_first = true, - args = { - objects = {docs = "The solid, sketch, or set of solids or sketches to scale."}, - x = {docs = "The scale factor for the x axis. Default is 1 if not provided.", include_in_snippet = true}, - y = {docs = "The scale factor for the y axis. Default is 1 if not provided.", include_in_snippet = true}, - z = {docs = "The scale factor for the z axis. Default is 1 if not provided.", include_in_snippet = true}, - global = {docs = "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move."} - }, - tags = ["transform"] -}] async fn inner_scale( objects: SolidOrSketchOrImportedGeometry, x: Option, @@ -216,11 +115,11 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("x", &RuntimeType::length(), exec_state)?; let translate_y: Option = args.get_kw_arg_opt_typed("y", &RuntimeType::length(), exec_state)?; let translate_z: Option = args.get_kw_arg_opt_typed("z", &RuntimeType::length(), exec_state)?; - let global = args.get_kw_arg_opt("global")?; + let global = args.get_kw_arg_opt_typed("global", &RuntimeType::bool(), exec_state)?; // Ensure at least one translation value is provided. if translate_x.is_none() && translate_y.is_none() && translate_z.is_none() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Expected `x`, `y`, or `z` to be provided.".to_string(), vec![args.source_range], ))); @@ -230,163 +129,6 @@ pub async fn translate(exec_state: &mut ExecState, args: Args) -> Result startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// |> translate( -/// x = 1.0, -/// y = 1.0, -/// z = 2.5, -/// ) -/// ``` -/// -/// ```no_run -/// // Move an imported model. -/// -/// import "tests/inputs/cube.sldprt" as cube -/// -/// // Circle so you actually see the move. -/// startSketchOn(XY) -/// |> circle( -/// center = [-10, -10], -/// radius = 10, -/// ) -/// |> extrude( -/// length = 10, -/// ) -/// -/// cube -/// |> translate( -/// x = 10.0, -/// y = 10.0, -/// z = 2.5, -/// ) -/// ``` -/// -/// ``` -/// // Sweep two sketches along the same path. -/// -/// sketch001 = startSketchOn(XY) -/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) -/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001) - 90, -/// length = 50.61, -/// ) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001), -/// length = -segLen(rectangleSegmentA001), -/// ) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) -/// -/// sketch002 = startSketchOn(YZ) -/// sweepPath = startProfile(sketch002, at = [0, 0]) -/// |> yLine(length = 231.81) -/// |> tangentialArc(radius = 80, angle = -90) -/// |> xLine(length = 384.93) -/// -/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) -/// -/// // Move the sweeps. -/// translate(parts, x = 1.0, y = 1.0, z = 2.5) -/// ``` -/// -/// ```no_run -/// // Move a sketch. -/// -/// fn square(@length){ -/// l = length / 2 -/// p0 = [-l, -l] -/// p1 = [-l, l] -/// p2 = [l, l] -/// p3 = [l, -l] -/// -/// return startSketchOn(XY) -/// |> startProfile(at = p0) -/// |> line(endAbsolute = p1) -/// |> line(endAbsolute = p2) -/// |> line(endAbsolute = p3) -/// |> close() -/// } -/// -/// square(10) -/// |> translate( -/// x = 5, -/// y = 5, -/// ) -/// |> extrude( -/// length = 10, -/// ) -/// ``` -/// -/// ```no_run -/// // Translate and rotate a sketch to create a loft. -/// sketch001 = startSketchOn(XY) -/// -/// fn square() { -/// return startProfile(sketch001, at = [-10, 10]) -/// |> xLine(length = 20) -/// |> yLine(length = -20) -/// |> xLine(length = -20) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// } -/// -/// profile001 = square() -/// -/// profile002 = square() -/// |> translate(z = 20) -/// |> rotate(axis = [0, 0, 1.0], angle = 45) -/// -/// loft([profile001, profile002]) -/// ``` -#[stdlib { - name = "translate", - feature_tree_operation = false, - unlabeled_first = true, - args = { - objects = {docs = "The solid, sketch, or set of solids or sketches to move."}, - x = {docs = "The amount to move the solid or sketch along the x axis. Defaults to 0 if not provided.", include_in_snippet = true}, - y = {docs = "The amount to move the solid or sketch along the y axis. Defaults to 0 if not provided.", include_in_snippet = true}, - z = {docs = "The amount to move the solid or sketch along the z axis. Defaults to 0 if not provided.", include_in_snippet = true}, - global = {docs = "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move."} - }, - tags = ["transform"] -}] async fn inner_translate( objects: SolidOrSketchOrImportedGeometry, x: Option, @@ -456,11 +198,11 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result = args.get_kw_arg_opt_typed("angle", &RuntimeType::degrees(), exec_state)?; - let global = args.get_kw_arg_opt("global")?; + let global = args.get_kw_arg_opt_typed("global", &RuntimeType::bool(), exec_state)?; // Check if no rotation values are provided. if roll.is_none() && pitch.is_none() && yaw.is_none() && axis.is_none() && angle.is_none() { - return Err(KclError::Semantic(KclErrorDetails::new( + return Err(KclError::new_semantic(KclErrorDetails::new( "Expected `roll`, `pitch`, and `yaw` or `axis` and `angle` to be provided.".to_string(), vec![args.source_range], ))); @@ -470,7 +212,7 @@ pub async fn rotate(exec_state: &mut ExecState, args: Args) -> Result Result Result Result Result Result Result Result startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// |> rotate( -/// roll = 10, -/// pitch = 10, -/// yaw = 90, -/// ) -/// ``` -/// -/// ```no_run -/// // Rotate a pipe with just roll. -/// -/// // Create a path for the sweep. -/// sweepPath = startSketchOn(XZ) -/// |> startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// |> rotate( -/// roll = 10, -/// ) -/// ``` -/// -/// ```no_run -/// // Rotate a pipe about a named axis with an angle. -/// -/// // Create a path for the sweep. -/// sweepPath = startSketchOn(XZ) -/// |> startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// |> rotate( -/// axis = Z, -/// angle = 90, -/// ) -/// ``` -/// -/// ```no_run -/// // Rotate an imported model. -/// -/// import "tests/inputs/cube.sldprt" as cube -/// -/// cube -/// |> rotate( -/// axis = [0, 0, 1.0], -/// angle = 9, -/// ) -/// ``` -/// -/// ```no_run -/// // Rotate a pipe about a raw axis with an angle. -/// -/// // Create a path for the sweep. -/// sweepPath = startSketchOn(XZ) -/// |> startProfile(at = [0.05, 0.05]) -/// |> line(end = [0, 7]) -/// |> tangentialArc(angle = 90, radius = 5) -/// |> line(end = [-3, 0]) -/// |> tangentialArc(angle = -90, radius = 5) -/// |> line(end = [0, 7]) -/// -/// // Create a hole for the pipe. -/// pipeHole = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 1.5, -/// ) -/// -/// sweepSketch = startSketchOn(XY) -/// |> circle( -/// center = [0, 0], -/// radius = 2, -/// ) -/// |> subtract2d(tool = pipeHole) -/// |> sweep(path = sweepPath) -/// |> rotate( -/// axis = [0, 0, 1.0], -/// angle = 90, -/// ) -/// ``` -/// -/// ``` -/// // Sweep two sketches along the same path. -/// -/// sketch001 = startSketchOn(XY) -/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) -/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001) - 90, -/// length = 50.61, -/// ) -/// |> angledLine( -/// angle = segAng(rectangleSegmentA001), -/// length = -segLen(rectangleSegmentA001), -/// ) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// -/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) -/// -/// sketch002 = startSketchOn(YZ) -/// sweepPath = startProfile(sketch002, at = [0, 0]) -/// |> yLine(length = 231.81) -/// |> tangentialArc(radius = 80, angle = -90) -/// |> xLine(length = 384.93) -/// -/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) -/// -/// // Rotate the sweeps. -/// rotate(parts, axis = [0, 0, 1.0], angle = 90) -/// ``` -/// -/// ```no_run -/// // Translate and rotate a sketch to create a loft. -/// sketch001 = startSketchOn(XY) -/// -/// fn square() { -/// return startProfile(sketch001, at = [-10, 10]) -/// |> xLine(length = 20) -/// |> yLine(length = -20) -/// |> xLine(length = -20) -/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) -/// |> close() -/// } -/// -/// profile001 = square() -/// -/// profile002 = square() -/// |> translate(x = 0, y = 0, z = 20) -/// |> rotate(axis = [0, 0, 1.0], angle = 45) -/// -/// loft([profile001, profile002]) -/// ``` -#[stdlib { - name = "rotate", - feature_tree_operation = false, - unlabeled_first = true, - args = { - objects = {docs = "The solid, sketch, or set of solids or sketches to rotate."}, - roll = {docs = "The roll angle in degrees. Must be between -360 and 360. Default is 0 if not given.", include_in_snippet = true}, - pitch = {docs = "The pitch angle in degrees. Must be between -360 and 360. Default is 0 if not given.", include_in_snippet = true}, - yaw = {docs = "The yaw angle in degrees. Must be between -360 and 360. Default is 0 if not given.", include_in_snippet = true}, - axis = {docs = "The axis to rotate around. Must be used with `angle`.", include_in_snippet = false}, - angle = {docs = "The angle to rotate in degrees. Must be used with `axis`. Must be between -360 and 360.", include_in_snippet = false}, - global = {docs = "If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move."} - }, - tags = ["transform"] -}] #[allow(clippy::too_many_arguments)] async fn inner_rotate( objects: SolidOrSketchOrImportedGeometry, diff --git a/rust/kcl-lib/src/test_server.rs b/rust/kcl-lib/src/test_server.rs index de8e0442e..ad707ac65 100644 --- a/rust/kcl-lib/src/test_server.rs +++ b/rust/kcl-lib/src/test_server.rs @@ -36,7 +36,16 @@ pub async fn execute_and_snapshot_ast( ast: Program, current_file: Option, with_export_step: bool, -) -> Result<(ExecState, EnvironmentRef, image::DynamicImage, Option>), ExecErrorWithState> { +) -> Result< + ( + ExecState, + ExecutorContext, + EnvironmentRef, + image::DynamicImage, + Option>, + ), + ExecErrorWithState, +> { let ctx = new_context(true, current_file).await?; let (exec_state, env, img) = match do_execute_and_snapshot(&ctx, ast).await { Ok((exec_state, env_ref, img)) => (exec_state, env_ref, img), @@ -64,7 +73,7 @@ pub async fn execute_and_snapshot_ast( step = files.into_iter().next().map(|f| f.contents); } ctx.close().await; - Ok((exec_state, env, img, step)) + Ok((exec_state, ctx, env, img, step)) } pub async fn execute_and_snapshot_no_auth( @@ -93,7 +102,7 @@ async fn do_execute_and_snapshot( for e in exec_state.errors() { if e.severity.is_err() { return Err(ExecErrorWithState::new( - KclErrorWithOutputs::no_outputs(KclError::Semantic(e.clone().into())).into(), + KclErrorWithOutputs::no_outputs(KclError::new_semantic(e.clone().into())).into(), exec_state.clone(), )); } @@ -164,7 +173,7 @@ pub async fn execute_and_export_step( for e in exec_state.errors() { if e.severity.is_err() { return Err(ExecErrorWithState::new( - KclErrorWithOutputs::no_outputs(KclError::Semantic(e.clone().into())).into(), + KclErrorWithOutputs::no_outputs(KclError::new_semantic(e.clone().into())).into(), exec_state.clone(), )); } diff --git a/rust/kcl-lib/src/unparser.rs b/rust/kcl-lib/src/unparser.rs index a721e0f47..c01a495c4 100644 --- a/rust/kcl-lib/src/unparser.rs +++ b/rust/kcl-lib/src/unparser.rs @@ -883,7 +883,7 @@ pub async fn walk_dir(dir: &std::path::PathBuf) -> Result Result<(), anyhow::Error> { let files = walk_dir(&dir.to_path_buf()).await.map_err(|err| { - crate::KclError::Internal(crate::errors::KclErrorDetails::new( + crate::KclError::new_internal(crate::errors::KclErrorDetails::new( format!("Failed to walk directory `{}`: {:?}", dir.display(), err), vec![crate::SourceRange::default()], )) @@ -912,7 +912,7 @@ pub async fn recast_dir(dir: &std::path::Path, options: &crate::FormatOptions) - if ce.severity != crate::errors::Severity::Warning { let report = crate::Report { kcl_source: contents.to_string(), - error: crate::KclError::Semantic(ce.clone().into()), + error: crate::KclError::new_semantic(ce.clone().into()), filename: file.to_string_lossy().to_string(), }; let report = miette::Report::new(report); diff --git a/rust/kcl-lib/src/walk/mod.rs b/rust/kcl-lib/src/walk/mod.rs index 66851a00e..94746b651 100644 --- a/rust/kcl-lib/src/walk/mod.rs +++ b/rust/kcl-lib/src/walk/mod.rs @@ -3,10 +3,7 @@ mod ast_node; mod ast_visitor; mod ast_walk; -mod import_graph; -pub use ast_node::Node; -pub use ast_visitor::Visitable; -pub use ast_walk::walk; -pub use import_graph::import_graph; -pub(crate) use import_graph::{import_universe, Universe, UniverseMap}; +pub(crate) use ast_node::Node; +pub(crate) use ast_visitor::Visitable; +pub(crate) use ast_walk::walk; diff --git a/rust/kcl-lib/std/prelude.kcl b/rust/kcl-lib/std/prelude.kcl index 1a8174453..3699e0f71 100644 --- a/rust/kcl-lib/std/prelude.kcl +++ b/rust/kcl-lib/std/prelude.kcl @@ -152,13 +152,13 @@ export fn helix( /// Is the helix rotation counter clockwise? The default is `false`. ccw?: bool, /// Radius of the helix. - @(include_in_snippet = true) + @(includeInSnippet = true) radius?: number(Length), /// Axis to use for the helix. - @(include_in_snippet = true) + @(includeInSnippet = true) axis?: Axis3d | Edge, /// Length of the helix. This is not necessary if the helix is created around an edge. If not given the length of the edge is used. - @(include_in_snippet = true) + @(includeInSnippet = true) length?: number(Length), /// Cylinder to create the helix on. cylinder?: Solid, @@ -484,3 +484,47 @@ export fn clone( /// The sketch, solid, or imported geometry to be cloned. @geometry: Sketch | Solid | ImportedGeometry, ): Sketch | Solid | ImportedGeometry {} + +/// Asserts that a value is the boolean value true. +/// +/// ```kcl,norun +/// kclIsFun = true +/// assertIs(kclIsFun) +/// ``` +@(impl = std_rust) +export fn assertIs( + /// Value to check. If this is the boolean value true, assert passes. Otherwise it fails.. + @actual: bool, + /// If the value was false, the program will terminate with this error message + error?: string, +) {} + +/// Check a value meets some expected conditions at runtime. Program terminates with an error if conditions aren't met. +/// If you provide multiple conditions, they will all be checked and all must be met. +/// +/// ```kcl,norun +/// n = 10 +/// assert(n, isEqualTo = 10) +/// assert(n, isGreaterThanOrEqual = 0, isLessThan = 100, error = "number should be between 0 and 100") +/// assert(1.0000000000012, isEqualTo = 1, tolerance = 0.0001, error = "number should be almost exactly 1") +/// ``` +@(impl = std_rust) +export fn assert( + /// Value to check. If this is the boolean value true, assert passes. Otherwise it fails.. + @actual: number, + /// Comparison argument. If given, checks the `actual` value is greater than this. + isGreaterThan?: number, + /// Comparison argument. If given, checks the `actual` value is less than this. + isLessThan?: number, + /// Comparison argument. If given, checks the `actual` value is greater than or equal to this. + isGreaterThanOrEqual?: number, + /// Comparison argument. If given, checks the `actual` value is less than or equal to this. + isLessThanOrEqual?: number, + /// Comparison argument. If given, checks the `actual` value is less than or equal to this. + @(includeInSnippet = true) + isEqualTo?: number, + /// If `isEqualTo` is used, this is the tolerance to allow for the comparison. This tolerance is used because KCL's number system has some floating-point imprecision when used with very large decimal places. + tolerance?: number, + /// If the value was false, the program will terminate with this error message + error?: string, +) {} diff --git a/rust/kcl-lib/std/sketch.kcl b/rust/kcl-lib/std/sketch.kcl index 7feb7bdc6..ce30aed4e 100644 --- a/rust/kcl-lib/std/sketch.kcl +++ b/rust/kcl-lib/std/sketch.kcl @@ -7,6 +7,233 @@ @no_std @settings(defaultLengthUnit = mm, kclVersion = 1.0) +/// Start a new 2-dimensional sketch on a specific plane or face. +/// +/// ### Sketch on Face Behavior +/// +/// There are some important behaviors to understand when sketching on a face: +/// +/// The resulting sketch will _include_ the face and thus Solid +/// that was sketched on. So say you were to export the resulting Sketch / Solid +/// from a sketch on a face, you would get both the artifact of the sketch +/// on the face and the parent face / Solid itself. +/// +/// This is important to understand because if you were to then sketch on the +/// resulting Solid, it would again include the face and parent Solid that was +/// sketched on. This could go on indefinitely. +/// +/// The point is if you want to export the result of a sketch on a face, you +/// only need to export the final Solid that was created from the sketch on the +/// face, since it will include all the parent faces and Solids. +/// +/// +/// ```kcl +/// exampleSketch = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// +/// exampleSketch002 = startSketchOn(example, face = END) +/// |> startProfile(at = [1, 1]) +/// |> line(end = [8, 0]) +/// |> line(end = [0, 8]) +/// |> line(end = [-8, 0]) +/// |> close() +/// +/// example002 = extrude(exampleSketch002, length = 5) +/// +/// exampleSketch003 = startSketchOn(example002, face = END) +/// |> startProfile(at = [2, 2]) +/// |> line(end = [6, 0]) +/// |> line(end = [0, 6]) +/// |> line(end = [-6, 0]) +/// |> close() +/// +/// example003 = extrude(exampleSketch003, length = 5) +/// ``` +/// +/// ```kcl +/// // Sketch on the end of an extruded face by tagging the end face. +/// +/// exampleSketch = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5, tagEnd = $end01) +/// +/// exampleSketch002 = startSketchOn(example, face = end01) +/// |> startProfile(at = [1, 1]) +/// |> line(end = [8, 0]) +/// |> line(end = [0, 8]) +/// |> line(end = [-8, 0]) +/// |> close() +/// +/// example002 = extrude(exampleSketch002, length = 5, tagEnd = $end02) +/// +/// exampleSketch003 = startSketchOn(example002, face = end02) +/// |> startProfile(at = [2, 2]) +/// |> line(end = [6, 0]) +/// |> line(end = [0, 6]) +/// |> line(end = [-6, 0]) +/// |> close() +/// +/// example003 = extrude(exampleSketch003, length = 5) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10], tag = $sketchingFace) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// +/// exampleSketch002 = startSketchOn(example, face = sketchingFace) +/// |> startProfile(at = [1, 1]) +/// |> line(end = [8, 0]) +/// |> line(end = [0, 8]) +/// |> line(end = [-8, 0]) +/// |> close(tag = $sketchingFace002) +/// +/// example002 = extrude(exampleSketch002, length = 10) +/// +/// exampleSketch003 = startSketchOn(example002, face = sketchingFace002) +/// |> startProfile(at = [-8, 12]) +/// |> line(end = [0, 6]) +/// |> line(end = [6, 0]) +/// |> line(end = [0, -6]) +/// |> close() +/// +/// example003 = extrude(exampleSketch003, length = 5) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XY) +/// |> startProfile(at = [4, 12]) +/// |> line(end = [2, 0]) +/// |> line(end = [0, -6]) +/// |> line(end = [4, -6]) +/// |> line(end = [0, -6]) +/// |> line(end = [-3.75, -4.5]) +/// |> line(end = [0, -5.5]) +/// |> line(end = [-2, 0]) +/// |> close() +/// +/// example = revolve(exampleSketch, axis = Y, angle = 180) +/// +/// exampleSketch002 = startSketchOn(example, face = END) +/// |> startProfile(at = [4.5, -5]) +/// |> line(end = [0, 5]) +/// |> line(end = [5, 0]) +/// |> line(end = [0, -5]) +/// |> close() +/// +/// example002 = extrude(exampleSketch002, length = 5) +/// ``` +/// +/// ```kcl +/// // Sketch on the end of a revolved face by tagging the end face. +/// +/// exampleSketch = startSketchOn(XY) +/// |> startProfile(at = [4, 12]) +/// |> line(end = [2, 0]) +/// |> line(end = [0, -6]) +/// |> line(end = [4, -6]) +/// |> line(end = [0, -6]) +/// |> line(end = [-3.75, -4.5]) +/// |> line(end = [0, -5.5]) +/// |> line(end = [-2, 0]) +/// |> close() +/// +/// example = revolve(exampleSketch, axis = Y, angle = 180, tagEnd = $end01) +/// +/// exampleSketch002 = startSketchOn(example, face = end01) +/// |> startProfile(at = [4.5, -5]) +/// |> line(end = [0, 5]) +/// |> line(end = [5, 0]) +/// |> line(end = [0, -5]) +/// |> close() +/// +/// example002 = extrude(exampleSketch002, length = 5) +/// ``` +/// +/// ```kcl +/// a1 = startSketchOn({ +/// origin = { x = 0, y = 0, z = 0 }, +/// xAxis = { x = 1, y = 0, z = 0 }, +/// yAxis = { x = 0, y = 1, z = 0 }, +/// zAxis = { x = 0, y = 0, z = 1 } +/// }) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [100.0, 0]) +/// |> yLine(length = -100.0) +/// |> xLine(length = -100.0) +/// |> yLine(length = 100.0) +/// |> close() +/// |> extrude(length = 3.14) +/// ``` +@(impl = std_rust) +export fn startSketchOn( + /// Profile whose start is being used. + @planeOrSolid: Solid | Plane, + /// Identify a face of a solid if a solid is specified as the input argument (`planeOrSolid`). + face?: tag, +): Plane | Face {} + +/// Start a new profile at a given point. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(-XZ) +/// |> startProfile(at = [10, 10]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(-XZ) +/// |> startProfile(at = [-10, 23]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn startProfile( + /// What to start the profile on. + @startProfileOn: Plane | Face, + /// Where to start the profile. An absolute point. + @(snippetArray = ["0", "0"]) + at: Point2d, + /// Tag this first starting point. + tag?: tag, +): Sketch {} + /// Construct a 2-dimensional circle, of the specified radius, centered at /// the provided (x, y) origin point. /// @@ -31,14 +258,14 @@ @(impl = std_rust) export fn circle( /// Sketch to extend, or plane or surface to sketch on. - @sketch_or_surface: Sketch | Plane | Face, + @sketchOrSurface: Sketch | Plane | Face, /// The center of the circle. @(snippetArray = ["0", "0"]) center: Point2d, /// The radius of the circle. Incompatible with `diameter`. radius?: number(Length), /// The diameter of the circle. Incompatible with `radius`. - @(include_in_snippet = true) + @(includeInSnippet = true) diameter?: number(Length), /// Create a new tag which refers to this circle. tag?: tag, @@ -64,6 +291,115 @@ export fn ellipse( /// Create a new tag which refers to this ellipse. tag?: tag, ): Sketch {} +======= +/// Extend a 2-dimensional sketch through a third dimension in order to +/// create new 3-dimensional volume, or if extruded into an existing volume, +/// cut into an existing solid. +/// +/// You can provide more than one sketch to extrude, and they will all be +/// extruded in the same direction. +/// +/// ```kcl +/// example = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> arc( +/// angleStart = 120, +/// angleEnd = 0, +/// radius = 5, +/// ) +/// |> line(end = [5, 0]) +/// |> line(end = [0, 10]) +/// |> bezierCurve( +/// control1 = [-10, 0], +/// control2 = [2, 10], +/// end = [-5, 10], +/// ) +/// |> line(end = [-5, -2]) +/// |> close() +/// |> extrude(length = 10) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [-10, 0]) +/// |> arc( +/// angleStart = 120, +/// angleEnd = -60, +/// radius = 5, +/// ) +/// |> line(end = [10, 0]) +/// |> line(end = [5, 0]) +/// |> bezierCurve( +/// control1 = [-3, 0], +/// control2 = [2, 10], +/// end = [-5, 10], +/// ) +/// |> line(end = [-4, 10]) +/// |> line(end = [-5, -2]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [-10, 0]) +/// |> arc( +/// angleStart = 120, +/// angleEnd = -60, +/// radius = 5, +/// ) +/// |> line(end = [10, 0]) +/// |> line(end = [5, 0]) +/// |> bezierCurve( +/// control1 = [-3, 0], +/// control2 = [2, 10], +/// end = [-5, 10], +/// ) +/// |> line(end = [-4, 10]) +/// |> line(end = [-5, -2]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 20, symmetric = true) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [-10, 0]) +/// |> arc( +/// angleStart = 120, +/// angleEnd = -60, +/// radius = 5, +/// ) +/// |> line(end = [10, 0]) +/// |> line(end = [5, 0]) +/// |> bezierCurve( +/// control1 = [-3, 0], +/// control2 = [2, 10], +/// end = [-5, 10], +/// ) +/// |> line(end = [-4, 10]) +/// |> line(end = [-5, -2]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10, bidirectionalLength = 50) +/// ``` +@(impl = std_rust) +export fn extrude( + /// Which sketch or sketches should be extruded. + @sketches: [Sketch; 1+], + /// How far to extrude the given sketches. + length: number(Length), + /// If true, the extrusion will happen symmetrically around the sketch. Otherwise, the extrusion will happen on only one side of the sketch. + symmetric?: bool, + /// If specified, will also extrude in the opposite direction to 'distance' to the specified distance. If 'symmetric' is true, this value is ignored. + bidirectionalLength?: number(Length), + /// A named tag for the face at the start of the extrusion, i.e. the original sketch. + tagStart?: tag, + /// A named tag for the face at the end of the extrusion, i.e. the new face created by extruding the original sketch. + tagEnd?: tag, +): [Solid; 1+] {} /// Rotate a sketch around some provided axis, creating a solid from its extent. /// @@ -78,7 +414,7 @@ export fn ellipse( /// You can provide more than one sketch to revolve, and they will all be /// revolved around the same axis. /// -/// ``` +/// ```kcl /// part001 = startSketchOn(XY) /// |> startProfile(at = [4, 12]) /// |> line(end = [2, 0]) @@ -92,7 +428,7 @@ export fn ellipse( /// |> revolve(axis = Y) // default angle is 360 /// ``` /// -/// ``` +/// ```kcl /// // A donut shape. /// sketch001 = startSketchOn(XY) /// |> circle( center = [15, 0], radius = 5 ) @@ -102,7 +438,7 @@ export fn ellipse( /// ) /// ``` /// -/// ``` +/// ```kcl /// part001 = startSketchOn(XY) /// |> startProfile(at = [4, 12]) /// |> line(end = [2, 0]) @@ -116,7 +452,7 @@ export fn ellipse( /// |> revolve(axis = Y, angle = 180) /// ``` /// -/// ``` +/// ```kcl /// part001 = startSketchOn(XY) /// |> startProfile(at = [4, 12]) /// |> line(end = [2, 0]) @@ -138,7 +474,7 @@ export fn ellipse( /// |> extrude(length = 5) /// ``` /// -/// ``` +/// ```kcl /// box = startSketchOn(XY) /// |> startProfile(at = [0, 0]) /// |> line(end = [0, 20]) @@ -155,7 +491,7 @@ export fn ellipse( /// ) /// ``` /// -/// ``` +/// ```kcl /// box = startSketchOn(XY) /// |> startProfile(at = [0, 0]) /// |> line(end = [0, 20]) @@ -172,7 +508,7 @@ export fn ellipse( /// ) /// ``` /// -/// ``` +/// ```kcl /// box = startSketchOn(XY) /// |> startProfile(at = [0, 0]) /// |> line(end = [0, 20]) @@ -190,7 +526,7 @@ export fn ellipse( /// ) /// ``` /// -/// ``` +/// ```kcl /// sketch001 = startSketchOn(XY) /// |> startProfile(at = [10, 0]) /// |> line(end = [5, -5]) @@ -207,7 +543,7 @@ export fn ellipse( /// ) /// ``` /// -/// ``` +/// ```kcl /// // Revolve two sketches around the same axis. /// /// sketch001 = startSketchOn(XY) @@ -231,7 +567,7 @@ export fn ellipse( /// ) /// ``` /// -/// ``` +/// ```kcl /// // Revolve around a path that has not been extruded. /// /// profile001 = startSketchOn(XY) @@ -246,7 +582,7 @@ export fn ellipse( /// |> revolve(angle = 90, axis = revolveAxis) /// ``` /// -/// ``` +/// ```kcl /// // Revolve around a path that has not been extruded or closed. /// /// profile001 = startSketchOn(XY) @@ -259,7 +595,7 @@ export fn ellipse( /// |> revolve(angle = 90, axis = revolveAxis) /// ``` /// -/// ``` +/// ```kcl /// // Symmetrically revolve around a path. /// /// profile001 = startSketchOn(XY) @@ -272,7 +608,7 @@ export fn ellipse( /// |> revolve(angle = 90, axis = revolveAxis, symmetric = true) /// ``` /// -/// ``` +/// ```kcl /// // Bidirectional revolve around a path. /// /// profile001 = startSketchOn(XY) @@ -328,3 +664,1278 @@ export fn patternTransform2d( /// If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. useOriginal?: boolean = false, ): [Sketch; 1+] {} + +/// Get the opposite edge to the edge given. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> angledLine( +/// angle = 120, +/// length = 10, +/// ) +/// |> line(end = [-10, 0]) +/// |> angledLine( +/// angle = 240, +/// length = 10, +/// tag = $referenceEdge, +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// |> fillet( +/// radius = 3, +/// tags = [getOppositeEdge(referenceEdge)], +/// ) +/// ``` +@(impl = std_rust) +export fn getOppositeEdge( + /// The tag of the edge you want to find the opposite edge of. + @edge: tag, +): Edge {} + +/// Get the next adjacent edge to the edge given. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> angledLine( +/// angle = 120, +/// length = 10, +/// ) +/// |> line(end = [-10, 0]) +/// |> angledLine( +/// angle = 240, +/// length = 10, +/// tag = $referenceEdge, +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// |> fillet( +/// radius = 3, +/// tags = [getNextAdjacentEdge(referenceEdge)], +/// ) +/// ``` +@(impl = std_rust) +export fn getNextAdjacentEdge( + /// The tag of the edge you want to find the next adjacent edge of. + @edge: tag, +): Edge {} + +/// Get the previous adjacent edge to the edge given. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> angledLine( +/// angle = 120, +/// length = 10, +/// ) +/// |> line(end = [-10, 0]) +/// |> angledLine( +/// angle = 240, +/// length = 10, +/// tag = $referenceEdge, +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// |> fillet( +/// radius = 3, +/// tags = [getPreviousAdjacentEdge(referenceEdge)], +/// ) +/// ``` +@(impl = std_rust) +export fn getPreviousAdjacentEdge( + /// The tag of the edge you want to find the previous adjacent edge of. + @edge: tag, +): Edge {} + +/// Get the shared edge between two faces. +/// +/// ```kcl +/// // Get an edge shared between two faces, created after a chamfer. +/// +/// scale = 20 +/// part001 = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [0, scale]) +/// |> line(end = [scale, 0]) +/// |> line(end = [0, -scale]) +/// |> close(tag = $line0) +/// |> extrude(length = 20, tagEnd = $end0) +/// // We tag the chamfer to reference it later. +/// |> chamfer(length = 10, tags = [getOppositeEdge(line0)], tag = $chamfer0) +/// +/// // Get the shared edge between the chamfer and the extrusion. +/// commonEdge = getCommonEdge(faces = [chamfer0, end0]) +/// +/// // Chamfer the shared edge. +/// // TODO: uncomment this when ssi for fillets lands +/// // chamfer(part001, length = 5, tags = [commonEdge]) +/// ``` +@(impl = std_rust) +export fn getCommonEdge( + /// The tags of the faces you want to find the common edge between. + faces: [tag; 2], +): Edge {} + +/// Construct a circle derived from 3 points. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XY) +/// |> circleThreePoint(p1 = [10,10], p2 = [20,8], p3 = [15,5]) +/// |> extrude(length = 5) +/// ``` +@(impl = std_rust) +export fn circleThreePoint( + /// Plane or surface to sketch on. + @sketchOrSurface: Sketch | Plane | Face, + /// 1st point to derive the circle. + p1: Point2d, + /// 2nd point to derive the circle. + p2: Point2d, + /// 3rd point to derive the circle. + p3: Point2d, + /// Identifier for the circle to reference elsewhere. + tag?: tag, +): Sketch {} + +/// Create a regular polygon with the specified number of sides that is either inscribed or circumscribed around a circle of the specified radius. +/// +/// ```kcl +/// // Create a regular hexagon inscribed in a circle of radius 10 +/// hex = startSketchOn(XY) +/// |> polygon( +/// radius = 10, +/// numSides = 6, +/// center = [0, 0], +/// inscribed = true, +/// ) +/// +/// example = extrude(hex, length = 5) +/// ``` +/// +/// ```kcl +/// // Create a square circumscribed around a circle of radius 5 +/// square = startSketchOn(XY) +/// |> polygon( +/// radius = 5.0, +/// numSides = 4, +/// center = [10, 10], +/// inscribed = false, +/// ) +/// example = extrude(square, length = 5) +/// ``` +@(impl = std_rust) +export fn polygon( + /// Plane or surface to sketch on. + @sketchOrSurface: Sketch | Plane | Face, + /// The radius of the polygon. + radius: number(Length), + /// The number of sides in the polygon. + numSides: number(Count), + /// The center point of the polygon. + @(snippetArray = ["0", "0"]) + center: Point2d, + /// Whether the polygon is inscribed (true, the default) or circumscribed (false) about a circle with the specified radius. + inscribed?: bool = true, +): Sketch {} + +/// Extrude a sketch along a path. +/// +/// This, like extrude, is able to create a 3-dimensional solid from a +/// 2-dimensional sketch. However, unlike extrude, this creates a solid +/// by using the extent of the sketch as its path. This is useful for +/// creating more complex shapes that can't be created with a simple +/// extrusion. +/// +/// You can provide more than one sketch to sweep, and they will all be +/// swept along the same path. +/// +/// ```kcl +/// // Create a pipe using a sweep. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// ``` +/// +/// ```kcl +/// // Create a spring by sweeping around a helix path. +/// +/// // Create a helix around the Z axis. +/// helixPath = helix( +/// angleStart = 0, +/// ccw = true, +/// revolutions = 4, +/// length = 10, +/// radius = 5, +/// axis = Z, +/// ) +/// +/// +/// // Create a spring by sweeping around the helix path. +/// springSketch = startSketchOn(XZ) +/// |> circle( center = [5, 0], radius = 1) +/// |> sweep(path = helixPath) +/// ``` +/// +/// ```kcl +/// // Sweep two sketches along the same path. +/// +/// sketch001 = startSketchOn(XY) +/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) +/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001) - 90, +/// length = 50.61, +/// ) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001), +/// length = -segLen(rectangleSegmentA001), +/// ) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) +/// +/// sketch002 = startSketchOn(YZ) +/// sweepPath = startProfile(sketch002, at = [0, 0]) +/// |> yLine(length = 231.81) +/// |> tangentialArc(radius = 80, angle = -90) +/// |> xLine(length = 384.93) +/// +/// sweep([rectangleSketch, circleSketch], path = sweepPath) +/// ``` +/// +/// ```kcl +/// // Sectionally sweep one sketch along the path +/// +/// sketch001 = startSketchOn(XY) +/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) +/// +/// sketch002 = startSketchOn(YZ) +/// sweepPath = startProfile(sketch002, at = [0, 0]) +/// |> yLine(length = 231.81) +/// |> tangentialArc(radius = 80, angle = -90) +/// |> xLine(length = 384.93) +/// +/// sweep(circleSketch, path = sweepPath, sectional = true) +/// ``` +@(impl = std_rust) +export fn sweep( + /// The sketch or set of sketches that should be swept in space. + @sketches: [Sketch; 1+], + /// The path to sweep the sketch along. + path: Sketch | Helix, + /// If true, the sweep will be broken up into sub-sweeps (extrusions, revolves, sweeps) based on the trajectory path components. + sectional?: bool, + /// Tolerance for this operation. + tolerance?: number(Length), + /// What is the sweep relative to? Can be either 'sketchPlane' or 'trajectoryCurve'. + relativeTo?: string = 'trajectoryCurve', + /// A named tag for the face at the start of the sweep, i.e. the original sketch. + tagStart?: tag, + /// A named tag for the face at the end of the sweep. + tagEnd?: tag, +): [Solid; 1+] {} + +/// Create a 3D surface or solid by interpolating between two or more sketches. +/// +/// The sketches need to closed and on the same plane. +/// +/// ```kcl +/// // Loft a square and a triangle. +/// squareSketch = startSketchOn(XY) +/// |> startProfile(at = [-100, 200]) +/// |> line(end = [200, 0]) +/// |> line(end = [0, -200]) +/// |> line(end = [-200, 0]) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// triangleSketch = startSketchOn(offsetPlane(XY, offset = 75)) +/// |> startProfile(at = [0, 125]) +/// |> line(end = [-15, -30]) +/// |> line(end = [30, 0]) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// loft([triangleSketch, squareSketch]) +/// ``` +/// +/// ```kcl +/// // Loft a square, a circle, and another circle. +/// squareSketch = startSketchOn(XY) +/// |> startProfile(at = [-100, 200]) +/// |> line(end = [200, 0]) +/// |> line(end = [0, -200]) +/// |> line(end = [-200, 0]) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// circleSketch0 = startSketchOn(offsetPlane(XY, offset = 75)) +/// |> circle( center = [0, 100], radius = 50 ) +/// +/// circleSketch1 = startSketchOn(offsetPlane(XY, offset = 150)) +/// |> circle( center = [0, 100], radius = 20 ) +/// +/// loft([squareSketch, circleSketch0, circleSketch1]) +/// ``` +/// +/// ```kcl +/// // Loft a square, a circle, and another circle with options. +/// squareSketch = startSketchOn(XY) +/// |> startProfile(at = [-100, 200]) +/// |> line(end = [200, 0]) +/// |> line(end = [0, -200]) +/// |> line(end = [-200, 0]) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// circleSketch0 = startSketchOn(offsetPlane(XY, offset = 75)) +/// |> circle( center = [0, 100], radius = 50 ) +/// +/// circleSketch1 = startSketchOn(offsetPlane(XY, offset = 150)) +/// |> circle( center = [0, 100], radius = 20 ) +/// +/// loft([squareSketch, circleSketch0, circleSketch1], +/// baseCurveIndex = 0, +/// bezApproximateRational = false, +/// tolerance = 0.000001, +/// vDegree = 2, +/// ) +/// ``` +@(impl = std_rust) +export fn loft( + /// Which sketches to loft. Must include at least 2 sketches. + @sketches: [Sketch; 2+], + /// Degree of the interpolation. Must be greater than zero. For example, use 2 for quadratic, or 3 for cubic interpolation in the V direction. + vDegree?: number(Count) = 2, + /// Attempt to approximate rational curves (such as arcs) using a bezier. This will remove banding around interpolations between arcs and non-arcs. It may produce errors in other scenarios. Over time, this field won't be necessary. + bezApproximateRational?: bool = false, + /// This can be set to override the automatically determined topological base curve, which is usually the first section encountered. + baseCurveIndex?: number(Count), + /// Tolerance for the loft operation. + tolerance?: number(Length), + /// A named tag for the face at the start of the loft, i.e. the original sketch. + tagStart?: tag, + /// A named tag for the face at the end of the loft. + tagEnd?: tag, +): Solid {} + +/// Repeat a 2-dimensional sketch along some dimension, with a dynamic amount +/// of distance between each repetition, some specified number of times. +/// +/// ```kcl +/// /// Pattern using a named axis. +/// +/// exampleSketch = startSketchOn(XZ) +/// |> circle(center = [0, 0], radius = 1) +/// |> patternLinear2d( +/// axis = X, +/// instances = 7, +/// distance = 4 +/// ) +/// +/// example = extrude(exampleSketch, length = 1) +/// ``` +/// +/// ```kcl +/// /// Pattern using a raw axis. +/// +/// exampleSketch = startSketchOn(XZ) +/// |> circle(center = [0, 0], radius = 1) +/// |> patternLinear2d( +/// axis = [1, 0], +/// instances = 7, +/// distance = 4 +/// ) +/// +/// example = extrude(exampleSketch, length = 1) +/// ``` +@(impl = std_rust) +export fn patternLinear2d( + /// The sketch(es) to duplicate. + @sketches: [Sketch; 1+], + /// The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. + instances: number(Count), + /// Distance between each repetition. Also known as 'spacing'. + distance: number(Length), + /// The axis of the pattern. A 2D vector. + @(snippetArray = ["1", "0"]) + axis: Axis2d | Point2d, + /// If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. + useOriginal?: bool = false, +): [Sketch; 1+] {} + +/// Repeat a 2-dimensional sketch some number of times along a partial or +/// complete circle some specified number of times. Each object may +/// additionally be rotated along the circle, ensuring orientation of the +/// solid with respect to the center of the circle is maintained. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [.5, 25]) +/// |> line(end = [0, 5]) +/// |> line(end = [-1, 0]) +/// |> line(end = [0, -5]) +/// |> close() +/// |> patternCircular2d( +/// center = [0, 0], +/// instances = 13, +/// arcDegrees = 360, +/// rotateDuplicates = true +/// ) +/// +/// example = extrude(exampleSketch, length = 1) +/// ``` +@(impl = std_rust) +export fn patternCircular2d( + /// The sketch(es) to duplicate. + @sketches: [Sketch; 1+], + /// The number of total instances. Must be greater than or equal to 1. This includes the original entity. For example, if instances is 2, there will be two copies -- the original, and one new copy. If instances is 1, this has no effect. + instances: number(Count), + /// The center about which to make the pattern. This is a 2D vector. + @(snippetArray = ["0", "0"]) + center: Point2d, + /// The arc angle (in degrees) to place the repetitions. Must be greater than 0. + arcDegrees?: number(Angle) = 360deg, + /// Whether or not to rotate the duplicates as they are copied. + rotateDuplicates?: bool = true, + /// If the target was sketched on an extrusion, setting this will use the original sketch as the target, not the entire joined solid. + useOriginal?: bool = false, +): [Sketch; 1+] {} + +/// Compute the ending point of the provided line segment. +/// +/// ```kcl +/// w = 15 +/// cube = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [w, 0], tag = $line1) +/// |> line(end = [0, w], tag = $line2) +/// |> line(end = [-w, 0], tag = $line3) +/// |> line(end = [0, -w], tag = $line4) +/// |> close() +/// |> extrude(length = 5) +/// +/// fn cylinder(radius, tag) { +/// return startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> circle(radius = radius, center = segEnd(tag) ) +/// |> extrude(length = radius) +/// } +/// +/// cylinder(radius = 1, tag = line1) +/// cylinder(radius = 2, tag = line2) +/// cylinder(radius = 3, tag = line3) +/// cylinder(radius = 4, tag = line4) +/// ``` +@(impl = std_rust) +export fn segEnd( + /// The line segment being queried by its tag. + @tag: tag, +): Point2d {} + +/// Compute the ending point of the provided line segment along the 'x' axis. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [20, 0], tag = $thing) +/// |> line(end = [0, 5]) +/// |> line(end = [segEndX(thing), 0]) +/// |> line(end = [-20, 10]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn segEndX( + /// The line segment being queried by its tag. + @tag: tag, +): number(Length) {} + +/// Compute the ending point of the provided line segment along the 'y' axis. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [20, 0]) +/// |> line(end = [0, 3], tag = $thing) +/// |> line(end = [-10, 0]) +/// |> line(end = [0, segEndY(thing)]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn segEndY( + /// The line segment being queried by its tag. + @tag: tag, +): number(Length) {} + +/// Compute the starting point of the provided line segment. +/// +/// ```kcl +/// w = 15 +/// cube = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [w, 0], tag = $line1) +/// |> line(end = [0, w], tag = $line2) +/// |> line(end = [-w, 0], tag = $line3) +/// |> line(end = [0, -w], tag = $line4) +/// |> close() +/// |> extrude(length = 5) +/// +/// fn cylinder(radius, tag) { +/// return startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> circle( radius = radius, center = segStart(tag) ) +/// |> extrude(length = radius) +/// } +/// +/// cylinder(radius = 1, tag = line1) +/// cylinder(radius = 2, tag = line2) +/// cylinder(radius = 3, tag = line3) +/// cylinder(radius = 4, tag = line4) +/// ``` +@(impl = std_rust) +export fn segStart( + /// The line segment being queried by its tag. + @tag: tag, +): Point2d {} + +/// Compute the starting point of the provided line segment along the 'x' axis. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [20, 0], tag = $thing) +/// |> line(end = [0, 5]) +/// |> line(end = [20 - segStartX(thing), 0]) +/// |> line(end = [-20, 10]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn segStartX( + /// The line segment being queried by its tag. + @tag: tag, +): number(Length) {} + +/// Compute the starting point of the provided line segment along the 'y' axis. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [20, 0]) +/// |> line(end = [0, 3], tag = $thing) +/// |> line(end = [-10, 0]) +/// |> line(end = [0, 20-segStartY(thing)]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn segStartY( + /// The line segment being queried by its tag. + @tag: tag, +): number(Length) {} + +/// Extract the 'x' axis value of the last line segment in the provided 2-d sketch. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [5, 0]) +/// |> line(end = [20, 5]) +/// |> line(end = [lastSegX(%), 0]) +/// |> line(end = [-15, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn lastSegX( + /// The sketch whose line segment is being queried. + @sketch: Sketch, +): number(Length) {} + +/// Extract the 'y' axis value of the last line segment in the provided 2-d sketch. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [5, 0]) +/// |> line(end = [20, 5]) +/// |> line(end = [0, lastSegY(%)]) +/// |> line(end = [-15, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn lastSegY( + /// The sketch whose line segment is being queried. + @sketch: Sketch, +): number(Length) {} + +/// Compute the length of the provided line segment. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// tag = $thing, +/// ) +/// |> tangentialArc(angle = -120, radius = 5) +/// |> angledLine( +/// angle = -60, +/// length = segLen(thing), +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 5) +/// ``` +@(impl = std_rust) +export fn segLen( + /// The line segment being queried by its tag. + @tag: tag, +): number(Length) {} + +/// Compute the angle (in degrees) of the provided line segment. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> line(end = [5, 10], tag = $seg01) +/// |> line(end = [-10, 0]) +/// |> angledLine(angle = segAng(seg01), length = 10) +/// |> line(end = [-10, 0]) +/// |> angledLine(angle = segAng(seg01), length = -15) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 4) +/// ``` +@(impl = std_rust) +export fn segAng( + /// The line segment being queried by its tag. + @tag: tag, +): number(Angle) {} + +/// Returns the angle coming out of the end of the segment in degrees. +/// +/// ```kcl +/// // Horizontal pill. +/// pillSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [20, 0]) +/// |> tangentialArc(end = [0, 10], tag = $arc1) +/// |> angledLine( +/// angle = tangentToEnd(arc1), +/// length = 20, +/// ) +/// |> tangentialArc(end = [0, -10]) +/// |> close() +/// +/// pillExtrude = extrude(pillSketch, length = 10) +/// ``` +/// +/// ```kcl +/// // Vertical pill. Use absolute coordinate for arc. +/// pillSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [0, 20]) +/// |> tangentialArc(endAbsolute = [10, 20], tag = $arc1) +/// |> angledLine( +/// angle = tangentToEnd(arc1), +/// length = 20, +/// ) +/// |> tangentialArc(end = [-10, 0]) +/// |> close() +/// +/// pillExtrude = extrude(pillSketch, length = 10) +/// ``` +/// +/// ```kcl +/// rectangleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0], tag = $seg1) +/// |> angledLine( +/// angle = tangentToEnd(seg1), +/// length = 10, +/// ) +/// |> line(end = [0, 10]) +/// |> line(end = [-20, 0]) +/// |> close() +/// +/// rectangleExtrude = extrude(rectangleSketch, length = 10) +/// ``` +/// +/// ```kcl +/// bottom = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> arc( +/// endAbsolute = [10, 10], +/// interiorAbsolute = [5, 1], +/// tag = $arc1, +/// ) +/// |> angledLine(angle = tangentToEnd(arc1), length = 20) +/// |> close() +/// ``` +/// +/// ```kcl +/// circSketch = startSketchOn(XY) +/// |> circle(center = [0, 0], radius= 3, tag = $circ) +/// +/// triangleSketch = startSketchOn(XY) +/// |> startProfile(at = [-5, 0]) +/// |> angledLine(angle = tangentToEnd(circ), length = 10) +/// |> line(end = [-15, 0]) +/// |> close() +/// ``` +@(impl = std_rust) +export fn tangentToEnd( + /// The line segment being queried by its tag. + @tag: tag, +): number(Angle) {} + +/// Extract the provided 2-dimensional sketch's profile's origin value. +/// +/// ```kcl +/// sketch001 = startSketchOn(XY) +/// |> startProfile(at = [5, 2]) +/// |> angledLine(angle = 120, length = 50 , tag = $seg01) +/// |> angledLine(angle = segAng(seg01) + 120, length = 50 ) +/// |> line(end = profileStart(%)) +/// |> close() +/// |> extrude(length = 20) +/// ``` +@(impl = std_rust) +export fn profileStart( + /// Profile whose start is being used. + @profile: Sketch, +): Point2d {} + +/// Extract the provided 2-dimensional sketch's profile's origin's 'x' value. +/// +/// ```kcl +/// sketch001 = startSketchOn(XY) +/// |> startProfile(at = [5, 2]) +/// |> angledLine(angle = -26.6, length = 50) +/// |> angledLine(angle = 90, length = 50) +/// |> angledLine(angle = 30, endAbsoluteX = profileStartX(%)) +/// ``` +@(impl = std_rust) +export fn profileStartX( + /// Profile whose start is being used. + @profile: Sketch, +): number(Length) {} + +/// Extract the provided 2-dimensional sketch's profile's origin's 'y' value. +/// +/// ```kcl +/// sketch001 = startSketchOn(XY) +/// |> startProfile(at = [5, 2]) +/// |> angledLine(angle = -60, length = 14 ) +/// |> angledLine(angle = 30, endAbsoluteY = profileStartY(%)) +/// ``` +@(impl = std_rust) +export fn profileStartY( + /// Profile whose start is being used. + @profile: Sketch, +): number(Length) {} + +/// Extend the current sketch with a new involute circular curve. +/// +/// ```kcl +/// a = 10 +/// b = 14 +/// startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> involuteCircular(startRadius = a, endRadius = b, angle = 60) +/// |> involuteCircular(startRadius = a, endRadius = b, angle = 60, reverse = true) +/// ``` +@(impl = std_rust) +export fn involuteCircular( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// The involute is described between two circles, start_radius is the radius of the inner circle. + startRadius: number(Length), + /// The involute is described between two circles, end_radius is the radius of the outer circle. + endRadius: number(Length), + /// The angle to rotate the involute by. A value of zero will produce a curve with a tangent along the x-axis at the start point of the curve. + angle: number(Angle), + /// If reverse is true, the segment will start from the end of the involute, otherwise it will start from that start. + reverse?: bool = false, + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Extend the current sketch with a new straight line. +/// +/// ```kcl +/// triangle = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// // The END argument means it ends at exactly [10, 0]. +/// // This is an absolute measurement, it is NOT relative to +/// // the start of the sketch. +/// |> line(endAbsolute = [10, 0]) +/// |> line(endAbsolute = [0, 10]) +/// |> line(endAbsolute = [-10, 0], tag = $thirdLineOfTriangle) +/// |> close() +/// |> extrude(length = 5) +/// +/// box = startSketchOn(XZ) +/// |> startProfile(at = [10, 10]) +/// // The 'to' argument means move the pen this much. +/// // So, [10, 0] is a relative distance away from the current point. +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> line(end = [-10, 0], tag = $thirdLineOfBox) +/// |> close() +/// |> extrude(length = 5) +/// ``` +@(impl = std_rust) +export fn line( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// Which absolute point should this line go to? Incompatible with `end`. + endAbsolute?: Point2d, + /// How far away (along the X and Y axes) should this line go? Incompatible with `endAbsolute`. + @(includeInSnippet = true) + end?: Point2d, + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Draw a line relative to the current origin to a specified distance away +/// from the current position along the 'x' axis. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> xLine(length = 15) +/// |> angledLine( +/// angle = 80, +/// length = 15, +/// ) +/// |> line(end = [8, -10]) +/// |> xLine(length = 10) +/// |> angledLine( +/// angle = 120, +/// length = 30, +/// ) +/// |> xLine(length = -15) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn xLine( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// How far away along the X axis should this line go? Incompatible with `endAbsolute`. + @(includeInSnippet = true) + length?: number(Length), + /// Which absolute X value should this line go to? Incompatible with `length`. + endAbsolute?: number(Length), + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Draw a line relative to the current origin to a specified distance away +/// from the current position along the 'y' axis. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> yLine(length = 15) +/// |> angledLine( +/// angle = 30, +/// length = 15, +/// ) +/// |> line(end = [8, -10]) +/// |> yLine(length = -5) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn yLine( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// How far away along the Y axis should this line go? Incompatible with `endAbsolute`. + @(includeInSnippet = true) + length?: number(Length), + /// Which absolute Y value should this line go to? Incompatible with `length`. + endAbsolute?: number(Length), + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Draw a line segment relative to the current origin using the polar +/// measure of some angle and distance. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> yLine(endAbsolute = 15) +/// |> angledLine( +/// angle = 30, +/// length = 15, +/// ) +/// |> line(end = [8, -10]) +/// |> yLine(endAbsolute = 0) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn angledLine( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// Which angle should the line be drawn at? + angle: number(Angle), + /// Draw the line this distance along the given angle. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. + length?: number(Length), + /// Draw the line this distance along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. + lengthX?: number(Length), + /// Draw the line this distance along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. + lengthY?: number(Length), + /// Draw the line along the given angle until it reaches this point along the X axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. + endAbsoluteX?: number(Length), + /// Draw the line along the given angle until it reaches this point along the Y axis. Only one of `length`, `lengthX`, `lengthY`, `endAbsoluteX`, `endAbsoluteY` can be given. + endAbsoluteY?: number(Length), + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Draw an angled line from the current origin, constructing a line segment +/// such that the newly created line intersects the desired target line +/// segment. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(endAbsolute = [5, 10]) +/// |> line(endAbsolute = [-10, 10], tag = $lineToIntersect) +/// |> line(endAbsolute = [0, 20]) +/// |> angledLineThatIntersects( +/// angle = 80, +/// intersectTag = lineToIntersect, +/// offset = 10, +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn angledLineThatIntersects( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// Which angle should the line be drawn at? + angle: number(Angle), + /// The tag of the line to intersect with. + intersectTag: tag, + /// The offset from the intersecting line. + offset?: number(Length) = 0mm, + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Construct a line segment from the current origin back to the profile's +/// origin, ensuring the resulting 2-dimensional sketch is not open-ended. +/// +/// If you want to perform some 3-dimensional operation on a sketch, like +/// extrude or sweep, you must `close` it first. `close` must be called even +/// if the end point of the last segment is coincident with the sketch +/// starting point. +/// +/// ```kcl +/// startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 10]) +/// |> line(end = [10, 0]) +/// |> close() +/// |> extrude(length = 10) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(-XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> line(end = [0, 10]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn close( + /// The sketch you want to close. + @sketch: Sketch, + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Draw a curved line segment along an imaginary circle. +/// +/// The arc is constructed such that the current position of the sketch is +/// placed along an imaginary circle of the specified radius, at angleStart +/// degrees. The resulting arc is the segment of the imaginary circle from +/// that origin point to angleEnd, radius away from the center of the imaginary +/// circle. +/// +/// Unless this makes a lot of sense and feels like what you're looking +/// for to construct your shape, you're likely looking for tangentialArc. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [10, 0]) +/// |> arc( +/// angleStart = 0, +/// angleEnd = 280, +/// radius = 16 +/// ) +/// |> close() +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> arc( +/// endAbsolute = [10,0], +/// interiorAbsolute = [5,5] +/// ) +/// |> close() +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn arc( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// Where along the circle should this arc start? + @(includeInSnippet = true) + angleStart?: number(Angle), + /// Where along the circle should this arc end? + @(includeInSnippet = true) + angleEnd?: number(Angle), + /// How large should the circle be? Incompatible with `diameter`. + radius?: number(Length), + /// How large should the circle be? Incompatible with `radius`. + @(includeInSnippet = true) + diameter?: number(Length), + /// Any point between the arc's start and end? Requires `endAbsolute`. Incompatible with `angleStart` or `angleEnd`. + interiorAbsolute?: Point2d, + /// Where should this arc end? Requires `interiorAbsolute`. Incompatible with `angleStart` or `angleEnd`. + endAbsolute?: Point2d, + /// Create a new tag which refers to this arc. + tag?: tag, +): Sketch {} + +/// Starting at the current sketch's origin, draw a curved line segment along +/// some part of an imaginary circle until it reaches the desired (x, y) +/// coordinates. +/// +/// When using radius and angle, draw a curved line segment along part of an +/// imaginary circle. The arc is constructed such that the last line segment is +/// placed tangent to the imaginary circle of the specified radius. The +/// resulting arc is the segment of the imaginary circle from that tangent point +/// for 'angle' degrees along the imaginary circle. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> angledLine( +/// angle = 45, +/// length = 10, +/// ) +/// |> tangentialArc(end = [0, -10]) +/// |> line(end = [-10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> tangentialArc(endAbsolute = [15, 15]) +/// |> line(end = [10, -15]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```kcl +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> angledLine( +/// angle = 60, +/// length = 10, +/// ) +/// |> tangentialArc(radius = 10, angle = -120) +/// |> angledLine( +/// angle = -60, +/// length = 10, +/// ) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +@(impl = std_rust) +export fn tangentialArc( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// Which absolute point should this arc go to? Incompatible with `end`, `radius`, and `offset`. + endAbsolute?: Point2d, + /// How far away (along the X and Y axes) should this arc go? Incompatible with `endAbsolute`, `radius`, and `offset`. + @(includeInSnippet = true) + end?: Point2d, + /// Radius of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute` and `diameter`. + radius?: number(Length), + /// Diameter of the imaginary circle. `angle` must be given. Incompatible with `end` and `endAbsolute` and `radius`. + diameter?: number(Length), + /// Offset of the arc. `radius` must be given. Incompatible with `end` and `endAbsolute`. + angle?: number(Angle), + /// Create a new tag which refers to this arc. + tag?: tag, +): Sketch {} + +/// Draw a smooth, continuous, curved line segment from the current origin to +/// the desired (x, y), using a number of control points to shape the curve's +/// shape. +/// +/// ```kcl +/// // Example using relative control points. +/// exampleSketch = startSketchOn(XZ) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [0, 10]) +/// |> bezierCurve( +/// control1 = [5, 0], +/// control2 = [5, 10], +/// end = [10, 10], +/// ) +/// |> line(endAbsolute = [10, 0]) +/// |> close() +/// +/// example = extrude(exampleSketch, length = 10) +/// ``` +/// +/// ```kcl +/// // Example using absolute control points. +/// startSketchOn(XY) +/// |> startProfile(at = [300, 300]) +/// |> bezierCurve(control1Absolute = [600, 300], control2Absolute = [-300, -100], endAbsolute = [600, 600]) +/// |> close() +/// |> extrude(length = 10) +/// ``` +@(impl = std_rust) +export fn bezierCurve( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// First control point for the cubic. + control1?: Point2d, + /// Second control point for the cubic. + control2?: Point2d, + /// How far away (along the X and Y axes) should this line go? + end?: Point2d, + /// First control point for the cubic. Absolute point. + control1Absolute?: Point2d, + /// Second control point for the cubic. Absolute point. + control2Absolute?: Point2d, + /// Coordinate on the plane at which this line should end. + endAbsolute?: Point2d, + /// Create a new tag which refers to this line. + tag?: tag, +): Sketch {} + +/// Use a 2-dimensional sketch to cut a hole in another 2-dimensional sketch. +/// +/// ```kcl +/// exampleSketch = startSketchOn(XY) +/// |> startProfile(at = [0, 0]) +/// |> line(end = [0, 5]) +/// |> line(end = [5, 0]) +/// |> line(end = [0, -5]) +/// |> close() +/// |> subtract2d(tool =circle( center = [1, 1], radius = .25 )) +/// |> subtract2d(tool =circle( center = [1, 4], radius = .25 )) +/// +/// example = extrude(exampleSketch, length = 1) +/// ``` +/// +/// ```kcl +/// fn squareHoleSketch() { +/// squareSketch = startSketchOn(-XZ) +/// |> startProfile(at = [-1, -1]) +/// |> line(end = [2, 0]) +/// |> line(end = [0, 2]) +/// |> line(end = [-2, 0]) +/// |> close() +/// return squareSketch +/// } +/// +/// exampleSketch = startSketchOn(-XZ) +/// |> circle( center = [0, 0], radius = 3 ) +/// |> subtract2d(tool = squareHoleSketch()) +/// example = extrude(exampleSketch, length = 1) +/// ``` +@(impl = std_rust) +export fn subtract2d( + /// Which sketch should this path be added to? + @sketch: Sketch, + /// The shape(s) which should be cut out of the sketch. + tool: [Sketch; 1+], +): Sketch {} diff --git a/rust/kcl-lib/std/transform.kcl b/rust/kcl-lib/std/transform.kcl index defe378f9..d42187ebd 100644 --- a/rust/kcl-lib/std/transform.kcl +++ b/rust/kcl-lib/std/transform.kcl @@ -3,6 +3,8 @@ @no_std @settings(defaultLengthUnit = mm, kclVersion = 1.0) +import Axis3d from "std::types" + /// Mirror a sketch. /// /// Mirror occurs around a local sketch axis rather than a global axis. @@ -90,3 +92,510 @@ export fn mirror2d( /// The axis to reflect around. axis: Axis2d | Edge, ): Sketch {} + +/// Move a solid or a sketch. +/// +/// This is really useful for assembling parts together. You can create a part +/// and then move it to the correct location. +/// +/// Translate is really useful for sketches if you want to move a sketch +/// and then rotate it using the `rotate` function to create a loft. +/// +/// ```kcl +/// // Move a pipe. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// |> translate( +/// x = 1.0, +/// y = 1.0, +/// z = 2.5, +/// ) +/// ``` +/// +/// ```kcl +/// // Move an imported model. +/// +/// import "tests/inputs/cube.sldprt" as cube +/// +/// // Circle so you actually see the move. +/// startSketchOn(XY) +/// |> circle( +/// center = [-10, -10], +/// radius = 10, +/// ) +/// |> extrude( +/// length = 10, +/// ) +/// +/// cube +/// |> translate( +/// x = 10.0, +/// y = 10.0, +/// z = 2.5, +/// ) +/// ``` +/// +/// ```kcl +/// // Sweep two sketches along the same path. +/// +/// sketch001 = startSketchOn(XY) +/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) +/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001) - 90, +/// length = 50.61, +/// ) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001), +/// length = -segLen(rectangleSegmentA001), +/// ) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) +/// +/// sketch002 = startSketchOn(YZ) +/// sweepPath = startProfile(sketch002, at = [0, 0]) +/// |> yLine(length = 231.81) +/// |> tangentialArc(radius = 80, angle = -90) +/// |> xLine(length = 384.93) +/// +/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) +/// +/// // Move the sweeps. +/// translate(parts, x = 1.0, y = 1.0, z = 2.5) +/// ``` +/// +/// ```kcl +/// // Move a sketch. +/// +/// fn square(@length){ +/// l = length / 2 +/// p0 = [-l, -l] +/// p1 = [-l, l] +/// p2 = [l, l] +/// p3 = [l, -l] +/// +/// return startSketchOn(XY) +/// |> startProfile(at = p0) +/// |> line(endAbsolute = p1) +/// |> line(endAbsolute = p2) +/// |> line(endAbsolute = p3) +/// |> close() +/// } +/// +/// square(10) +/// |> translate( +/// x = 5, +/// y = 5, +/// ) +/// |> extrude( +/// length = 10, +/// ) +/// ``` +/// +/// ```kcl +/// // Translate and rotate a sketch to create a loft. +/// sketch001 = startSketchOn(XY) +/// +/// fn square() { +/// return startProfile(sketch001, at = [-10, 10]) +/// |> xLine(length = 20) +/// |> yLine(length = -20) +/// |> xLine(length = -20) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// } +/// +/// profile001 = square() +/// +/// profile002 = square() +/// |> translate(z = 20) +/// |> rotate(axis = [0, 0, 1.0], angle = 45) +/// +/// loft([profile001, profile002]) +/// ``` +@(impl = std_rust) +export fn translate( + /// The solid, sketch, or set of solids or sketches to move. + @objects: [Solid; 1+] | [Sketch; 1+] | ImportedGeometry, + /// The amount to move the solid or sketch along the x axis. + @(includeInSnippet = true) + x?: number(Length) = 0, + /// The amount to move the solid or sketch along the y axis. + @(includeInSnippet = true) + y?: number(Length) = 0, + /// The amount to move the solid or sketch along the z axis. + @(includeInSnippet = true) + z?: number(Length) = 0, + /// If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. + global?: bool = false, +): [Solid; 1+] | [Sketch; 1+] | ImportedGeometry {} + +/// Rotate a solid or a sketch. +/// +/// This is really useful for assembling parts together. You can create a part +/// and then rotate it to the correct orientation. +/// +/// For sketches, you can use this to rotate a sketch and then loft it with another sketch. +/// +/// ### Using Roll, Pitch, and Yaw +/// +/// When rotating a part in 3D space, "roll," "pitch," and "yaw" refer to the +/// three rotational axes used to describe its orientation: roll is rotation +/// around the longitudinal axis (front-to-back), pitch is rotation around the +/// lateral axis (wing-to-wing), and yaw is rotation around the vertical axis +/// (up-down); essentially, it's like tilting the part on its side (roll), +/// tipping the nose up or down (pitch), and turning it left or right (yaw). +/// +/// So, in the context of a 3D model: +/// +/// - **Roll**: Imagine spinning a pencil on its tip - that's a roll movement. +/// +/// - **Pitch**: Think of a seesaw motion, where the object tilts up or down along its side axis. +/// +/// - **Yaw**: Like turning your head left or right, this is a rotation around the vertical axis +/// +/// ### Using an Axis and Angle +/// +/// When rotating a part around an axis, you specify the axis of rotation and the angle of +/// rotation. +/// +/// ```kcl +/// // Rotate a pipe with roll, pitch, and yaw. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// |> rotate( +/// roll = 10, +/// pitch = 10, +/// yaw = 90, +/// ) +/// ``` +/// +/// ```kcl +/// // Rotate a pipe with just roll. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// |> rotate( +/// roll = 10, +/// ) +/// ``` +/// +/// ```kcl +/// // Rotate a pipe about a named axis with an angle. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// |> rotate( +/// axis = Z, +/// angle = 90, +/// ) +/// ``` +/// +/// ```kcl +/// // Rotate an imported model. +/// +/// import "tests/inputs/cube.sldprt" as cube +/// +/// cube +/// |> rotate( +/// axis = [0, 0, 1.0], +/// angle = 9, +/// ) +/// ``` +/// +/// ```kcl +/// // Rotate a pipe about a raw axis with an angle. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// |> rotate( +/// axis = [0, 0, 1.0], +/// angle = 90, +/// ) +/// ``` +/// +/// ```kcl +/// // Sweep two sketches along the same path. +/// +/// sketch001 = startSketchOn(XY) +/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) +/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001) - 90, +/// length = 50.61, +/// ) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001), +/// length = -segLen(rectangleSegmentA001), +/// ) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) +/// +/// sketch002 = startSketchOn(YZ) +/// sweepPath = startProfile(sketch002, at = [0, 0]) +/// |> yLine(length = 231.81) +/// |> tangentialArc(radius = 80, angle = -90) +/// |> xLine(length = 384.93) +/// +/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) +/// +/// // Rotate the sweeps. +/// rotate(parts, axis = [0, 0, 1.0], angle = 90) +/// ``` +/// +/// ```kcl +/// // Translate and rotate a sketch to create a loft. +/// sketch001 = startSketchOn(XY) +/// +/// fn square() { +/// return startProfile(sketch001, at = [-10, 10]) +/// |> xLine(length = 20) +/// |> yLine(length = -20) +/// |> xLine(length = -20) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// } +/// +/// profile001 = square() +/// +/// profile002 = square() +/// |> translate(x = 0, y = 0, z = 20) +/// |> rotate(axis = [0, 0, 1.0], angle = 45) +/// +/// loft([profile001, profile002]) +/// ``` +@(impl = std_rust) +export fn rotate( + /// The solid, sketch, or set of solids or sketches to rotate. + @objects: [Solid; 1+] | [Sketch; 1+] | ImportedGeometry, + /// The roll angle. Must be between -360deg and 360deg. + @(includeInSnippet = true) + roll?: number(Angle), + /// The pitch angle. Must be between -360deg and 360deg. + @(includeInSnippet = true) + pitch?: number(Angle), + /// The yaw angle. Must be between -360deg and 360deg. + @(includeInSnippet = true) + yaw?: number(Angle), + /// The axis to rotate around. Must be used with `angle`. + axis?: Axis3d | Point3d, + /// The angle to rotate. Must be used with `axis`. Must be between -360deg and 360deg. + angle?: number(Angle), + /// If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. + global?: bool = false, +): [Solid; 1+] | [Sketch; 1+] | ImportedGeometry {} + +/// Scale a solid or a sketch. +/// +/// This is really useful for resizing parts. You can create a part and then scale it to the +/// correct size. +/// +/// For sketches, you can use this to scale a sketch and then loft it with another sketch. +/// +/// By default the transform is applied in local sketch axis, therefore the origin will not move. +/// +/// If you want to apply the transform in global space, set `global` to `true`. The origin of the +/// model will move. If the model is not centered on origin and you scale globally it will +/// look like the model moves and gets bigger at the same time. Say you have a square +/// `(1,1) - (1,2) - (2,2) - (2,1)` and you scale by 2 globally it will become +/// `(2,2) - (2,4)`...etc so the origin has moved from `(1.5, 1.5)` to `(2,2)`. +/// +/// ```kcl +/// // Scale a pipe. +/// +/// // Create a path for the sweep. +/// sweepPath = startSketchOn(XZ) +/// |> startProfile(at = [0.05, 0.05]) +/// |> line(end = [0, 7]) +/// |> tangentialArc(angle = 90, radius = 5) +/// |> line(end = [-3, 0]) +/// |> tangentialArc(angle = -90, radius = 5) +/// |> line(end = [0, 7]) +/// +/// // Create a hole for the pipe. +/// pipeHole = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 1.5, +/// ) +/// +/// sweepSketch = startSketchOn(XY) +/// |> circle( +/// center = [0, 0], +/// radius = 2, +/// ) +/// |> subtract2d(tool = pipeHole) +/// |> sweep(path = sweepPath) +/// |> scale( +/// z = 2.5, +/// ) +/// ``` +/// +/// ```kcl +/// // Scale an imported model. +/// +/// import "tests/inputs/cube.sldprt" as cube +/// +/// cube +/// |> scale( +/// y = 2.5, +/// ) +/// ``` +/// +/// ```kcl +/// // Sweep two sketches along the same path. +/// +/// sketch001 = startSketchOn(XY) +/// rectangleSketch = startProfile(sketch001, at = [-200, 23.86]) +/// |> angledLine(angle = 0, length = 73.47, tag = $rectangleSegmentA001) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001) - 90, +/// length = 50.61, +/// ) +/// |> angledLine( +/// angle = segAng(rectangleSegmentA001), +/// length = -segLen(rectangleSegmentA001), +/// ) +/// |> line(endAbsolute = [profileStartX(%), profileStartY(%)]) +/// |> close() +/// +/// circleSketch = circle(sketch001, center = [200, -30.29], radius = 32.63) +/// +/// sketch002 = startSketchOn(YZ) +/// sweepPath = startProfile(sketch002, at = [0, 0]) +/// |> yLine(length = 231.81) +/// |> tangentialArc(radius = 80, angle = -90) +/// |> xLine(length = 384.93) +/// +/// parts = sweep([rectangleSketch, circleSketch], path = sweepPath) +/// +/// // Scale the sweep. +/// scale(parts, z = 0.5) +/// ``` +@(impl = std_rust) +export fn scale( + /// The solid, sketch, or set of solids or sketches to scale. + @objects: [Solid; 1+] | [Sketch; 1+] | ImportedGeometry, + /// The scale factor for the x axis. + @(includeInSnippet = true) + x?: number(Count) = 1, + /// The scale factor for the y axis. + @(includeInSnippet = true) + y?: number(Count) = 1, + /// The scale factor for the z axis. + @(includeInSnippet = true) + z?: number(Count) = 1, + /// If true, the transform is applied in global space. The origin of the model will move. By default, the transform is applied in local sketch axis, therefore the origin will not move. + global?: bool = false, +): [Solid; 1+] | [Sketch; 1+] | ImportedGeometry {} diff --git a/rust/kcl-lib/tests/ascription_unknown_type/artifact_commands.snap b/rust/kcl-lib/tests/ascription_unknown_type/artifact_commands.snap new file mode 100644 index 000000000..2e21d5a35 --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/artifact_commands.snap @@ -0,0 +1,32 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands ascription_unknown_type.kcl +--- +[ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + } +] diff --git a/rust/kcl-lib/tests/ascription_unknown_type/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/ascription_unknown_type/artifact_graph_flowchart.snap new file mode 100644 index 000000000..4f98534a2 --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart ascription_unknown_type.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/ascription_unknown_type/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/ascription_unknown_type/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..13e533509 --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/rust/kcl-lib/tests/ascription_unknown_type/ast.snap b/rust/kcl-lib/tests/ascription_unknown_type/ast.snap new file mode 100644 index 000000000..b4f269361 --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/ast.snap @@ -0,0 +1,67 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing ascription_unknown_type.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "expr": { + "commentStart": 0, + "end": 0, + "raw": "10", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 10.0, + "suffix": "None" + } + }, + "start": 0, + "ty": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "NotARealType", + "start": 0, + "type": "Identifier" + }, + "p_type": "Named", + "start": 0, + "type": "Primitive" + }, + "type": "AscribedExpression", + "type": "AscribedExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "commentStart": 0, + "end": 0, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/ascription_unknown_type/execution_error.snap b/rust/kcl-lib/tests/ascription_unknown_type/execution_error.snap new file mode 100644 index 000000000..88ff3370e --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/execution_error.snap @@ -0,0 +1,12 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Error from executing ascription_unknown_type.kcl +--- +KCL Semantic error + + × semantic: Unknown type: NotARealType + ╭──── + 1 │ z = 10: NotARealType + · ─┬ + · ╰── tests/ascription_unknown_type/input.kcl + ╰──── diff --git a/rust/kcl-lib/tests/ascription_unknown_type/input.kcl b/rust/kcl-lib/tests/ascription_unknown_type/input.kcl new file mode 100644 index 000000000..5f4f8b4fa --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/input.kcl @@ -0,0 +1 @@ +z = 10: NotARealType diff --git a/rust/kcl-lib/tests/ascription_unknown_type/ops.snap b/rust/kcl-lib/tests/ascription_unknown_type/ops.snap new file mode 100644 index 000000000..408fd7a1d --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed ascription_unknown_type.kcl +--- +[] diff --git a/rust/kcl-lib/tests/ascription_unknown_type/unparsed.snap b/rust/kcl-lib/tests/ascription_unknown_type/unparsed.snap new file mode 100644 index 000000000..708360a3a --- /dev/null +++ b/rust/kcl-lib/tests/ascription_unknown_type/unparsed.snap @@ -0,0 +1,5 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of unparsing ascription_unknown_type.kcl +--- +z = 10: NotARealType diff --git a/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/execution_error.snap b/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/execution_error.snap index 8d65a0671..d3def6268 100644 --- a/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/execution_error.snap +++ b/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/execution_error.snap @@ -4,13 +4,14 @@ description: Error from executing error_inside_fn_also_has_source_range_of_call_ --- KCL Semantic error - × semantic: This function expected the input argument to be Solid or Plane - │ but it's actually of type string - ╭─[3:23] + × semantic: The input argument of `startSketchOn` requires a value with type + │ `Solid | Plane`, but found string + ╭─[3:9] 2 │ fn someNestedFunction(@something2) { 3 │ startSketchOn(something2) - · ─────┬──── - · ╰── tests/error_inside_fn_also_has_source_range_of_call_site_recursive/input.kcl + · ────────────┬────────────┬ + · │ ╰── tests/error_inside_fn_also_has_source_range_of_call_site_recursive/input.kcl + · ╰── tests/error_inside_fn_also_has_source_range_of_call_site_recursive/input.kcl 4 │ } 5 │ 6 │ someNestedFunction(something) @@ -24,8 +25,8 @@ KCL Semantic error ╰──── ├─▶ KCL Semantic error │ - │ × semantic: This function expected the input argument to be Solid or - │ │ Plane but it's actually of type string + │ × semantic: The input argument of `startSketchOn` requires a value + │ │ with type `Solid | Plane`, but found string │ ╭─[3:23] │ 2 │ fn someNestedFunction(@something2) { │ 3 │ startSketchOn(something2) @@ -34,10 +35,22 @@ KCL Semantic error │ error_inside_fn_also_has_source_range_of_call_site_recursive/input.kcl │ 4 │ } │ ╰──── + ├─▶ KCL Semantic error + │ + │ × semantic: The input argument of `startSketchOn` requires a value + │ │ with type `Solid | Plane`, but found string + │ ╭─[3:9] + │ 2 │ fn someNestedFunction(@something2) { + │ 3 │ startSketchOn(something2) + │ · ────────────┬──────────── + │ · ╰── tests/ + │ error_inside_fn_also_has_source_range_of_call_site_recursive/input.kcl + │ 4 │ } + │ ╰──── ╰─▶ KCL Semantic error - × semantic: This function expected the input argument to be Solid or - │ Plane but it's actually of type string + × semantic: The input argument of `startSketchOn` requires a value + │ with type `Solid | Plane`, but found string ╭─[6:5] 5 │ 6 │ someNestedFunction(something) diff --git a/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/ops.snap b/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/ops.snap index bea869654..8276ab322 100644 --- a/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/ops.snap +++ b/rust/kcl-lib/tests/error_inside_fn_also_has_source_range_of_call_site_recursive/ops.snap @@ -3,20 +3,6 @@ source: kcl-lib/src/simulation_tests.rs description: Operations executed error_inside_fn_also_has_source_range_of_call_site_recursive.kcl --- [ - { - "type": "StdLibCall", - "name": "startSketchOn", - "unlabeledArg": { - "value": { - "type": "String", - "value": "INVALID" - }, - "sourceRange": [] - }, - "labeledArgs": {}, - "sourceRange": [], - "isError": true - }, { "type": "GroupBegin", "group": { diff --git a/rust/kcl-lib/tests/execute_engine_error_return/execution_error.snap b/rust/kcl-lib/tests/execute_engine_error_return/execution_error.snap index a70bb45e2..aec2c3c28 100644 --- a/rust/kcl-lib/tests/execute_engine_error_return/execution_error.snap +++ b/rust/kcl-lib/tests/execute_engine_error_return/execution_error.snap @@ -9,6 +9,17 @@ KCL Engine error ╭─[7:6] 6 │ |> line(end = [-11.53311, 2.81559]) 7 │ |> extrude(length = 4) - · ─────────┬───────── + · ─────────┬─────────┬ + · ╰── tests/execute_engine_error_return/input.kcl · ╰── tests/execute_engine_error_return/input.kcl ╰──── + ╰─▶ KCL Engine error + + × engine: The path is not closed. Solid2D construction requires a + │ closed path! + ╭─[7:6] + 6 │ |> line(end = [-11.53311, 2.81559]) + 7 │ |> extrude(length = 4) + · ─────────┬───────── + · ╰── tests/execute_engine_error_return/input.kcl + ╰──── diff --git a/rust/kcl-lib/tests/import_async/ops.snap b/rust/kcl-lib/tests/import_async/ops.snap index e6bcaf2c2..4926fd474 100644 --- a/rust/kcl-lib/tests/import_async/ops.snap +++ b/rust/kcl-lib/tests/import_async/ops.snap @@ -797,6 +797,36 @@ description: Operations executed import_async.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "y": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" }, diff --git a/rust/kcl-lib/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md index 72838cbf6..149b89f3e 100644 --- a/rust/kcl-lib/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/import_function_not_sketch/artifact_graph_flowchart.snap.md @@ -37,6 +37,7 @@ flowchart LR 25["SweepEdge Adjacent"] 26["SweepEdge Adjacent"] 27["SweepEdge Adjacent"] + 28["SweepEdge Adjacent"] 1 --- 2 2 --- 3 2 --- 4 @@ -50,28 +51,28 @@ flowchart LR 2 ---- 12 12 <--x 3 3 --- 16 - 3 x--> 21 + 3 --- 21 12 <--x 4 4 --- 15 - 4 --- 21 + 4 --- 22 12 <--x 5 5 --- 13 - 5 --- 22 + 5 --- 23 12 <--x 6 6 --- 20 - 6 --- 23 + 6 --- 24 12 <--x 7 7 --- 17 - 7 --- 24 + 7 --- 25 12 <--x 8 8 --- 19 - 8 --- 25 + 8 --- 26 12 <--x 9 9 --- 14 - 9 --- 26 + 9 --- 27 12 <--x 10 10 --- 18 - 10 --- 27 + 10 --- 28 12 --- 13 12 --- 14 12 --- 15 @@ -87,18 +88,21 @@ flowchart LR 12 --- 25 12 --- 26 12 --- 27 - 13 --- 22 - 25 <--x 14 - 14 --- 26 - 15 --- 21 + 12 --- 28 + 22 <--x 13 + 13 --- 23 + 26 <--x 14 + 14 --- 27 + 21 <--x 15 + 15 --- 22 16 --- 21 - 27 <--x 16 - 23 <--x 17 - 17 --- 24 - 26 <--x 18 - 18 --- 27 - 24 <--x 19 - 19 --- 25 - 22 <--x 20 - 20 --- 23 + 28 <--x 16 + 24 <--x 17 + 17 --- 25 + 27 <--x 18 + 18 --- 28 + 25 <--x 19 + 19 --- 26 + 23 <--x 20 + 20 --- 24 ``` diff --git a/rust/kcl-lib/tests/import_mesh_clone/ops.snap b/rust/kcl-lib/tests/import_mesh_clone/ops.snap index 44263293e..1197e3295 100644 --- a/rust/kcl-lib/tests/import_mesh_clone/ops.snap +++ b/rust/kcl-lib/tests/import_mesh_clone/ops.snap @@ -14,7 +14,7 @@ description: Operations executed import_mesh_clone.kcl }, { "type": "StdLibCall", - "name": "clone", + "name": "translate", "unlabeledArg": { "value": { "type": "ImportedGeometry", @@ -22,7 +22,40 @@ description: Operations executed import_mesh_clone.kcl }, "sourceRange": [] }, - "labeledArgs": {}, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -2000.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -2000.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, "sourceRange": [] }, { @@ -38,6 +71,36 @@ description: Operations executed import_mesh_clone.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 4000.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "clone", @@ -51,6 +114,79 @@ description: Operations executed import_mesh_clone.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "y": { + "value": { + "type": "Number", + "value": 4000.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "clone", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "y": { + "value": { + "type": "Number", + "value": 4000.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/import_transform/ops.snap b/rust/kcl-lib/tests/import_transform/ops.snap index 0f69d42aa..488e3b4ef 100644 --- a/rust/kcl-lib/tests/import_transform/ops.snap +++ b/rust/kcl-lib/tests/import_transform/ops.snap @@ -12,6 +12,177 @@ description: Operations executed import_transform.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "scale", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/import_whole_simple/ops.snap b/rust/kcl-lib/tests/import_whole_simple/ops.snap index 92fc071fa..8d0c98646 100644 --- a/rust/kcl-lib/tests/import_whole_simple/ops.snap +++ b/rust/kcl-lib/tests/import_whole_simple/ops.snap @@ -12,6 +12,38 @@ description: Operations executed import_whole_simple.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/import_whole_transitive_import/ops.snap b/rust/kcl-lib/tests/import_whole_transitive_import/ops.snap index db19887a2..98a4323a7 100644 --- a/rust/kcl-lib/tests/import_whole_transitive_import/ops.snap +++ b/rust/kcl-lib/tests/import_whole_transitive_import/ops.snap @@ -12,6 +12,38 @@ description: Operations executed import_whole_transitive_import.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/intersect_cubes/ops.snap b/rust/kcl-lib/tests/intersect_cubes/ops.snap index 853dfe5c8..19166f623 100644 --- a/rust/kcl-lib/tests/intersect_cubes/ops.snap +++ b/rust/kcl-lib/tests/intersect_cubes/ops.snap @@ -217,6 +217,38 @@ description: Operations executed intersect_cubes.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "intersect", diff --git a/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md index 6bf518504..36b632ebb 100644 --- a/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/axial-fan/artifact_graph_flowchart.snap.md @@ -369,8 +369,9 @@ flowchart LR 264["SweepEdge Adjacent"] 265["SweepEdge Adjacent"] 266["SweepEdge Adjacent"] - 267["EdgeCut Fillet
[5131, 5642, 1]"] - 268["EdgeCut Fillet
[412, 470, 3]"] + 267["SweepEdge Adjacent"] + 268["EdgeCut Fillet
[5131, 5642, 1]"] + 269["EdgeCut Fillet
[412, 470, 3]"] 1 --- 8 1 --- 9 1 --- 10 @@ -518,155 +519,155 @@ flowchart LR 41 --- 158 41 x--> 184 41 --- 196 - 41 --- 240 + 41 --- 241 42 --- 151 42 x--> 184 42 --- 197 - 42 --- 241 + 42 --- 242 43 --- 157 43 x--> 184 43 --- 198 - 43 --- 242 + 43 --- 243 44 --- 155 44 x--> 184 44 --- 199 - 44 --- 243 + 44 --- 244 45 --- 156 45 x--> 184 45 --- 200 - 45 --- 244 + 45 --- 245 46 --- 154 46 x--> 184 46 --- 201 - 46 --- 245 + 46 --- 246 47 --- 152 47 x--> 184 47 --- 202 - 47 --- 246 + 47 --- 247 48 --- 153 48 x--> 184 48 --- 203 - 48 --- 247 + 48 --- 248 50 --- 163 50 x--> 184 50 --- 204 - 50 --- 248 + 50 --- 249 51 --- 161 51 x--> 184 51 --- 205 - 51 --- 249 + 51 --- 250 52 --- 159 52 x--> 184 52 --- 206 - 52 --- 250 + 52 --- 251 53 --- 166 53 x--> 184 53 --- 207 - 53 --- 251 + 53 --- 252 54 --- 164 54 x--> 184 54 --- 208 - 54 --- 252 + 54 --- 253 55 --- 165 55 x--> 184 55 --- 209 - 55 --- 253 + 55 --- 254 56 --- 160 56 x--> 184 56 --- 210 - 56 --- 254 + 56 --- 255 57 --- 162 57 x--> 184 57 --- 211 - 57 --- 255 + 57 --- 256 58 --- 177 58 x--> 185 58 --- 222 - 58 --- 266 + 58 --- 267 59 --- 172 59 x--> 180 59 --- 216 - 59 --- 260 + 59 --- 261 60 --- 171 60 x--> 180 60 --- 217 - 60 --- 261 + 60 --- 262 61 --- 174 61 x--> 180 61 --- 218 - 61 --- 262 + 61 --- 263 62 --- 173 62 x--> 180 62 --- 219 - 62 --- 263 + 62 --- 264 69 --- 150 69 x--> 184 69 --- 195 - 69 --- 239 + 69 --- 240 70 --- 176 70 x--> 183 70 --- 221 - 70 --- 265 + 70 --- 266 71 --- 175 71 x--> 178 71 --- 220 - 71 --- 264 + 71 --- 265 72 --- 149 72 x--> 181 72 --- 194 - 72 --- 238 + 72 --- 239 131 <--x 73 73 --- 141 - 73 x--> 227 + 73 --- 227 131 <--x 74 74 --- 137 - 74 --- 227 + 74 --- 228 131 <--x 75 75 --- 145 - 75 --- 228 + 75 --- 229 131 <--x 76 76 --- 139 - 76 --- 229 + 76 --- 230 131 <--x 77 77 --- 146 - 77 --- 230 + 77 --- 231 131 <--x 78 78 --- 138 - 78 --- 231 + 78 --- 232 131 <--x 79 79 --- 147 - 79 --- 232 + 79 --- 233 131 <--x 80 80 --- 148 - 80 --- 233 + 80 --- 234 131 <--x 81 81 --- 140 - 81 --- 234 + 81 --- 235 131 <--x 82 82 --- 143 - 82 --- 235 + 82 --- 236 131 <--x 83 83 --- 142 - 83 --- 236 + 83 --- 237 131 <--x 84 84 --- 144 - 84 --- 237 + 84 --- 238 86 --- 168 - 86 x--> 189 + 86 x--> 188 86 --- 212 - 86 --- 256 + 86 --- 257 88 --- 169 - 88 x--> 189 + 88 x--> 188 88 --- 213 - 88 --- 257 + 88 --- 258 90 --- 167 - 90 x--> 189 + 90 x--> 188 90 --- 214 - 90 --- 258 + 90 --- 259 92 --- 170 - 92 x--> 189 + 92 x--> 188 92 --- 215 - 92 --- 259 + 92 --- 260 119 --- 133 119 --- 134 119 --- 135 @@ -697,7 +698,6 @@ flowchart LR 122 --- 201 122 --- 202 122 --- 203 - 122 --- 240 122 --- 241 122 --- 242 122 --- 243 @@ -705,6 +705,7 @@ flowchart LR 122 --- 245 122 --- 246 122 --- 247 + 122 --- 248 124 --- 159 124 --- 160 124 --- 161 @@ -722,7 +723,6 @@ flowchart LR 124 --- 209 124 --- 210 124 --- 211 - 124 --- 248 124 --- 249 124 --- 250 124 --- 251 @@ -730,9 +730,10 @@ flowchart LR 124 --- 253 124 --- 254 124 --- 255 + 124 --- 256 125 --- 177 125 --- 222 - 125 --- 266 + 125 --- 267 126 --- 171 126 --- 172 126 --- 173 @@ -743,27 +744,27 @@ flowchart LR 126 --- 217 126 --- 218 126 --- 219 - 126 --- 260 126 --- 261 126 --- 262 126 --- 263 + 126 --- 264 127 --- 150 127 --- 183 127 --- 195 - 127 --- 239 + 127 --- 240 128 --- 176 128 --- 221 - 128 --- 265 + 128 --- 266 129 --- 175 129 --- 178 129 --- 182 129 --- 220 - 129 --- 264 + 129 --- 265 130 --- 149 130 --- 181 130 --- 187 130 --- 194 - 130 --- 238 + 130 --- 239 131 --- 137 131 --- 138 131 --- 139 @@ -787,6 +788,7 @@ flowchart LR 131 --- 235 131 --- 236 131 --- 237 + 131 --- 238 132 --- 167 132 --- 168 132 --- 169 @@ -797,10 +799,10 @@ flowchart LR 132 --- 213 132 --- 214 132 --- 215 - 132 --- 256 132 --- 257 132 --- 258 132 --- 259 + 132 --- 260 133 --- 192 224 <--x 133 133 --- 225 @@ -813,110 +815,112 @@ flowchart LR 136 --- 193 225 <--x 136 136 --- 226 - 137 --- 227 - 230 <--x 138 - 138 --- 231 - 228 <--x 139 - 139 --- 229 - 233 <--x 140 - 140 --- 234 + 227 <--x 137 + 137 --- 228 + 231 <--x 138 + 138 --- 232 + 229 <--x 139 + 139 --- 230 + 234 <--x 140 + 140 --- 235 141 --- 227 - 237 <--x 141 - 235 <--x 142 - 142 --- 236 - 234 <--x 143 - 143 --- 235 - 236 <--x 144 - 144 --- 237 - 145 --- 228 - 229 <--x 146 - 146 --- 230 - 231 <--x 147 - 147 --- 232 - 232 <--x 148 - 148 --- 233 + 238 <--x 141 + 236 <--x 142 + 142 --- 237 + 235 <--x 143 + 143 --- 236 + 237 <--x 144 + 144 --- 238 + 228 <--x 145 + 145 --- 229 + 230 <--x 146 + 146 --- 231 + 232 <--x 147 + 147 --- 233 + 233 <--x 148 + 148 --- 234 149 --- 194 - 149 --- 238 + 149 --- 239 150 --- 195 - 150 --- 239 + 150 --- 240 151 --- 197 - 151 --- 241 - 242 <--x 151 + 241 <--x 151 + 151 --- 242 152 --- 202 - 152 --- 246 - 247 <--x 152 + 246 <--x 152 + 152 --- 247 153 --- 203 - 240 <--x 153 - 153 --- 247 + 247 <--x 153 + 153 --- 248 154 --- 201 - 154 --- 245 - 246 <--x 154 + 245 <--x 154 + 154 --- 246 155 --- 199 - 155 --- 243 - 244 <--x 155 + 243 <--x 155 + 155 --- 244 156 --- 200 - 156 --- 244 - 245 <--x 156 + 244 <--x 156 + 156 --- 245 157 --- 198 - 157 --- 242 - 243 <--x 157 + 242 <--x 157 + 157 --- 243 158 --- 196 - 158 --- 240 - 241 <--x 158 + 158 --- 241 + 248 <--x 158 159 --- 206 - 249 <--x 159 - 159 --- 250 + 250 <--x 159 + 159 --- 251 160 --- 210 - 253 <--x 160 - 160 --- 254 + 254 <--x 160 + 160 --- 255 161 --- 205 - 248 <--x 161 - 161 --- 249 + 249 <--x 161 + 161 --- 250 162 --- 211 - 254 <--x 162 - 162 --- 255 + 255 <--x 162 + 162 --- 256 163 --- 204 - 163 --- 248 - 255 <--x 163 + 163 --- 249 + 256 <--x 163 164 --- 208 - 251 <--x 164 - 164 --- 252 + 252 <--x 164 + 164 --- 253 165 --- 209 - 252 <--x 165 - 165 --- 253 + 253 <--x 165 + 165 --- 254 166 --- 207 - 250 <--x 166 - 166 --- 251 + 251 <--x 166 + 166 --- 252 167 --- 214 - 167 --- 258 - 259 <--x 167 + 167 --- 259 + 260 <--x 167 168 --- 212 - 168 --- 256 - 257 <--x 168 + 168 --- 257 + 258 <--x 168 169 --- 213 - 169 --- 257 - 258 <--x 169 + 169 --- 258 + 259 <--x 169 170 --- 215 - 256 <--x 170 - 170 --- 259 + 257 <--x 170 + 170 --- 260 171 --- 217 - 260 <--x 171 - 171 --- 261 + 261 <--x 171 + 171 --- 262 172 --- 216 - 172 --- 260 - 263 <--x 172 + 172 --- 261 + 264 <--x 172 173 --- 219 - 262 <--x 173 - 173 --- 263 + 263 <--x 173 + 173 --- 264 174 --- 218 - 261 <--x 174 - 174 --- 262 + 262 <--x 174 + 174 --- 263 175 --- 220 - 175 --- 264 + 175 --- 265 176 --- 221 - 176 --- 265 + 176 --- 266 177 --- 222 - 177 --- 266 + 177 --- 267 196 <--x 179 197 <--x 179 198 <--x 179 @@ -946,10 +950,10 @@ flowchart LR 218 <--x 186 219 <--x 186 194 <--x 187 - 212 <--x 188 - 213 <--x 188 - 214 <--x 188 - 215 <--x 188 - 220 <--x 268 - 223 <--x 267 + 212 <--x 189 + 213 <--x 189 + 214 <--x 189 + 215 <--x 189 + 220 <--x 269 + 223 <--x 268 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md index 29793e7bf..b9ba0b415 100644 --- a/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/ball-bearing/artifact_graph_flowchart.snap.md @@ -122,6 +122,7 @@ flowchart LR 61["SweepEdge Adjacent"] 62["SweepEdge Adjacent"] 63["SweepEdge Adjacent"] + 64["SweepEdge Adjacent"] 1 <--x 6 1 --- 8 1 --- 9 @@ -157,25 +158,25 @@ flowchart LR 15 --- 41 15 x--> 47 15 --- 54 - 15 --- 58 + 15 --- 59 34 <--x 17 17 --- 40 - 17 x--> 57 + 17 --- 57 34 <--x 18 18 --- 39 - 18 --- 57 + 18 --- 58 35 <--x 19 19 --- 45 - 19 --- 59 + 19 --- 60 35 <--x 20 20 --- 43 - 20 --- 60 + 20 --- 61 35 <--x 21 21 --- 42 - 21 --- 61 + 21 --- 62 35 <--x 22 22 --- 44 - 22 --- 62 + 22 --- 63 23 --- 38 23 x--> 49 23 --- 53 @@ -183,23 +184,24 @@ flowchart LR 24 --- 46 24 x--> 48 24 --- 55 - 24 --- 63 + 24 --- 64 33 --- 41 33 --- 47 33 --- 50 33 --- 54 - 33 --- 58 + 33 --- 59 34 --- 39 34 --- 40 34 --- 57 + 34 --- 58 35 --- 42 35 --- 43 35 --- 44 35 --- 45 - 35 --- 59 35 --- 60 35 --- 61 35 --- 62 + 35 --- 63 36 --- 38 36 --- 49 36 --- 52 @@ -209,23 +211,25 @@ flowchart LR 37 --- 48 37 --- 51 37 --- 55 - 37 --- 63 + 37 --- 64 38 --- 53 38 --- 56 - 39 --- 57 + 57 <--x 39 + 39 --- 58 40 --- 57 + 58 <--x 40 41 --- 54 - 41 --- 58 - 60 <--x 42 - 42 --- 61 - 59 <--x 43 - 43 --- 60 - 61 <--x 44 - 44 --- 62 - 45 --- 59 - 62 <--x 45 + 41 --- 59 + 61 <--x 42 + 42 --- 62 + 60 <--x 43 + 43 --- 61 + 62 <--x 44 + 44 --- 63 + 45 --- 60 + 63 <--x 45 46 --- 55 - 46 --- 63 + 46 --- 64 54 <--x 50 55 <--x 51 53 <--x 52 diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap new file mode 100644 index 000000000..0d3da6cdb --- /dev/null +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_commands.snap @@ -0,0 +1,1472 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands ball-joint-rod-end.kcl +--- +[ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -152.4, + "y": 134.404, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": -0.0, + "y": -0.0 + }, + "radius": 203.2, + "start": { + "unit": "degrees", + "value": 138.59 + }, + "end": { + "unit": "degrees", + "value": 41.41 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 152.4, + "y": 101.6, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -152.4, + "y": 101.6, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -152.4, + "y": 134.404, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "revolve", + "target": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "axis_is_2d": true, + "angle": { + "unit": "degrees", + "value": 360.0 + }, + "tolerance": 0.0000001, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_set_material_params_pbr", + "object_id": "[uuid]", + "color": { + "r": 0.31764707, + "g": 0.6039216, + "b": 0.9843137, + "a": 100.0 + }, + "metalness": 0.0, + "roughness": 0.0, + "ambient_occlusion": 0.0 + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -114.3, + "y": 254.951, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": -0.0, + "y": -0.0 + }, + "radius": 279.4, + "start": { + "unit": "degrees", + "value": 114.148 + }, + "end": { + "unit": "degrees", + "value": 65.852 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 114.3, + "y": 170.105, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 2.1 + }, + "radius": 203.2, + "start": { + "unit": "degrees", + "value": 55.771 + }, + "end": { + "unit": "degrees", + "value": 124.229 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -114.3, + "y": 254.951, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "revolve", + "target": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "axis_is_2d": true, + "angle": { + "unit": "degrees", + "value": 360.0 + }, + "tolerance": 0.0000001, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.0, + "y": -914.4, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 201.422, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 201.422, + "y": -191.766, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc_to", + "interior": { + "x": 276.313, + "y": -24.174, + "z": 0.0 + }, + "end": { + "x": 277.368, + "y": 0.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -914.4, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "revolve", + "target": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "axis_is_2d": true, + "angle": { + "unit": "degrees", + "value": 360.0 + }, + "tolerance": 0.0000001, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 0.0, + "y": -939.8, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 177.8, + "y": 0.0, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 177.8, + "y": -258.06, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 111.76, + "y": -192.02, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 111.76, + "y": 0.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -110.49, + "y": 0.0, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -192.02, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -177.8, + "y": -259.33, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -681.74, + "z": 0.0 + }, + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": 0.0, + "y": -939.8, + "z": 0.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 1016.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "set_object_transform", + "object_id": "[uuid]", + "transforms": [ + { + "translate": { + "property": { + "x": 508.0, + "y": 0.0, + "z": 0.0 + }, + "set": false, + "is_local": true + }, + "rotate_rpy": null, + "rotate_angle_axis": null, + "scale": null + } + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_fillet_edge", + "object_id": "[uuid]", + "edge_id": null, + "edge_ids": [ + "[uuid]" + ], + "radius": 48.26, + "tolerance": 0.0000001, + "cut_type": "fillet", + "strategy": "automatic", + "extra_face_ids": [] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_common_edge", + "object_id": "[uuid]", + "face_ids": [ + "[uuid]", + "[uuid]" + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_fillet_edge", + "object_id": "[uuid]", + "edge_id": null, + "edge_ids": [ + "[uuid]" + ], + "radius": 38.099999999999994, + "tolerance": 0.0000001, + "cut_type": "fillet", + "strategy": "automatic", + "extra_face_ids": [] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_common_edge", + "object_id": "[uuid]", + "face_ids": [ + "[uuid]", + "[uuid]" + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "boolean_intersection", + "solid_ids": [ + "[uuid]", + "[uuid]" + ], + "tolerance": 0.0000001 + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": -1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 1.0, + "z": -0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 0.0 + }, + "radius": 152.39999999999998, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 152.4, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 1.0, + "z": -0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 2540.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "set_object_transform", + "object_id": "[uuid]", + "transforms": [ + { + "translate": { + "property": { + "x": 0.0, + "y": -1270.0, + "z": 0.0 + }, + "set": false, + "is_local": true + }, + "rotate_rpy": null, + "rotate_angle_axis": null, + "scale": null + } + ] + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "boolean_subtract", + "target_ids": [ + "[uuid]" + ], + "tool_ids": [ + "[uuid]" + ], + "tolerance": 0.0000001 + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "boolean_union", + "solid_ids": [ + "[uuid]", + "[uuid]" + ], + "tolerance": 0.0000001 + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": -939.8 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 100.0, + "clobber": false, + "hide": false + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "plane_set_color", + "plane_id": "[uuid]", + "color": { + "r": 0.6, + "g": 0.6, + "b": 0.6, + "a": 0.3 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "arc", + "center": { + "x": 0.0, + "y": 0.0 + }, + "radius": 86.36, + "start": { + "unit": "degrees", + "value": 0.0 + }, + "end": { + "unit": "degrees", + "value": 360.0 + }, + "relative": false + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 86.36, + "y": 0.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": 482.59999999999997, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "boolean_subtract", + "target_ids": [ + "[uuid]" + ], + "tool_ids": [ + "[uuid]" + ], + "tolerance": 0.0000001 + } + } +] diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_graph_flowchart.snap new file mode 100644 index 000000000..28bc3d9bf --- /dev/null +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart ball-joint-rod-end.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..cad2ae56e --- /dev/null +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/artifact_graph_flowchart.snap.md @@ -0,0 +1,480 @@ +```mermaid +flowchart LR + subgraph path8 [Path] + 8["Path
[1189, 1277, 0]"] + %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 14["Segment
[1283, 1377, 0]"] + %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 15["Segment
[1383, 1405, 0]"] + %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 16["Segment
[1411, 1447, 0]"] + %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 17["Segment
[1453, 1509, 0]"] + %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 18["Segment
[1515, 1522, 0]"] + %% [ProgramBodyItem { index: 20 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] + 44[Solid2d] + end + subgraph path9 [Path] + 9["Path
[1738, 1843, 0]"] + %% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 19["Segment
[1849, 1960, 0]"] + %% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 20["Segment
[1966, 1993, 0]"] + %% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 21["Segment
[1999, 2111, 0]"] + %% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 22["Segment
[2117, 2173, 0]"] + %% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 23["Segment
[2179, 2186, 0]"] + %% [ProgramBodyItem { index: 23 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] + 46[Solid2d] + end + subgraph path10 [Path] + 10["Path
[2503, 2589, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 24["Segment
[2595, 2638, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 25["Segment
[2676, 2725, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 26["Segment
[2731, 2807, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 27["Segment
[2856, 2878, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 28["Segment
[2884, 2940, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] + 29["Segment
[2946, 2953, 0]"] + %% [ProgramBodyItem { index: 27 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] + 42[Solid2d] + end + subgraph path11 [Path] + 11["Path
[3242, 3325, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 30["Segment
[3331, 3361, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 31["Segment
[3367, 3434, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 32["Segment
[3440, 3533, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 33["Segment
[3539, 3575, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 34["Segment
[3581, 3630, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] + 35["Segment
[3636, 3680, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] + 36["Segment
[3686, 3763, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] + 37["Segment
[3769, 3803, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] + 38["Segment
[3809, 3865, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }] + 39["Segment
[3871, 3878, 0]"] + %% [ProgramBodyItem { index: 30 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 10 }] + 47[Solid2d] + end + subgraph path12 [Path] + 12["Path
[4260, 4319, 0]"] + %% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 40["Segment
[4260, 4319, 0]"] + %% [ProgramBodyItem { index: 34 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 45[Solid2d] + end + subgraph path13 [Path] + 13["Path
[4698, 4760, 0]"] + %% [ProgramBodyItem { index: 40 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 41["Segment
[4698, 4760, 0]"] + %% [ProgramBodyItem { index: 40 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 43[Solid2d] + end + 1["Plane
[1157, 1174, 0]"] + %% [ProgramBodyItem { index: 19 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 2["Plane
[1697, 1714, 0]"] + %% [ProgramBodyItem { index: 22 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 3["Plane
[2451, 2468, 0]"] + %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 4["Plane
[3196, 3214, 0]"] + %% [ProgramBodyItem { index: 29 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 5["Plane
[4228, 4246, 0]"] + %% [ProgramBodyItem { index: 33 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 6["Plane
[4588, 4648, 0]"] + %% [ProgramBodyItem { index: 38 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 7["StartSketchOnPlane
[4661, 4684, 0]"] + %% [ProgramBodyItem { index: 39 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 48["Sweep Revolve
[1537, 1580, 0]"] + %% [ProgramBodyItem { index: 21 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 49["Sweep Revolve
[2210, 2262, 0]"] + %% [ProgramBodyItem { index: 24 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 50["Sweep Revolve
[2981, 3044, 0]"] + %% [ProgramBodyItem { index: 28 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 51["Sweep Extrusion
[3904, 3950, 0]"] + %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 52["Sweep Extrusion
[4333, 4366, 0]"] + %% [ProgramBodyItem { index: 35 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 53["Sweep Extrusion
[4779, 4822, 0]"] + %% [ProgramBodyItem { index: 41 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 54["CompositeSolid Subtract
[4864, 4911, 0]"] + %% [ProgramBodyItem { index: 42 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 55["CompositeSolid Subtract
[4417, 4459, 0]"] + %% [ProgramBodyItem { index: 36 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 56["CompositeSolid Intersect
[4148, 4215, 0]"] + %% [ProgramBodyItem { index: 32 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 57["CompositeSolid Union
[4537, 4576, 0]"] + %% [ProgramBodyItem { index: 37 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 58[Wall] + %% face_code_ref=Missing NodePath + 59[Wall] + %% face_code_ref=Missing NodePath + 60[Wall] + %% face_code_ref=Missing NodePath + 61[Wall] + %% face_code_ref=Missing NodePath + 62[Wall] + %% face_code_ref=Missing NodePath + 63[Wall] + %% face_code_ref=Missing NodePath + 64[Wall] + %% face_code_ref=Missing NodePath + 65[Wall] + %% face_code_ref=Missing NodePath + 66[Wall] + %% face_code_ref=Missing NodePath + 67[Wall] + %% face_code_ref=Missing NodePath + 68[Wall] + %% face_code_ref=Missing NodePath + 69[Wall] + %% face_code_ref=Missing NodePath + 70[Wall] + %% face_code_ref=Missing NodePath + 71[Wall] + %% face_code_ref=Missing NodePath + 72[Wall] + %% face_code_ref=Missing NodePath + 73[Wall] + %% face_code_ref=Missing NodePath + 74[Wall] + %% face_code_ref=Missing NodePath + 75[Wall] + %% face_code_ref=Missing NodePath + 76[Wall] + %% face_code_ref=Missing NodePath + 77[Wall] + %% face_code_ref=Missing NodePath + 78[Wall] + %% face_code_ref=Missing NodePath + 79[Wall] + %% face_code_ref=Missing NodePath + 80[Wall] + %% face_code_ref=Missing NodePath + 81["Cap Start"] + %% face_code_ref=Missing NodePath + 82["Cap Start"] + %% face_code_ref=Missing NodePath + 83["Cap Start"] + %% face_code_ref=Missing NodePath + 84["Cap End"] + %% face_code_ref=Missing NodePath + 85["Cap End"] + %% face_code_ref=Missing NodePath + 86["Cap End"] + %% face_code_ref=Missing NodePath + 87["SweepEdge Opposite"] + 88["SweepEdge Opposite"] + 89["SweepEdge Opposite"] + 90["SweepEdge Opposite"] + 91["SweepEdge Opposite"] + 92["SweepEdge Opposite"] + 93["SweepEdge Opposite"] + 94["SweepEdge Opposite"] + 95["SweepEdge Opposite"] + 96["SweepEdge Opposite"] + 97["SweepEdge Opposite"] + 98["SweepEdge Adjacent"] + 99["SweepEdge Adjacent"] + 100["SweepEdge Adjacent"] + 101["SweepEdge Adjacent"] + 102["SweepEdge Adjacent"] + 103["SweepEdge Adjacent"] + 104["SweepEdge Adjacent"] + 105["SweepEdge Adjacent"] + 106["SweepEdge Adjacent"] + 107["SweepEdge Adjacent"] + 108["SweepEdge Adjacent"] + 109["SweepEdge Adjacent"] + 110["SweepEdge Adjacent"] + 111["SweepEdge Adjacent"] + 112["SweepEdge Adjacent"] + 113["SweepEdge Adjacent"] + 114["SweepEdge Adjacent"] + 115["SweepEdge Adjacent"] + 116["SweepEdge Adjacent"] + 117["SweepEdge Adjacent"] + 118["SweepEdge Adjacent"] + 119["SweepEdge Adjacent"] + 120["EdgeCut Fillet
[3993, 4061, 0]"] + %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 121["EdgeCut Fillet
[4067, 4135, 0]"] + %% [ProgramBodyItem { index: 31 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 1 --- 8 + 2 --- 9 + 3 --- 10 + 4 --- 11 + 5 --- 12 + 6 <--x 7 + 6 --- 13 + 8 --- 14 + 8 --- 15 + 8 --- 16 + 8 --- 17 + 8 --- 18 + 8 --- 44 + 8 ---- 48 + 9 --- 19 + 9 --- 20 + 9 --- 21 + 9 --- 22 + 9 --- 23 + 9 --- 46 + 9 ---- 49 + 9 --- 57 + 10 --- 24 + 10 --- 25 + 10 --- 26 + 10 --- 27 + 10 --- 28 + 10 --- 29 + 10 --- 42 + 10 ---- 50 + 10 --- 56 + 11 --- 30 + 11 --- 31 + 11 --- 32 + 11 --- 33 + 11 --- 34 + 11 --- 35 + 11 --- 36 + 11 --- 37 + 11 --- 38 + 11 --- 39 + 11 --- 47 + 11 ---- 51 + 11 --- 56 + 12 --- 40 + 12 --- 45 + 12 ---- 52 + 12 --- 55 + 13 --- 41 + 13 --- 43 + 13 ---- 53 + 13 --- 54 + 48 <--x 14 + 14 --- 63 + 14 --- 100 + 48 <--x 15 + 15 --- 61 + 15 --- 101 + 48 <--x 16 + 16 --- 60 + 16 --- 102 + 48 <--x 17 + 17 --- 62 + 17 --- 103 + 49 <--x 19 + 19 --- 75 + 19 --- 113 + 49 <--x 20 + 20 --- 74 + 20 --- 114 + 49 <--x 21 + 21 --- 76 + 21 --- 115 + 49 <--x 22 + 22 --- 73 + 22 --- 116 + 50 <--x 24 + 24 --- 80 + 24 --- 117 + 50 <--x 25 + 25 --- 78 + 25 --- 118 + 50 <--x 26 + 26 --- 77 + 26 --- 119 + 50 <--x 27 + 27 --- 79 + 30 --- 71 + 30 x--> 82 + 30 --- 89 + 30 --- 104 + 31 --- 69 + 31 x--> 82 + 31 --- 90 + 31 --- 105 + 32 --- 64 + 32 x--> 82 + 32 --- 91 + 32 --- 106 + 33 --- 66 + 33 x--> 82 + 33 --- 92 + 33 --- 107 + 34 --- 68 + 34 x--> 82 + 34 --- 93 + 34 --- 108 + 35 --- 65 + 35 x--> 82 + 35 --- 94 + 35 --- 109 + 36 --- 67 + 36 x--> 82 + 36 --- 95 + 36 --- 110 + 37 --- 70 + 37 x--> 82 + 37 --- 96 + 37 --- 111 + 38 --- 72 + 38 x--> 82 + 38 --- 97 + 38 --- 112 + 40 --- 58 + 40 x--> 81 + 40 --- 87 + 40 --- 98 + 41 --- 59 + 41 x--> 83 + 41 --- 88 + 41 --- 99 + 48 --- 60 + 48 --- 61 + 48 --- 62 + 48 --- 63 + 48 --- 100 + 48 --- 101 + 48 --- 102 + 48 --- 103 + 49 --- 73 + 49 --- 74 + 49 --- 75 + 49 --- 76 + 49 --- 113 + 49 --- 114 + 49 --- 115 + 49 --- 116 + 50 --- 77 + 50 --- 78 + 50 --- 79 + 50 --- 80 + 50 --- 117 + 50 --- 118 + 50 --- 119 + 51 --- 64 + 51 --- 65 + 51 --- 66 + 51 --- 67 + 51 --- 68 + 51 --- 69 + 51 --- 70 + 51 --- 71 + 51 --- 72 + 51 --- 82 + 51 --- 85 + 51 --- 89 + 51 --- 90 + 51 --- 91 + 51 --- 92 + 51 --- 93 + 51 --- 94 + 51 --- 95 + 51 --- 96 + 51 --- 97 + 51 --- 104 + 51 --- 105 + 51 --- 106 + 51 --- 107 + 51 --- 108 + 51 --- 109 + 51 --- 110 + 51 --- 111 + 51 --- 112 + 52 --- 58 + 52 --- 81 + 52 --- 84 + 52 --- 87 + 52 --- 98 + 53 --- 59 + 53 --- 83 + 53 --- 86 + 53 --- 88 + 53 --- 99 + 57 --- 54 + 56 --- 55 + 55 --- 57 + 58 --- 87 + 58 --- 98 + 59 --- 88 + 59 --- 99 + 101 <--x 60 + 60 --- 102 + 100 <--x 61 + 61 --- 101 + 102 <--x 62 + 62 --- 103 + 63 --- 100 + 103 <--x 63 + 64 --- 91 + 105 <--x 64 + 64 --- 106 + 65 --- 94 + 108 <--x 65 + 65 --- 109 + 66 --- 92 + 106 <--x 66 + 66 --- 107 + 67 --- 95 + 109 <--x 67 + 67 --- 110 + 68 --- 93 + 107 <--x 68 + 68 --- 108 + 69 --- 90 + 104 <--x 69 + 69 --- 105 + 70 --- 96 + 110 <--x 70 + 70 --- 111 + 71 --- 89 + 71 --- 104 + 112 <--x 71 + 72 --- 97 + 111 <--x 72 + 72 --- 112 + 115 <--x 73 + 73 --- 116 + 113 <--x 74 + 74 --- 114 + 75 --- 113 + 116 <--x 75 + 114 <--x 76 + 76 --- 115 + 118 <--x 77 + 77 --- 119 + 117 <--x 78 + 78 --- 118 + 119 <--x 79 + 80 --- 117 + 87 <--x 84 + 89 <--x 85 + 90 <--x 85 + 91 <--x 85 + 92 <--x 85 + 93 <--x 85 + 94 <--x 85 + 95 <--x 85 + 96 <--x 85 + 97 <--x 85 + 88 <--x 86 + 106 <--x 120 + 109 <--x 121 +``` diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/ast.snap b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/ast.snap new file mode 100644 index 000000000..e62f1f678 --- /dev/null +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/ast.snap @@ -0,0 +1,6533 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing ball-joint-rod-end.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "ballBoltLength", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "6", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "// variables" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "ballRadius", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "sketchStartAngle", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "asin", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballBoltLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "housingThicknessHalf", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "4.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.5, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "11", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 11.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "housingR2", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "tolerance", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "0.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "shaftR", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 8.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "distanceBetweenEyeAndShaftEnd", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "36", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 36.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "radiusToFlat", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "12", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 12.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "flatsWidth", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "14", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 14.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "tapperInAng", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "45", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 45.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "holeDForM8Tap", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "6.8", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 6.8, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "holdDepth", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "18", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 18.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle1", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "asin", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingThicknessHalf", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "", + "", + "// calculated variables" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle2", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "asin", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingThicknessHalf", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "pointOnRingPolar", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tolerance", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "polar", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "polarY", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "computed": false, + "end": 0, + "object": { + "commentStart": 0, + "end": 0, + "name": "pointOnRingPolar", + "start": 0, + "type": "Identifier", + "type": "Identifier" + }, + "property": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "MemberExpression", + "type": "MemberExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "intersectPoint", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sqrt", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "left": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "exp", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "pow", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "operator": "-", + "right": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "exp", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "pow", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "shaftR", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "ballSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "", + "", + "// start modeling section", + "", + "", + "// start with inner ball" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "ballProfile", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "at", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketchStartAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "polar", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angleStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketchStartAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angleEnd", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketchStartAngle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "arc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "4", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 4.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballBoltLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "xLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "close", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "ballRevolve", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "360", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 360.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "axis", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "X", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "revolve", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "color", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "\"#519afb\"", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": "#519afb" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "appearance", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "commentStart": 0, + "end": 0, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "next the retaining loop that keep the ball in place", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopProfile", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "at", + "start": 0, + "type": "Identifier" + }, + "arg": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "polar", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angleStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angleEnd", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "operator": "-", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "arc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "polarY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angleStart", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angleEnd", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "operator": "+", + "right": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopSketchAngle2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "arc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "close", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopRevolve", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "360", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 360.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "axis", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "X", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "revolve", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "intersectPoint2", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 5.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.08", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.08, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "polar", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyRevolveSketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "XZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "", + "", + "// the shaft is modeled in two parts, and intersected together", + "// starting with a revolve" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyRevolveProfile", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "at", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "distanceBetweenEyeAndShaftEnd", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyRevolveSketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "shaftR", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.07", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.07, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg05" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "xLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "intersectPoint", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "kink" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "interiorAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "intersectPoint2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingR1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.08", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.08, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "arc", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "xLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "close", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "nonCodeMeta": { + "nonCodeNodes": { + "1": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "inlineComment", + "value": "0.07 dither to make CSG work", + "style": "line" + } + } + ], + "3": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "blockComment", + "value": "|> line(endAbsolute = [housingR1, 0])", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyRevolve", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "360", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 360.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "axis", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "Y", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "revolve", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyRevolveProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodySketch", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "YZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "", + "", + "// second part of the shalft is a extrude that will add the flats and the filleted taper to get to the retaining ring width" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyProfile", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "at", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "distanceBetweenEyeAndShaftEnd", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodySketch", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flatsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "xLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "intersectPoint", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.5, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.11", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.11, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "longflats" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg01" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tapperInAng", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsoluteX", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingThicknessHalf", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.1, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg02" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "housingThicknessHalf", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "0.15", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.15, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "xLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "segLen", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg03" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "tapperInAng", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsoluteX", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "flatsWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "seg04" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "segLen", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "longflats", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "yLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "close", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyFlats", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "40", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 40.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "extrude", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "translate", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.9", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.9, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tags", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "faces", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg01", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg02", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "getCommonEdge", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "fillet", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "1.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.5, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tags", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "faces", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg03", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "seg04", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "getCommonEdge", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "fillet", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "solid001", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "intersect", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyRevolve", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedShaftBodyFlats", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "sketch005", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "XZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "profile005", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "ballRadius", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketch005", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "extrude002", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "100", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 100.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "extrude", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profile005", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "y", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "50", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 50.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "z", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "translate", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "solid002", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tools", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "extrude002", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "solid001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "solid003", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "union", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "solid002", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "retainingLoopRevolve", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "// Join the thread body with the retaining loop for the balljoint" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "plane001", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "offset", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "distanceBetweenEyeAndShaftEnd", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "offsetPlane", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "XY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plane001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "profile001", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "radius", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeDForM8Tap", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "threadedRodHole", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holdDepth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "commentStart": 0, + "end": 0, + "raw": "1", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "extrude", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profile001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "solid004", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tools", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "threadedRodHole", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "subtract", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "solid003", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "", + "", + "// cut hole for threaded rod" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "commentStart": 0, + "end": 0, + "innerAttrs": [ + { + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "settings", + "start": 0, + "type": "Identifier" + }, + "preComments": [ + "// ball joint rod end", + "// A ball joint rod end is a mechanical linkage component that consists of a spherical ball housed within a socket, connected to a threaded rod, allowing rotational movement in multiple directions while providing a secure connection point between two parts of a mechanical system. Commonly used in steering systems and suspension components.", + "", + "", + "// Set Units" + ], + "properties": [ + { + "commentStart": 0, + "end": 0, + "key": { + "commentStart": 0, + "end": 0, + "name": "defaultLengthUnit", + "start": 0, + "type": "Identifier" + }, + "start": 0, + "type": "ObjectProperty", + "value": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "in", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "commentStart": 0, + "end": 0, + "key": { + "commentStart": 0, + "end": 0, + "name": "kclVersion", + "start": 0, + "type": "Identifier" + }, + "start": 0, + "type": "ObjectProperty", + "value": { + "commentStart": 0, + "end": 0, + "raw": "1.0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 1.0, + "suffix": "None" + } + } + } + ], + "start": 0, + "type": "Annotation" + } + ], + "nonCodeMeta": { + "nonCodeNodes": { + "17": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "24": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "31": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ], + "35": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/ops.snap b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/ops.snap new file mode 100644 index 000000000..1de5073a8 --- /dev/null +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/ops.snap @@ -0,0 +1,1026 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed ball-joint-rod-end.kcl +--- +[ + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": "polar", + "functionSourceRange": [], + "unlabeledArg": null, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 2.168, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "sourceRange": [] + }, + "length": { + "value": { + "type": "Number", + "value": 8.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": "polar", + "functionSourceRange": [], + "unlabeledArg": null, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 2.419, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "sourceRange": [] + }, + "length": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "revolve", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 360.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": "polar", + "functionSourceRange": [], + "unlabeledArg": null, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 1.992, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "sourceRange": [] + }, + "length": { + "value": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "revolve", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 360.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": "polar", + "functionSourceRange": [], + "unlabeledArg": null, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": -0.087, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "sourceRange": [] + }, + "length": { + "value": { + "type": "Number", + "value": 10.92, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "revolve", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 360.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "extrude", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 40.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "fillet", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "radius": { + "value": { + "type": "Number", + "value": 1.9, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "tags": { + "value": { + "type": "Array", + "value": [ + { + "type": "Uuid", + "value": "[uuid]" + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "fillet", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "radius": { + "value": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "tags": { + "value": { + "type": "Array", + "value": [ + { + "type": "Uuid", + "value": "[uuid]" + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "intersect", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "extrude", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 100.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -50.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "subtract", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": { + "tools": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "union", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "offsetPlane", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "offset": { + "value": { + "type": "Number", + "value": -37.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "extrude", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "length": { + "value": { + "type": "Number", + "value": 19.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "subtract", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": { + "tools": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "GroupEnd" + }, + { + "type": "GroupEnd" + }, + { + "type": "GroupEnd" + }, + { + "type": "GroupEnd" + } +] diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/program_memory.snap new file mode 100644 index 000000000..e91292501 --- /dev/null +++ b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/program_memory.snap @@ -0,0 +1,3970 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Variables in memory after executing ball-joint-rod-end.kcl +--- +{ + "ballBoltLength": { + "type": "Number", + "value": 6.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "ballProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": false, + "center": [ + -0.0, + -0.0 + ], + "from": [ + -6.0, + 5.292 + ], + "radius": 8.0, + "tag": null, + "to": [ + 6.0, + 5.292 + ], + "type": "Arc", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 6.0, + 5.292 + ], + "tag": null, + "to": [ + 6.0, + 4.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 6.0, + 4.0 + ], + "tag": null, + "to": [ + -6.0, + 4.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -6.0, + 4.0 + ], + "tag": null, + "to": [ + -6.0, + 5.292 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -6.0, + 5.292 + ], + "tag": null, + "to": [ + -6.0, + 5.292 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -6.0, + 5.292 + ], + "to": [ + -6.0, + 5.292 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + } + }, + "ballRadius": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "ballRevolve": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": false, + "center": [ + -0.0, + -0.0 + ], + "from": [ + -6.0, + 5.292 + ], + "radius": 8.0, + "tag": null, + "to": [ + 6.0, + 5.292 + ], + "type": "Arc", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 6.0, + 5.292 + ], + "tag": null, + "to": [ + 6.0, + 4.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 6.0, + 4.0 + ], + "tag": null, + "to": [ + -6.0, + 4.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -6.0, + 4.0 + ], + "tag": null, + "to": [ + -6.0, + 5.292 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -6.0, + 5.292 + ], + "tag": null, + "to": [ + -6.0, + 5.292 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -6.0, + 5.292 + ], + "to": [ + -6.0, + 5.292 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "ballSketch": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + } + }, + "distanceBetweenEyeAndShaftEnd": { + "type": "Number", + "value": 36.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "extrude002": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 6.0, + 0.0 + ], + "radius": 6.0, + "tag": null, + "to": [ + 6.0, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 6.0, + 0.0 + ], + "to": [ + 6.0, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "flatsWidth": { + "type": "Number", + "value": 14.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "holdDepth": { + "type": "Number", + "value": 18.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "holeDForM8Tap": { + "type": "Number", + "value": 6.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "housingR1": { + "type": "Number", + "value": 11.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "housingR2": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "housingThicknessHalf": { + "type": "Number", + "value": 4.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "intersectPoint": { + "type": "Number", + "value": 7.55, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "intersectPoint2": { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 10.878, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": -0.952, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "kink": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "kink" + }, + "longflats": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "longflats" + }, + "plane001": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": -939.8, + "units": { + "type": "Mm" + } + }, + "value": "Custom", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + } + }, + "pointOnRingPolar": { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": -4.556, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 6.697, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "polarY": { + "type": "Number", + "value": 6.697, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "profile001": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 3.4, + 0.0 + ], + "radius": 3.4, + "tag": null, + "to": [ + 3.4, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": -939.8, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "Custom", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 3.4, + 0.0 + ], + "to": [ + 3.4, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + } + }, + "profile005": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 6.0, + 0.0 + ], + "radius": 6.0, + "tag": null, + "to": [ + 6.0, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 6.0, + 0.0 + ], + "to": [ + 6.0, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + } + }, + "radiusToFlat": { + "type": "Number", + "value": 12.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "retainingLoopProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": false, + "center": [ + -0.0, + -0.0 + ], + "from": [ + -4.5, + 10.037 + ], + "radius": 11.0, + "tag": null, + "to": [ + 4.5, + 10.037 + ], + "type": "Arc", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 4.5, + 10.037 + ], + "tag": null, + "to": [ + 4.5, + 6.697 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 0.083 + ], + "from": [ + 4.5, + 6.697 + ], + "radius": 8.0, + "tag": null, + "to": [ + -4.5, + 6.697 + ], + "type": "Arc", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.5, + 6.697 + ], + "tag": null, + "to": [ + -4.5, + 10.037 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.5, + 10.037 + ], + "tag": null, + "to": [ + -4.5, + 10.037 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -4.5, + 10.037 + ], + "to": [ + -4.5, + 10.037 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + } + }, + "retainingLoopRevolve": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": false, + "center": [ + -0.0, + -0.0 + ], + "from": [ + -4.5, + 10.037 + ], + "radius": 11.0, + "tag": null, + "to": [ + 4.5, + 10.037 + ], + "type": "Arc", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 4.5, + 10.037 + ], + "tag": null, + "to": [ + 4.5, + 6.697 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 0.083 + ], + "from": [ + 4.5, + 6.697 + ], + "radius": 8.0, + "tag": null, + "to": [ + -4.5, + 6.697 + ], + "type": "Arc", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.5, + 6.697 + ], + "tag": null, + "to": [ + -4.5, + 10.037 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.5, + 10.037 + ], + "tag": null, + "to": [ + -4.5, + 10.037 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -4.5, + 10.037 + ], + "to": [ + -4.5, + 10.037 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "retainingLoopSketch": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + } + }, + "retainingLoopSketchAngle1": { + "type": "Number", + "value": 0.421, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "retainingLoopSketchAngle2": { + "type": "Number", + "value": 0.597, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "seg01": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg01" + }, + "seg02": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg02" + }, + "seg03": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg03" + }, + "seg04": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg04" + }, + "seg05": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "seg05" + }, + "shaftR": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sketch001": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": -939.8, + "units": { + "type": "Mm" + } + }, + "value": "Custom", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + } + }, + "sketch005": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "value": "XZ", + "xAxis": { + "x": -1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + } + }, + "sketchStartAngle": { + "type": "Number", + "value": 0.848, + "ty": { + "type": "Known", + "type": "Angle", + "type": "Radians" + } + }, + "solid001": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "to": [ + 7.93, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -36.0 + ], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "to": [ + 7.93, + -7.55 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -7.55 + ], + "p1": [ + 7.93, + -7.54983443527075 + ], + "p2": [ + 10.878446103161862, + -0.9517407108044271 + ], + "p3": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 10.92, + 0.0 + ], + "type": "ArcThreePoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -36.0 + ], + "to": [ + 0.0, + -36.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "kink": { + "type": "TagIdentifier", + "value": "kink" + }, + "seg05": { + "type": "TagIdentifier", + "value": "seg05" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "solid002": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "to": [ + 7.93, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -36.0 + ], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "to": [ + 7.93, + -7.55 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -7.55 + ], + "p1": [ + 7.93, + -7.54983443527075 + ], + "p2": [ + 10.878446103161862, + -0.9517407108044271 + ], + "p3": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 10.92, + 0.0 + ], + "type": "ArcThreePoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -36.0 + ], + "to": [ + 0.0, + -36.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "kink": { + "type": "TagIdentifier", + "value": "kink" + }, + "seg05": { + "type": "TagIdentifier", + "value": "seg05" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "solid003": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "to": [ + 7.93, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -36.0 + ], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "to": [ + 7.93, + -7.55 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -7.55 + ], + "p1": [ + 7.93, + -7.54983443527075 + ], + "p2": [ + 10.878446103161862, + -0.9517407108044271 + ], + "p3": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 10.92, + 0.0 + ], + "type": "ArcThreePoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -36.0 + ], + "to": [ + 0.0, + -36.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "kink": { + "type": "TagIdentifier", + "value": "kink" + }, + "seg05": { + "type": "TagIdentifier", + "value": "seg05" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "solid004": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "to": [ + 7.93, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -36.0 + ], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "to": [ + 7.93, + -7.55 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -7.55 + ], + "p1": [ + 7.93, + -7.54983443527075 + ], + "p2": [ + 10.878446103161862, + -0.9517407108044271 + ], + "p3": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 10.92, + 0.0 + ], + "type": "ArcThreePoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -36.0 + ], + "to": [ + 0.0, + -36.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "kink": { + "type": "TagIdentifier", + "value": "kink" + }, + "seg05": { + "type": "TagIdentifier", + "value": "seg05" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "tapperInAng": { + "type": "Number", + "value": 45.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "threadedRodHole": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 0.0 + ], + "from": [ + 3.4, + 0.0 + ], + "radius": 3.4, + "tag": null, + "to": [ + 3.4, + 0.0 + ], + "type": "Circle", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": -939.8, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "Custom", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 3.4, + 0.0 + ], + "to": [ + 3.4, + 0.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 19.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "threadedShaftBodyFlats": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 3423, + "end": 3433, + "start": 3423, + "type": "TagDeclarator", + "value": "longflats" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 3457, + "end": 3463, + "start": 3457, + "type": "TagDeclarator", + "value": "seg01" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 3568, + "end": 3574, + "start": 3568, + "type": "TagDeclarator", + "value": "seg02" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 3673, + "end": 3679, + "start": 3673, + "type": "TagDeclarator", + "value": "seg03" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 3756, + "end": 3762, + "start": 3756, + "type": "TagDeclarator", + "value": "seg04" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -37.0 + ], + "tag": null, + "to": [ + 7.0, + -37.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.0, + -37.0 + ], + "tag": { + "commentStart": 3423, + "end": 3433, + "start": 3423, + "type": "TagDeclarator", + "value": "longflats" + }, + "to": [ + 7.0, + -10.16 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.0, + -10.16 + ], + "tag": { + "commentStart": 3457, + "end": 3463, + "start": 3457, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 4.4, + -7.56 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 4.4, + -7.56 + ], + "tag": { + "commentStart": 3568, + "end": 3574, + "start": 3568, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 4.4, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 4.4, + 0.0 + ], + "tag": null, + "to": [ + -4.35, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.35, + 0.0 + ], + "tag": { + "commentStart": 3673, + "end": 3679, + "start": 3673, + "type": "TagDeclarator", + "value": "seg03" + }, + "to": [ + -4.35, + -7.56 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.35, + -7.56 + ], + "tag": { + "commentStart": 3756, + "end": 3762, + "start": 3756, + "type": "TagDeclarator", + "value": "seg04" + }, + "to": [ + -7.0, + -10.21 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -7.0, + -10.21 + ], + "tag": null, + "to": [ + -7.0, + -37.05 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -7.0, + -37.05 + ], + "tag": null, + "to": [ + 0.0, + -37.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -37.0 + ], + "tag": null, + "to": [ + 0.0, + -37.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -37.0 + ], + "to": [ + 0.0, + -37.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "longflats": { + "type": "TagIdentifier", + "value": "longflats" + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01" + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02" + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03" + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 40.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", + "edgeCuts": [ + { + "type": "fillet", + "id": "[uuid]", + "radius": { + "n": 1.9, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "edgeId": "[uuid]", + "tag": null + }, + { + "type": "fillet", + "id": "[uuid]", + "radius": { + "n": 1.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "edgeId": "[uuid]", + "tag": null + } + ], + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "threadedShaftBodyProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -37.0 + ], + "tag": null, + "to": [ + 7.0, + -37.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.0, + -37.0 + ], + "tag": { + "commentStart": 3423, + "end": 3433, + "start": 3423, + "type": "TagDeclarator", + "value": "longflats" + }, + "to": [ + 7.0, + -10.16 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.0, + -10.16 + ], + "tag": { + "commentStart": 3457, + "end": 3463, + "start": 3457, + "type": "TagDeclarator", + "value": "seg01" + }, + "to": [ + 4.4, + -7.56 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 4.4, + -7.56 + ], + "tag": { + "commentStart": 3568, + "end": 3574, + "start": 3568, + "type": "TagDeclarator", + "value": "seg02" + }, + "to": [ + 4.4, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 4.4, + 0.0 + ], + "tag": null, + "to": [ + -4.35, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.35, + 0.0 + ], + "tag": { + "commentStart": 3673, + "end": 3679, + "start": 3673, + "type": "TagDeclarator", + "value": "seg03" + }, + "to": [ + -4.35, + -7.56 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -4.35, + -7.56 + ], + "tag": { + "commentStart": 3756, + "end": 3762, + "start": 3756, + "type": "TagDeclarator", + "value": "seg04" + }, + "to": [ + -7.0, + -10.21 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -7.0, + -10.21 + ], + "tag": null, + "to": [ + -7.0, + -37.05 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -7.0, + -37.05 + ], + "tag": null, + "to": [ + 0.0, + -37.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -37.0 + ], + "tag": null, + "to": [ + 0.0, + -37.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -37.0 + ], + "to": [ + 0.0, + -37.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "longflats": { + "type": "TagIdentifier", + "value": "longflats" + }, + "seg01": { + "type": "TagIdentifier", + "value": "seg01" + }, + "seg02": { + "type": "TagIdentifier", + "value": "seg02" + }, + "seg03": { + "type": "TagIdentifier", + "value": "seg03" + }, + "seg04": { + "type": "TagIdentifier", + "value": "seg04" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + } + }, + "threadedShaftBodyRevolve": { + "type": "Solid", + "value": { + "type": "Solid", + "id": "[uuid]", + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "type": "extrudePlane" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + }, + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudePlane" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "to": [ + 7.93, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -36.0 + ], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "to": [ + 7.93, + -7.55 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -7.55 + ], + "p1": [ + 7.93, + -7.54983443527075 + ], + "p2": [ + 10.878446103161862, + -0.9517407108044271 + ], + "p3": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 10.92, + 0.0 + ], + "type": "ArcThreePoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -36.0 + ], + "to": [ + 0.0, + -36.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "kink": { + "type": "TagIdentifier", + "value": "kink" + }, + "seg05": { + "type": "TagIdentifier", + "value": "seg05" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + }, + "height": 0.0, + "startCapId": null, + "endCapId": null, + "units": { + "type": "Inches" + }, + "sectional": false + } + }, + "threadedShaftBodyRevolveProfile": { + "type": "Sketch", + "value": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": { + "commentStart": 2631, + "end": 2637, + "start": 2631, + "type": "TagDeclarator", + "value": "seg05" + }, + "to": [ + 7.93, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -36.0 + ], + "tag": { + "commentStart": 2719, + "end": 2724, + "start": 2719, + "type": "TagDeclarator", + "value": "kink" + }, + "to": [ + 7.93, + -7.55 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 7.93, + -7.55 + ], + "p1": [ + 7.93, + -7.54983443527075 + ], + "p2": [ + 10.878446103161862, + -0.9517407108044271 + ], + "p3": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 10.92, + 0.0 + ], + "type": "ArcThreePoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 10.92, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + 0.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + 0.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 0.0, + -36.0 + ], + "tag": null, + "to": [ + 0.0, + -36.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 0.0, + -36.0 + ], + "to": [ + 0.0, + -36.0 + ], + "units": { + "type": "Inches" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "tags": { + "kink": { + "type": "TagIdentifier", + "value": "kink" + }, + "seg05": { + "type": "TagIdentifier", + "value": "seg05" + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", + "units": { + "type": "Inches" + } + } + }, + "threadedShaftBodyRevolveSketch": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + } + }, + "threadedShaftBodySketch": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "value": "YZ", + "xAxis": { + "x": 0.0, + "y": -1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + } + }, + "tolerance": { + "type": "Number", + "value": 0.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } +} diff --git a/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/rendered_model.png b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/rendered_model.png new file mode 100644 index 000000000..467dcae02 Binary files /dev/null and b/rust/kcl-lib/tests/kcl_samples/ball-joint-rod-end/rendered_model.png differ diff --git a/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_commands.snap index e4edacf8d..c0ef44d08 100644 --- a/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_commands.snap @@ -509,6 +509,181 @@ description: Artifact commands bone-plate.kcl "hide": true } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 0.0, + "z": 1.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + }, { "cmdId": "[uuid]", "range": [], @@ -517,6 +692,174 @@ description: Artifact commands bone-plate.kcl "path_id": "[uuid]" } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "close_path", + "path_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, { "cmdId": "[uuid]", "range": [], @@ -558,117 +901,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": 2.25, - "y": 12.25, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -694,117 +926,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": 2.25, - "y": 29.5, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -830,117 +951,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": 2.25, - "y": 46.25, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -966,117 +976,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": 2.25, - "y": 77.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -1102,117 +1001,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": 2.25, - "y": 100.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -1238,117 +1026,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": 2.25, - "y": 130.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -1374,117 +1051,6 @@ description: Artifact commands bone-plate.kcl } } }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "move_path_pen", - "path": "[uuid]", - "to": { - "x": -17.75, - "y": 130.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "start_path" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "extrude", - "target": "[uuid]", - "distance": -100.0, - "faces": null, - "opposite": "None" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "object_bring_to_front", - "object_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "sketch_mode_disable" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_adjacency_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "solid3d_get_extrusion_face_info", - "object_id": "[uuid]", - "edge_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "close_path", - "path_id": "[uuid]" - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "enable_sketch_mode", - "entity_id": "[uuid]", - "ortho": false, - "animated": false, - "adjust_camera": false, - "planar_normal": { - "x": 0.0, - "y": -1.0, - "z": 0.0 - } - } - }, { "cmdId": "[uuid]", "range": [], @@ -1510,6 +1076,97 @@ description: Artifact commands bone-plate.kcl } } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 2.25, + "y": 12.25, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 2.25, + "y": 29.5, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 2.25, + "y": 46.25, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 2.25, + "y": 77.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 2.25, + "y": 100.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": 2.25, + "y": 130.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "move_path_pen", + "path": "[uuid]", + "to": { + "x": -17.75, + "y": 130.0, + "z": 0.0 + } + } + }, { "cmdId": "[uuid]", "range": [], @@ -1530,6 +1187,55 @@ description: Artifact commands bone-plate.kcl "type": "sketch_mode_disable" } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, { "cmdId": "[uuid]", "range": [], @@ -1537,6 +1243,167 @@ description: Artifact commands bone-plate.kcl "type": "start_path" } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "start_path" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "enable_sketch_mode", + "entity_id": "[uuid]", + "ortho": false, + "animated": false, + "adjust_camera": false, + "planar_normal": { + "x": 0.0, + "y": -1.0, + "z": 0.0 + } + } + }, { "cmdId": "[uuid]", "range": [], @@ -1564,6 +1431,139 @@ description: Artifact commands bone-plate.kcl "opposite": "None" } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extrude", + "target": "[uuid]", + "distance": -100.0, + "faces": null, + "opposite": "None" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_bring_to_front", + "object_id": "[uuid]" + } + }, { "cmdId": "[uuid]", "range": [], @@ -1579,6 +1579,118 @@ description: Artifact commands bone-plate.kcl "type": "sketch_mode_disable" } }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "sketch_mode_disable" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_adjacency_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, { "cmdId": "[uuid]", "range": [], @@ -1601,100 +1713,80 @@ description: Artifact commands bone-plate.kcl "cmdId": "[uuid]", "range": [], "command": { - "type": "boolean_subtract", - "target_ids": [ - "[uuid]" - ], - "tool_ids": [ - "[uuid]" - ], - "tolerance": 0.0000001 + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" } }, { "cmdId": "[uuid]", "range": [], "command": { - "type": "boolean_union", - "solid_ids": [ + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "solid3d_get_extrusion_face_info", + "object_id": "[uuid]", + "edge_id": "[uuid]" + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "boolean_subtract", + "target_ids": [ + "[uuid]" + ], + "tool_ids": [ + "[uuid]", + "[uuid]", + "[uuid]", "[uuid]", - "[uuid]" - ], - "tolerance": 0.0000001 - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "boolean_subtract", - "target_ids": [ - "[uuid]" - ], - "tool_ids": [ - "[uuid]" - ], - "tolerance": 0.0000001 - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "boolean_union", - "solid_ids": [ "[uuid]", - "[uuid]" - ], - "tolerance": 0.0000001 - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "boolean_subtract", - "target_ids": [ - "[uuid]" - ], - "tool_ids": [ - "[uuid]" - ], - "tolerance": 0.0000001 - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "boolean_union", - "solid_ids": [ "[uuid]", - "[uuid]" - ], - "tolerance": 0.0000001 - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "boolean_subtract", - "target_ids": [ - "[uuid]" - ], - "tool_ids": [ - "[uuid]" - ], - "tolerance": 0.0000001 - } - }, - { - "cmdId": "[uuid]", - "range": [], - "command": { - "type": "boolean_union", - "solid_ids": [ "[uuid]", "[uuid]" ], diff --git a/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_graph_flowchart.snap.md index 8be28a7ce..0d92386d4 100644 --- a/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/bone-plate/artifact_graph_flowchart.snap.md @@ -1,138 +1,138 @@ ```mermaid flowchart LR - subgraph path3 [Path] - 3["Path
[541, 569, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 12["Segment
[575, 626, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] - 13["Segment
[632, 680, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] - 14["Segment
[686, 737, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] - 15["Segment
[743, 791, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] - 16["Segment
[797, 848, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] - 17["Segment
[854, 902, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] - 18["Segment
[908, 959, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] - 19["Segment
[965, 1007, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }] - 20["Segment
[1013, 1071, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 10 }] - 21["Segment
[1077, 1132, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 11 }] - 22["Segment
[1138, 1196, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 12 }] - 23["Segment
[1202, 1257, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 13 }] - 24["Segment
[1263, 1306, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 14 }] - 25["Segment
[1312, 1368, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 15 }] - 26["Segment
[1374, 1429, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 16 }] - 27["Segment
[1435, 1491, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 17 }] - 28["Segment
[1497, 1504, 0]"] - %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 18 }] - 42[Solid2d] - end - subgraph path4 [Path] - 4["Path
[1668, 1730, 0]"] - %% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 29["Segment
[1668, 1730, 0]"] - %% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 41[Solid2d] - end - subgraph path5 [Path] - 5["Path
[1768, 1829, 0]"] - %% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 30["Segment
[1768, 1829, 0]"] - %% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 44[Solid2d] - end - subgraph path6 [Path] - 6["Path
[1867, 1929, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 31["Segment
[1867, 1929, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 45[Solid2d] - end - subgraph path7 [Path] - 7["Path
[1967, 2026, 0]"] - %% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 32["Segment
[1967, 2026, 0]"] - %% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 39[Solid2d] - end - subgraph path8 [Path] - 8["Path
[2064, 2124, 0]"] - %% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 33["Segment
[2064, 2124, 0]"] - %% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 37[Solid2d] - end - subgraph path9 [Path] - 9["Path
[2162, 2222, 0]"] - %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 34["Segment
[2162, 2222, 0]"] - %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 38[Solid2d] - end subgraph path10 [Path] - 10["Path
[2260, 2322, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 35["Segment
[2260, 2322, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 40[Solid2d] + 10["Path
[541, 569, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 19["Segment
[575, 626, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 20["Segment
[632, 680, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 21["Segment
[686, 737, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 22["Segment
[743, 791, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] + 23["Segment
[797, 848, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] + 24["Segment
[854, 902, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] + 25["Segment
[908, 959, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 8 }] + 26["Segment
[965, 1007, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 9 }] + 27["Segment
[1013, 1071, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 10 }] + 28["Segment
[1077, 1132, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 11 }] + 29["Segment
[1138, 1196, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 12 }] + 30["Segment
[1202, 1257, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 13 }] + 31["Segment
[1263, 1306, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 14 }] + 32["Segment
[1312, 1368, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 15 }] + 33["Segment
[1374, 1429, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 16 }] + 34["Segment
[1435, 1491, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 17 }] + 35["Segment
[1497, 1504, 0]"] + %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 18 }] + 47[Solid2d] end subgraph path11 [Path] - 11["Path
[2360, 2421, 0]"] - %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 36["Segment
[2360, 2421, 0]"] - %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 43[Solid2d] + 11["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 39["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 44[Solid2d] + end + subgraph path12 [Path] + 12["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 36["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 45[Solid2d] + end + subgraph path13 [Path] + 13["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 43["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 46[Solid2d] + end + subgraph path14 [Path] + 14["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 41["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 48[Solid2d] + end + subgraph path15 [Path] + 15["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 42["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 49[Solid2d] + end + subgraph path16 [Path] + 16["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 38["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 50[Solid2d] + end + subgraph path17 [Path] + 17["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 37["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 51[Solid2d] + end + subgraph path18 [Path] + 18["Path
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 40["Segment
[1663, 1707, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 1 }] + 52[Solid2d] end 1["Plane
[518, 535, 0]"] %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 2["Plane
[1641, 1658, 0]"] - %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit] - 46["Sweep Revolve
[1510, 1557, 0]"] + 2["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 3["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 4["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 5["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 6["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 7["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 8["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 9["Plane
[1638, 1655, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 0 }] + 53["Sweep Revolve
[1510, 1557, 0]"] %% [ProgramBodyItem { index: 1 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 19 }] - 47["Sweep Extrusion
[1736, 1758, 0]"] - %% [ProgramBodyItem { index: 3 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 48["Sweep Extrusion
[1835, 1857, 0]"] - %% [ProgramBodyItem { index: 4 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 49["Sweep Extrusion
[1935, 1957, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 50["Sweep Extrusion
[2032, 2054, 0]"] - %% [ProgramBodyItem { index: 6 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 51["Sweep Extrusion
[2130, 2152, 0]"] - %% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 52["Sweep Extrusion
[2228, 2250, 0]"] - %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 53["Sweep Extrusion
[2328, 2350, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 54["Sweep Extrusion
[2427, 2449, 0]"] - %% [ProgramBodyItem { index: 10 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 55["CompositeSolid Subtract
[2716, 2769, 0]"] - %% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit] - 56["CompositeSolid Union
[2680, 2703, 0]"] - %% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwArg { index: 0 }] - 57["CompositeSolid Union
[2615, 2638, 0]"] - %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwArg { index: 0 }] - 58["CompositeSolid Subtract
[2517, 2574, 0]"] - %% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit] - 59["CompositeSolid Subtract
[2586, 2639, 0]"] - %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit] - 60["CompositeSolid Union
[2550, 2573, 0]"] - %% [ProgramBodyItem { index: 11 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwArg { index: 0 }] - 61["CompositeSolid Subtract
[2651, 2704, 0]"] - %% [ProgramBodyItem { index: 13 }, VariableDeclarationDeclaration, VariableDeclarationInit] - 62["CompositeSolid Union
[2745, 2768, 0]"] - %% [ProgramBodyItem { index: 14 }, VariableDeclarationDeclaration, VariableDeclarationInit, CallKwArg { index: 0 }] + 54["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 55["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 56["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 57["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 58["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 59["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 60["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 61["Sweep Extrusion
[1715, 1737, 0]"] + %% [ProgramBodyItem { index: 2 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ReturnStatementArg, PipeBodyItem { index: 2 }] + 62["CompositeSolid Subtract
[2147, 2186, 0]"] + %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit] 63[Wall] %% face_code_ref=Missing NodePath 64[Wall] @@ -265,260 +265,253 @@ flowchart LR 150["SweepEdge Adjacent"] 151["SweepEdge Adjacent"] 152["SweepEdge Adjacent"] - 1 --- 3 - 2 --- 4 - 2 --- 5 - 2 --- 6 - 2 --- 7 - 2 --- 8 - 2 --- 9 - 2 --- 10 - 2 --- 11 - 3 --- 12 + 1 --- 10 + 2 --- 14 3 --- 13 - 3 --- 14 - 3 --- 15 - 3 --- 16 - 3 --- 17 - 3 --- 18 - 3 --- 19 - 3 --- 20 - 3 --- 21 - 3 --- 22 - 3 --- 23 - 3 --- 24 - 3 --- 25 - 3 --- 26 - 3 --- 27 - 3 --- 28 - 3 --- 42 - 3 ---- 46 - 3 --- 58 - 4 --- 29 - 4 --- 41 - 4 ---- 47 - 4 --- 60 - 5 --- 30 - 5 --- 44 - 5 ---- 48 - 5 --- 60 - 6 --- 31 - 6 --- 45 - 6 ---- 49 - 6 --- 57 - 7 --- 32 - 7 --- 39 - 7 ---- 50 - 7 --- 57 - 8 --- 33 - 8 --- 37 - 8 ---- 51 - 8 --- 56 - 9 --- 34 - 9 --- 38 - 9 ---- 52 - 9 --- 56 + 4 --- 18 + 5 --- 12 + 6 --- 15 + 7 --- 17 + 8 --- 16 + 9 --- 11 + 10 --- 19 + 10 --- 20 + 10 --- 21 + 10 --- 22 + 10 --- 23 + 10 --- 24 + 10 --- 25 + 10 --- 26 + 10 --- 27 + 10 --- 28 + 10 --- 29 + 10 --- 30 + 10 --- 31 + 10 --- 32 + 10 --- 33 + 10 --- 34 10 --- 35 - 10 --- 40 + 10 --- 47 10 ---- 53 10 --- 62 - 11 --- 36 - 11 --- 43 - 11 ---- 54 + 11 --- 39 + 11 --- 44 + 11 ---- 58 11 --- 62 - 12 --- 83 - 12 x--> 91 - 12 --- 113 - 12 --- 137 - 13 --- 78 - 13 x--> 91 - 13 --- 114 - 13 --- 138 - 14 --- 77 - 14 x--> 91 - 14 --- 115 - 14 --- 139 - 15 --- 79 - 15 x--> 91 - 15 --- 116 - 15 --- 140 - 16 --- 75 - 16 x--> 91 - 16 --- 117 - 16 --- 141 - 17 --- 74 - 17 x--> 91 - 17 --- 118 - 17 --- 142 - 18 --- 82 - 18 x--> 91 - 18 --- 119 - 18 --- 143 - 19 --- 85 - 19 x--> 91 - 19 --- 120 - 19 --- 144 - 20 --- 84 - 20 x--> 91 - 20 --- 121 - 20 --- 145 - 21 --- 72 - 21 x--> 91 - 21 --- 122 - 21 --- 146 - 22 --- 73 - 22 x--> 91 - 22 --- 123 - 22 --- 147 - 23 --- 86 - 23 x--> 91 - 23 --- 124 - 23 --- 148 - 24 --- 80 - 24 x--> 91 - 24 --- 125 - 24 --- 149 - 25 --- 76 - 25 x--> 91 - 25 --- 126 - 25 --- 150 - 26 --- 71 - 26 x--> 91 - 26 --- 127 - 26 --- 151 - 27 --- 81 - 27 x--> 91 - 27 --- 128 - 27 --- 152 - 29 --- 70 - 29 x--> 98 - 29 --- 112 - 29 --- 136 - 30 --- 64 - 30 x--> 102 - 30 --- 106 - 30 --- 130 - 31 --- 65 - 31 x--> 104 - 31 --- 107 - 31 --- 131 - 32 --- 68 - 32 x--> 97 - 32 --- 110 - 32 --- 134 - 33 --- 67 - 33 x--> 96 - 33 --- 109 - 33 --- 133 - 34 --- 63 - 34 x--> 103 - 34 --- 105 - 34 --- 129 - 35 --- 66 - 35 x--> 99 - 35 --- 108 - 35 --- 132 - 36 --- 69 - 36 x--> 101 - 36 --- 111 - 36 --- 135 - 46 --- 71 - 46 --- 72 - 46 --- 73 - 46 --- 74 - 46 --- 75 - 46 --- 76 - 46 --- 77 - 46 --- 78 - 46 --- 79 - 46 --- 80 - 46 --- 81 - 46 --- 82 - 46 --- 83 - 46 --- 84 - 46 --- 85 - 46 --- 86 - 46 --- 91 - 46 --- 100 - 46 --- 113 - 46 --- 114 - 46 --- 115 - 46 --- 116 - 46 --- 117 - 46 --- 118 - 46 --- 119 - 46 --- 120 - 46 --- 121 - 46 --- 122 - 46 --- 123 - 46 --- 124 - 46 --- 125 - 46 --- 126 - 46 --- 127 - 46 --- 128 - 46 --- 137 - 46 --- 138 - 46 --- 139 - 46 --- 140 - 46 --- 141 - 46 --- 142 - 46 --- 143 - 46 --- 144 - 46 --- 145 - 46 --- 146 - 46 --- 147 - 46 --- 148 - 46 --- 149 - 46 --- 150 - 46 --- 151 - 46 --- 152 - 47 --- 70 - 47 --- 89 - 47 --- 98 - 47 --- 112 - 47 --- 136 - 48 --- 64 - 48 --- 93 - 48 --- 102 - 48 --- 106 - 48 --- 130 - 49 --- 65 - 49 --- 95 - 49 --- 104 - 49 --- 107 - 49 --- 131 - 50 --- 68 - 50 --- 88 - 50 --- 97 - 50 --- 110 - 50 --- 134 - 51 --- 67 - 51 --- 87 - 51 --- 96 - 51 --- 109 - 51 --- 133 - 52 --- 63 - 52 --- 94 - 52 --- 103 - 52 --- 105 - 52 --- 129 - 53 --- 66 - 53 --- 90 - 53 --- 99 - 53 --- 108 - 53 --- 132 - 54 --- 69 - 54 --- 92 - 54 --- 101 - 54 --- 111 - 54 --- 135 - 61 --- 55 - 62 --- 55 - 56 --- 61 - 57 --- 59 - 58 --- 59 - 60 --- 58 - 59 --- 61 + 12 --- 36 + 12 --- 45 + 12 ---- 61 + 12 --- 62 + 13 --- 43 + 13 --- 46 + 13 ---- 56 + 13 --- 62 + 14 --- 41 + 14 --- 48 + 14 ---- 59 + 14 --- 62 + 15 --- 42 + 15 --- 49 + 15 ---- 54 + 15 --- 62 + 16 --- 38 + 16 --- 50 + 16 ---- 57 + 16 --- 62 + 17 --- 37 + 17 --- 51 + 17 ---- 55 + 17 --- 62 + 18 --- 40 + 18 --- 52 + 18 ---- 60 + 18 --- 62 + 19 --- 83 + 19 x--> 92 + 19 --- 113 + 19 --- 137 + 20 --- 78 + 20 x--> 92 + 20 --- 114 + 20 --- 138 + 21 --- 77 + 21 x--> 92 + 21 --- 115 + 21 --- 139 + 22 --- 79 + 22 x--> 92 + 22 --- 116 + 22 --- 140 + 23 --- 75 + 23 x--> 92 + 23 --- 117 + 23 --- 141 + 24 --- 74 + 24 x--> 92 + 24 --- 118 + 24 --- 142 + 25 --- 82 + 25 x--> 92 + 25 --- 119 + 25 --- 143 + 26 --- 85 + 26 x--> 92 + 26 --- 120 + 26 --- 144 + 27 --- 84 + 27 x--> 92 + 27 --- 121 + 27 --- 145 + 28 --- 72 + 28 x--> 92 + 28 --- 122 + 28 --- 146 + 29 --- 73 + 29 x--> 92 + 29 --- 123 + 29 --- 147 + 30 --- 86 + 30 x--> 92 + 30 --- 124 + 30 --- 148 + 31 --- 80 + 31 x--> 92 + 31 --- 125 + 31 --- 149 + 32 --- 76 + 32 x--> 92 + 32 --- 126 + 32 --- 150 + 33 --- 71 + 33 x--> 92 + 33 --- 127 + 33 --- 151 + 34 --- 81 + 34 x--> 92 + 34 --- 128 + 34 --- 152 + 36 --- 70 + 36 x--> 99 + 36 --- 112 + 36 --- 136 + 37 --- 64 + 37 x--> 98 + 37 --- 106 + 37 --- 130 + 38 --- 66 + 38 x--> 104 + 38 --- 108 + 38 --- 132 + 39 --- 67 + 39 x--> 102 + 39 --- 109 + 39 --- 133 + 40 --- 69 + 40 x--> 100 + 40 --- 111 + 40 --- 135 + 41 --- 68 + 41 x--> 103 + 41 --- 110 + 41 --- 134 + 42 --- 63 + 42 x--> 96 + 42 --- 105 + 42 --- 129 + 43 --- 65 + 43 x--> 97 + 43 --- 107 + 43 --- 131 + 53 --- 71 + 53 --- 72 + 53 --- 73 + 53 --- 74 + 53 --- 75 + 53 --- 76 + 53 --- 77 + 53 --- 78 + 53 --- 79 + 53 --- 80 + 53 --- 81 + 53 --- 82 + 53 --- 83 + 53 --- 84 + 53 --- 85 + 53 --- 86 + 53 --- 92 + 53 --- 101 + 53 --- 113 + 53 --- 114 + 53 --- 115 + 53 --- 116 + 53 --- 117 + 53 --- 118 + 53 --- 119 + 53 --- 120 + 53 --- 121 + 53 --- 122 + 53 --- 123 + 53 --- 124 + 53 --- 125 + 53 --- 126 + 53 --- 127 + 53 --- 128 + 53 --- 137 + 53 --- 138 + 53 --- 139 + 53 --- 140 + 53 --- 141 + 53 --- 142 + 53 --- 143 + 53 --- 144 + 53 --- 145 + 53 --- 146 + 53 --- 147 + 53 --- 148 + 53 --- 149 + 53 --- 150 + 53 --- 151 + 53 --- 152 + 54 --- 63 + 54 --- 87 + 54 --- 96 + 54 --- 105 + 54 --- 129 + 55 --- 64 + 55 --- 89 + 55 --- 98 + 55 --- 106 + 55 --- 130 + 56 --- 65 + 56 --- 88 + 56 --- 97 + 56 --- 107 + 56 --- 131 + 57 --- 66 + 57 --- 95 + 57 --- 104 + 57 --- 108 + 57 --- 132 + 58 --- 67 + 58 --- 93 + 58 --- 102 + 58 --- 109 + 58 --- 133 + 59 --- 68 + 59 --- 94 + 59 --- 103 + 59 --- 110 + 59 --- 134 + 60 --- 69 + 60 --- 91 + 60 --- 100 + 60 --- 111 + 60 --- 135 + 61 --- 70 + 61 --- 90 + 61 --- 99 + 61 --- 112 + 61 --- 136 63 --- 105 63 --- 129 64 --- 106 @@ -583,28 +576,28 @@ flowchart LR 86 --- 124 147 <--x 86 86 --- 148 - 109 <--x 87 - 110 <--x 88 - 112 <--x 89 - 108 <--x 90 - 111 <--x 92 - 106 <--x 93 - 105 <--x 94 - 107 <--x 95 - 113 <--x 100 - 114 <--x 100 - 115 <--x 100 - 116 <--x 100 - 117 <--x 100 - 118 <--x 100 - 119 <--x 100 - 120 <--x 100 - 121 <--x 100 - 122 <--x 100 - 123 <--x 100 - 124 <--x 100 - 125 <--x 100 - 126 <--x 100 - 127 <--x 100 - 128 <--x 100 + 105 <--x 87 + 107 <--x 88 + 106 <--x 89 + 112 <--x 90 + 111 <--x 91 + 109 <--x 93 + 110 <--x 94 + 108 <--x 95 + 113 <--x 101 + 114 <--x 101 + 115 <--x 101 + 116 <--x 101 + 117 <--x 101 + 118 <--x 101 + 119 <--x 101 + 120 <--x 101 + 121 <--x 101 + 122 <--x 101 + 123 <--x 101 + 124 <--x 101 + 125 <--x 101 + 126 <--x 101 + 127 <--x 101 + 128 <--x 101 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/bone-plate/ast.snap b/rust/kcl-lib/tests/kcl_samples/bone-plate/ast.snap index 4a349171f..21591c649 100644 --- a/rust/kcl-lib/tests/kcl_samples/bone-plate/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/bone-plate/ast.snap @@ -1731,7 +1731,7 @@ description: Result of parsing bone-plate.kcl "type": "NonCodeNode", "value": { "type": "newLineBlockComment", - "value": "Create a hole sketch with the size and location of each bolt hole", + "value": "Define a function to create and extrude holes", "style": "line" } } @@ -1765,11 +1765,580 @@ description: Result of parsing bone-plate.kcl "id": { "commentStart": 0, "end": 0, - "name": "holeSketch", + "name": "holeFn", "start": 0, "type": "Identifier" }, "init": { + "body": { + "body": [ + { + "argument": { + "body": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "XZ", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "diameter", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "boltSize", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "circle", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "100", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 100.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "extrude", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "commentStart": 0, + "end": 0, + "start": 0 + }, + "commentStart": 0, + "end": 0, + "params": [ + { + "type": "Parameter", + "identifier": { + "commentStart": 0, + "end": 0, + "name": "center", + "start": 0, + "type": "Identifier" + }, + "labeled": false + } + ], + "start": 0, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "holeCenters", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "12.25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 12.25, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "29.5", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 29.5, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "46.25", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 46.25, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "77", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 77.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "100", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 100.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "130", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 130.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "raw": "130", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 130.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } + }, + { + "commentStart": 0, + "end": 0, + "raw": "130", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 130.0, + "suffix": "None" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "", + "", + "// Create a hole sketch with the size and location of each bolt hole" + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "holes", + "start": 0, + "type": "Identifier" + }, + "init": { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "f", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "holeFn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], "callee": { "abs_path": false, "commentStart": 0, @@ -1777,7 +2346,7 @@ description: Result of parsing bone-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "startSketchOn", + "name": "map", "start": 0, "type": "Identifier" }, @@ -1797,7 +2366,7 @@ description: Result of parsing bone-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "XZ", + "name": "holeCenters", "start": 0, "type": "Identifier" }, @@ -1812,6 +2381,11 @@ description: Result of parsing bone-plate.kcl }, "end": 0, "kind": "const", + "preComments": [ + "", + "", + "// Use map to apply the hole creation function to the list of center coordinates" + ], "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" @@ -1824,1745 +2398,7 @@ description: Result of parsing bone-plate.kcl "id": { "commentStart": 0, "end": 0, - "name": "hole01", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "12.25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 12.25, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole02", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "29.5", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 29.5, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole03", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "46.25", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 46.25, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole04", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "77", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 77.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole05", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole06", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "130", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 130.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole07", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "20", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "raw": "130", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 130.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "hole08", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "center", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "20", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 20.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "130", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 130.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "radius", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "boltSize", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "circle", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "holeSketch", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "length", - "start": 0, - "type": "Identifier" - }, - "arg": { - "argument": { - "commentStart": 0, - "end": 0, - "raw": "100", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 100.0, - "suffix": "None" - } - }, - "commentStart": 0, - "end": 0, - "operator": "-", - "start": 0, - "type": "UnaryExpression", - "type": "UnaryExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "extrude", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "nonCodeMeta": { - "nonCodeNodes": { - "1": [ - { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "NonCodeNode", - "value": { - "type": "newLineBlockComment", - "value": "Cut each guiding clearance hole from the bone plate", - "style": "line" - } - } - ] - }, - "startNodes": [] - }, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "solid001", + "name": "solid", "start": 0, "type": "Identifier" }, @@ -3578,67 +2414,20 @@ description: Result of parsing bone-plate.kcl "type": "Identifier" }, "arg": { - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "union", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, + "abs_path": false, "commentStart": 0, "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { + "name": { "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole01", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole02", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], "end": 0, + "name": "holes", "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" } } ], @@ -3693,435 +2482,11 @@ description: Result of parsing bone-plate.kcl }, "end": 0, "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "solid002", - "start": 0, - "type": "Identifier" - }, - "init": { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tools", - "start": 0, - "type": "Identifier" - }, - "arg": { - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "union", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole03", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole04", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "subtract", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "solid001", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "solid003", - "start": 0, - "type": "Identifier" - }, - "init": { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tools", - "start": 0, - "type": "Identifier" - }, - "arg": { - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "union", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole05", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole06", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "subtract", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "solid002", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "solid004", - "start": 0, - "type": "Identifier" - }, - "init": { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tools", - "start": 0, - "type": "Identifier" - }, - "arg": { - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "union", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole07", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "hole08", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "subtract", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "elements": [ - { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "solid003", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", + "preComments": [ + "", + "", + "// Cut each guiding clearance hole from the bone plate using a single subtract operation" + ], "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" diff --git a/rust/kcl-lib/tests/kcl_samples/bone-plate/ops.snap b/rust/kcl-lib/tests/kcl_samples/bone-plate/ops.snap index d8d3b3d41..8892d4a79 100644 --- a/rust/kcl-lib/tests/kcl_samples/bone-plate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/bone-plate/ops.snap @@ -138,6 +138,97 @@ description: Operations executed bone-plate.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", @@ -394,6 +485,358 @@ description: Operations executed bone-plate.kcl }, "sourceRange": [] }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 12.25, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 29.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 46.25, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 77.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 100.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": -20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": null, + "functionSourceRange": [], + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": {} + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "subtract", @@ -414,10 +857,57 @@ description: Operations executed bone-plate.kcl "labeledArgs": { "tools": { "value": { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] }, "sourceRange": [] } @@ -425,197 +915,27 @@ description: Operations executed bone-plate.kcl "sourceRange": [] }, { - "type": "StdLibCall", - "name": "union", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": {}, - "sourceRange": [] + "type": "GroupEnd" }, { - "type": "StdLibCall", - "name": "subtract", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": { - "tools": { - "value": { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - } - }, - "sourceRange": [] + "type": "GroupEnd" }, { - "type": "StdLibCall", - "name": "union", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": {}, - "sourceRange": [] + "type": "GroupEnd" }, { - "type": "StdLibCall", - "name": "subtract", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": { - "tools": { - "value": { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - } - }, - "sourceRange": [] + "type": "GroupEnd" }, { - "type": "StdLibCall", - "name": "union", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": {}, - "sourceRange": [] + "type": "GroupEnd" }, { - "type": "StdLibCall", - "name": "subtract", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": { - "tools": { - "value": { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - "sourceRange": [] - } - }, - "sourceRange": [] + "type": "GroupEnd" }, { - "type": "StdLibCall", - "name": "union", - "unlabeledArg": { - "value": { - "type": "Array", - "value": [ - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - }, - { - "type": "Solid", - "value": { - "artifactId": "[uuid]" - } - } - ] - }, - "sourceRange": [] - }, - "labeledArgs": {}, - "sourceRange": [] + "type": "GroupEnd" + }, + { + "type": "GroupEnd" } ] diff --git a/rust/kcl-lib/tests/kcl_samples/bone-plate/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/bone-plate/program_memory.snap index d0c15876e..57d3e22e3 100644 --- a/rust/kcl-lib/tests/kcl_samples/bone-plate/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/bone-plate/program_memory.snap @@ -16,901 +16,1131 @@ description: Variables in memory after executing bone-plate.kcl } } }, - "hole01": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ + "holeCenters": { + "type": "HomArray", + "value": [ + { + "type": "HomArray", + "value": [ { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 0.0, - 12.25 - ], - "from": [ - 2.25, - 12.25 - ], - "radius": 2.25, - "tag": null, - "to": [ - 2.25, - 12.25 - ], - "type": "Circle", - "units": { - "type": "Mm" + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 12.25, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } } } - ], - "on": { - "artifactId": "[uuid]", + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 29.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 46.25, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 77.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 100.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": -20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + { + "type": "HomArray", + "value": [ + { + "type": "Number", + "value": 20.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + ] + }, + "holeFn": { + "type": "Function", + "value": null + }, + "holes": { + "type": "HomArray", + "value": [ + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "artifactId": "[uuid]", + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 12.25 + ], + "from": [ + 2.25, + 12.25 + ], + "radius": 2.25, + "tag": null, + "to": [ + 2.25, + 12.25 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 2.25, + 12.25 + ], + "to": [ + 2.25, + 12.25 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 2.25, - 12.25 - ], - "to": [ - 2.25, - 12.25 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole02": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 0.0, - 29.5 - ], - "from": [ - 2.25, - 29.5 - ], - "radius": 2.25, - "tag": null, - "to": [ - 2.25, - 29.5 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 29.5 + ], + "from": [ + 2.25, + 29.5 + ], + "radius": 2.25, + "tag": null, + "to": [ + 2.25, + 29.5 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 2.25, + 29.5 + ], + "to": [ + 2.25, + 29.5 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 2.25, - 29.5 - ], - "to": [ - 2.25, - 29.5 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole03": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 0.0, - 46.25 - ], - "from": [ - 2.25, - 46.25 - ], - "radius": 2.25, - "tag": null, - "to": [ - 2.25, - 46.25 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 46.25 + ], + "from": [ + 2.25, + 46.25 + ], + "radius": 2.25, + "tag": null, + "to": [ + 2.25, + 46.25 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 2.25, + 46.25 + ], + "to": [ + 2.25, + 46.25 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 2.25, - 46.25 - ], - "to": [ - 2.25, - 46.25 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole04": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 0.0, - 77.0 - ], - "from": [ - 2.25, - 77.0 - ], - "radius": 2.25, - "tag": null, - "to": [ - 2.25, - 77.0 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 77.0 + ], + "from": [ + 2.25, + 77.0 + ], + "radius": 2.25, + "tag": null, + "to": [ + 2.25, + 77.0 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 2.25, + 77.0 + ], + "to": [ + 2.25, + 77.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 2.25, - 77.0 - ], - "to": [ - 2.25, - 77.0 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole05": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 0.0, - 100.0 - ], - "from": [ - 2.25, - 100.0 - ], - "radius": 2.25, - "tag": null, - "to": [ - 2.25, - 100.0 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 100.0 + ], + "from": [ + 2.25, + 100.0 + ], + "radius": 2.25, + "tag": null, + "to": [ + 2.25, + 100.0 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 2.25, + 100.0 + ], + "to": [ + 2.25, + 100.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 2.25, - 100.0 - ], - "to": [ - 2.25, - 100.0 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole06": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 0.0, - 130.0 - ], - "from": [ - 2.25, - 130.0 - ], - "radius": 2.25, - "tag": null, - "to": [ - 2.25, - 130.0 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 0.0, + 130.0 + ], + "from": [ + 2.25, + 130.0 + ], + "radius": 2.25, + "tag": null, + "to": [ + 2.25, + 130.0 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 2.25, + 130.0 + ], + "to": [ + 2.25, + 130.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 2.25, - 130.0 - ], - "to": [ - 2.25, - 130.0 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole07": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - -20.0, - 130.0 - ], - "from": [ - -17.75, - 130.0 - ], - "radius": 2.25, - "tag": null, - "to": [ - -17.75, - 130.0 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + -20.0, + 130.0 + ], + "from": [ + -17.75, + 130.0 + ], + "radius": 2.25, + "tag": null, + "to": [ + -17.75, + 130.0 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + -17.75, + 130.0 + ], + "to": [ + -17.75, + 130.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - -17.75, - 130.0 - ], - "to": [ - -17.75, - 130.0 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" + "sectional": false } }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "hole08": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", + { + "type": "Solid", + "value": { + "type": "Solid", "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 20.0, - 130.0 - ], - "from": [ - 22.25, - 130.0 - ], - "radius": 2.25, - "tag": null, - "to": [ - 22.25, - 130.0 - ], - "type": "Circle", - "units": { - "type": "Mm" - } - } - ], - "on": { "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, + "value": [ + { + "faceId": "[uuid]", + "id": "[uuid]", + "sourceRange": [], + "tag": null, + "type": "extrudeArc" + } + ], + "sketch": { + "type": "Sketch", + "id": "[uuid]", + "paths": [ + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "ccw": true, + "center": [ + 20.0, + 130.0 + ], + "from": [ + 22.25, + 130.0 + ], + "radius": 2.25, + "tag": null, + "to": [ + 22.25, + 130.0 + ], + "type": "Circle", + "units": { + "type": "Mm" + } + } + ], + "on": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "type": "plane", + "value": "XZ", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 0.0, + "z": 1.0, + "units": { + "type": "Unknown" + } + } + }, + "start": { + "from": [ + 22.25, + 130.0 + ], + "to": [ + 22.25, + 130.0 + ], + "units": { + "type": "Mm" + }, + "tag": null, + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + } + }, + "artifactId": "[uuid]", + "originalId": "[uuid]", "units": { "type": "Mm" } }, - "type": "plane", - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 22.25, - 130.0 - ], - "to": [ - 22.25, - 130.0 - ], + "height": -100.0, + "startCapId": "[uuid]", + "endCapId": "[uuid]", "units": { "type": "Mm" }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" - } - }, - "height": -100.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "holeSketch": { - "type": "Plane", - "value": { - "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Mm" - } - }, - "value": "XZ", - "xAxis": { - "x": 1.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" + "sectional": false } } - } + ] }, "plateRevolve": { "type": "Solid", @@ -1555,1891 +1785,7 @@ description: Variables in memory after executing bone-plate.kcl "type": "TagIdentifier", "value": "seg03" }, - "solid001": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1064, - "end": 1070, - "start": 1064, - "type": "TagDeclarator", - "value": "seg01" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1189, - "end": 1195, - "start": 1189, - "type": "TagDeclarator", - "value": "seg02" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1361, - "end": 1367, - "start": 1361, - "type": "TagDeclarator", - "value": "seg03" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 142.9, - -0.0 - ], - "from": [ - 22.9, - 0.0 - ], - "radius": 120.0, - "tag": null, - "to": [ - 23.192, - 8.371 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 20.692, - 12.701 - ], - "from": [ - 23.192, - 8.371 - ], - "radius": 5.0, - "tag": null, - "to": [ - 23.631, - 16.746 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 143.631, - 16.746 - ], - "from": [ - 23.631, - 16.746 - ], - "radius": 120.0, - "tag": null, - "to": [ - 23.924, - 25.117 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 21.424, - 29.447 - ], - "from": [ - 23.924, - 25.117 - ], - "radius": 5.0, - "tag": null, - "to": [ - 24.362, - 33.492 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 144.362, - 33.492 - ], - "from": [ - 24.362, - 33.492 - ], - "radius": 120.0, - "tag": null, - "to": [ - 24.655, - 41.863 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 22.155, - 46.193 - ], - "from": [ - 24.655, - 41.863 - ], - "radius": 5.0, - "tag": null, - "to": [ - 25.094, - 50.238 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 195.094, - 50.238 - ], - "from": [ - 25.094, - 50.238 - ], - "radius": 170.0, - "tag": null, - "to": [ - 26.025, - 68.008 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 56.883, - 64.764 - ], - "from": [ - 26.025, - 68.008 - ], - "tag": null, - "to": [ - 41.8, - 91.88 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 27.493, - 117.6 - ], - "from": [ - 41.8, - 91.88 - ], - "tag": { - "commentStart": 1064, - "end": 1070, - "start": 1064, - "type": "TagDeclarator", - "value": "seg01" - }, - "to": [ - 56.92, - 117.08 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 56.92, - 117.08 - ], - "tag": null, - "to": [ - 57.33, - 140.236 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 59.137, - 140.204 - ], - "from": [ - 57.33, - 140.236 - ], - "tag": { - "commentStart": 1189, - "end": 1195, - "start": 1189, - "type": "TagDeclarator", - "value": "seg02" - }, - "to": [ - 60.93, - 140.44 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 60.93, - 140.44 - ], - "tag": null, - "to": [ - 64.272, - 115.009 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 35.921, - 111.283 - ], - "from": [ - 64.272, - 115.009 - ], - "tag": null, - "to": [ - 48.35, - 85.53 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 58.669, - 64.149 - ], - "from": [ - 48.35, - 85.53 - ], - "tag": { - "commentStart": 1361, - "end": 1367, - "start": 1361, - "type": "TagDeclarator", - "value": "seg03" - }, - "to": [ - 35.2, - 67.73 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 35.2, - 67.73 - ], - "tag": null, - "to": [ - 27.8, - 19.231 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 27.8, - 19.231 - ], - "tag": null, - "to": [ - 22.9, - 0.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 22.9, - 0.0 - ], - "tag": null, - "to": [ - 22.9, - 0.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - } - ], - "on": { - "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Mm" - } - }, - "type": "plane", - "value": "YZ", - "xAxis": { - "x": 0.0, - "y": 1.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 22.9, - 0.0 - ], - "to": [ - 22.9, - 0.0 - ], - "units": { - "type": "Mm" - }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "tags": { - "seg01": { - "type": "TagIdentifier", - "value": "seg01" - }, - "seg02": { - "type": "TagIdentifier", - "value": "seg02" - }, - "seg03": { - "type": "TagIdentifier", - "value": "seg03" - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" - } - }, - "height": 0.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "solid002": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1064, - "end": 1070, - "start": 1064, - "type": "TagDeclarator", - "value": "seg01" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1189, - "end": 1195, - "start": 1189, - "type": "TagDeclarator", - "value": "seg02" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1361, - "end": 1367, - "start": 1361, - "type": "TagDeclarator", - "value": "seg03" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 142.9, - -0.0 - ], - "from": [ - 22.9, - 0.0 - ], - "radius": 120.0, - "tag": null, - "to": [ - 23.192, - 8.371 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 20.692, - 12.701 - ], - "from": [ - 23.192, - 8.371 - ], - "radius": 5.0, - "tag": null, - "to": [ - 23.631, - 16.746 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 143.631, - 16.746 - ], - "from": [ - 23.631, - 16.746 - ], - "radius": 120.0, - "tag": null, - "to": [ - 23.924, - 25.117 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 21.424, - 29.447 - ], - "from": [ - 23.924, - 25.117 - ], - "radius": 5.0, - "tag": null, - "to": [ - 24.362, - 33.492 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 144.362, - 33.492 - ], - "from": [ - 24.362, - 33.492 - ], - "radius": 120.0, - "tag": null, - "to": [ - 24.655, - 41.863 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 22.155, - 46.193 - ], - "from": [ - 24.655, - 41.863 - ], - "radius": 5.0, - "tag": null, - "to": [ - 25.094, - 50.238 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 195.094, - 50.238 - ], - "from": [ - 25.094, - 50.238 - ], - "radius": 170.0, - "tag": null, - "to": [ - 26.025, - 68.008 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 56.883, - 64.764 - ], - "from": [ - 26.025, - 68.008 - ], - "tag": null, - "to": [ - 41.8, - 91.88 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 27.493, - 117.6 - ], - "from": [ - 41.8, - 91.88 - ], - "tag": { - "commentStart": 1064, - "end": 1070, - "start": 1064, - "type": "TagDeclarator", - "value": "seg01" - }, - "to": [ - 56.92, - 117.08 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 56.92, - 117.08 - ], - "tag": null, - "to": [ - 57.33, - 140.236 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 59.137, - 140.204 - ], - "from": [ - 57.33, - 140.236 - ], - "tag": { - "commentStart": 1189, - "end": 1195, - "start": 1189, - "type": "TagDeclarator", - "value": "seg02" - }, - "to": [ - 60.93, - 140.44 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 60.93, - 140.44 - ], - "tag": null, - "to": [ - 64.272, - 115.009 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 35.921, - 111.283 - ], - "from": [ - 64.272, - 115.009 - ], - "tag": null, - "to": [ - 48.35, - 85.53 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 58.669, - 64.149 - ], - "from": [ - 48.35, - 85.53 - ], - "tag": { - "commentStart": 1361, - "end": 1367, - "start": 1361, - "type": "TagDeclarator", - "value": "seg03" - }, - "to": [ - 35.2, - 67.73 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 35.2, - 67.73 - ], - "tag": null, - "to": [ - 27.8, - 19.231 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 27.8, - 19.231 - ], - "tag": null, - "to": [ - 22.9, - 0.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 22.9, - 0.0 - ], - "tag": null, - "to": [ - 22.9, - 0.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - } - ], - "on": { - "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Mm" - } - }, - "type": "plane", - "value": "YZ", - "xAxis": { - "x": 0.0, - "y": 1.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 22.9, - 0.0 - ], - "to": [ - 22.9, - 0.0 - ], - "units": { - "type": "Mm" - }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "tags": { - "seg01": { - "type": "TagIdentifier", - "value": "seg01" - }, - "seg02": { - "type": "TagIdentifier", - "value": "seg02" - }, - "seg03": { - "type": "TagIdentifier", - "value": "seg03" - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" - } - }, - "height": 0.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "solid003": { - "type": "Solid", - "value": { - "type": "Solid", - "id": "[uuid]", - "artifactId": "[uuid]", - "value": [ - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1064, - "end": 1070, - "start": 1064, - "type": "TagDeclarator", - "value": "seg01" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1189, - "end": 1195, - "start": 1189, - "type": "TagDeclarator", - "value": "seg02" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": { - "commentStart": 1361, - "end": 1367, - "start": 1361, - "type": "TagDeclarator", - "value": "seg03" - }, - "type": "extrudeArc" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - }, - { - "faceId": "[uuid]", - "id": "[uuid]", - "sourceRange": [], - "tag": null, - "type": "extrudePlane" - } - ], - "sketch": { - "type": "Sketch", - "id": "[uuid]", - "paths": [ - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 142.9, - -0.0 - ], - "from": [ - 22.9, - 0.0 - ], - "radius": 120.0, - "tag": null, - "to": [ - 23.192, - 8.371 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 20.692, - 12.701 - ], - "from": [ - 23.192, - 8.371 - ], - "radius": 5.0, - "tag": null, - "to": [ - 23.631, - 16.746 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 143.631, - 16.746 - ], - "from": [ - 23.631, - 16.746 - ], - "radius": 120.0, - "tag": null, - "to": [ - 23.924, - 25.117 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 21.424, - 29.447 - ], - "from": [ - 23.924, - 25.117 - ], - "radius": 5.0, - "tag": null, - "to": [ - 24.362, - 33.492 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 144.362, - 33.492 - ], - "from": [ - 24.362, - 33.492 - ], - "radius": 120.0, - "tag": null, - "to": [ - 24.655, - 41.863 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 22.155, - 46.193 - ], - "from": [ - 24.655, - 41.863 - ], - "radius": 5.0, - "tag": null, - "to": [ - 25.094, - 50.238 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 195.094, - 50.238 - ], - "from": [ - 25.094, - 50.238 - ], - "radius": 170.0, - "tag": null, - "to": [ - 26.025, - 68.008 - ], - "type": "Arc", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 56.883, - 64.764 - ], - "from": [ - 26.025, - 68.008 - ], - "tag": null, - "to": [ - 41.8, - 91.88 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 27.493, - 117.6 - ], - "from": [ - 41.8, - 91.88 - ], - "tag": { - "commentStart": 1064, - "end": 1070, - "start": 1064, - "type": "TagDeclarator", - "value": "seg01" - }, - "to": [ - 56.92, - 117.08 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 56.92, - 117.08 - ], - "tag": null, - "to": [ - 57.33, - 140.236 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 59.137, - 140.204 - ], - "from": [ - 57.33, - 140.236 - ], - "tag": { - "commentStart": 1189, - "end": 1195, - "start": 1189, - "type": "TagDeclarator", - "value": "seg02" - }, - "to": [ - 60.93, - 140.44 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 60.93, - 140.44 - ], - "tag": null, - "to": [ - 64.272, - 115.009 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": false, - "center": [ - 35.921, - 111.283 - ], - "from": [ - 64.272, - 115.009 - ], - "tag": null, - "to": [ - 48.35, - 85.53 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "ccw": true, - "center": [ - 58.669, - 64.149 - ], - "from": [ - 48.35, - 85.53 - ], - "tag": { - "commentStart": 1361, - "end": 1367, - "start": 1361, - "type": "TagDeclarator", - "value": "seg03" - }, - "to": [ - 35.2, - 67.73 - ], - "type": "TangentialArcTo", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 35.2, - 67.73 - ], - "tag": null, - "to": [ - 27.8, - 19.231 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 27.8, - 19.231 - ], - "tag": null, - "to": [ - 22.9, - 0.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 22.9, - 0.0 - ], - "tag": null, - "to": [ - 22.9, - 0.0 - ], - "type": "ToPoint", - "units": { - "type": "Mm" - } - } - ], - "on": { - "artifactId": "[uuid]", - "id": "[uuid]", - "origin": { - "x": 0.0, - "y": 0.0, - "z": 0.0, - "units": { - "type": "Mm" - } - }, - "type": "plane", - "value": "YZ", - "xAxis": { - "x": 0.0, - "y": 1.0, - "z": 0.0, - "units": { - "type": "Unknown" - } - }, - "yAxis": { - "x": 0.0, - "y": 0.0, - "z": 1.0, - "units": { - "type": "Unknown" - } - } - }, - "start": { - "from": [ - 22.9, - 0.0 - ], - "to": [ - 22.9, - 0.0 - ], - "units": { - "type": "Mm" - }, - "tag": null, - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - } - }, - "tags": { - "seg01": { - "type": "TagIdentifier", - "value": "seg01" - }, - "seg02": { - "type": "TagIdentifier", - "value": "seg02" - }, - "seg03": { - "type": "TagIdentifier", - "value": "seg03" - } - }, - "artifactId": "[uuid]", - "originalId": "[uuid]", - "units": { - "type": "Mm" - } - }, - "height": 0.0, - "startCapId": "[uuid]", - "endCapId": "[uuid]", - "units": { - "type": "Mm" - }, - "sectional": false - } - }, - "solid004": { + "solid": { "type": "Solid", "value": { "type": "Solid", diff --git a/rust/kcl-lib/tests/kcl_samples/bottle/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/bottle/artifact_graph_flowchart.snap.md index 5e4d6228f..9248d327a 100644 --- a/rust/kcl-lib/tests/kcl_samples/bottle/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/bottle/artifact_graph_flowchart.snap.md @@ -87,20 +87,20 @@ flowchart LR 27 --- 4 8 --- 20 8 x--> 25 - 8 --- 29 - 8 --- 35 + 8 --- 31 + 8 --- 37 9 --- 21 9 x--> 25 9 --- 33 9 --- 39 10 --- 22 10 x--> 25 - 10 --- 30 - 10 --- 36 + 10 --- 29 + 10 --- 35 11 --- 23 11 x--> 25 - 11 --- 31 - 11 --- 37 + 11 --- 30 + 11 --- 36 12 --- 24 12 x--> 25 12 --- 32 @@ -132,18 +132,18 @@ flowchart LR 18 --- 34 19 --- 28 19 --- 34 - 20 --- 29 - 20 --- 35 - 36 <--x 20 + 20 --- 31 + 20 --- 37 + 38 <--x 20 21 --- 33 35 <--x 21 21 --- 39 - 22 --- 30 - 22 --- 36 - 37 <--x 22 - 23 --- 31 - 23 --- 37 - 38 <--x 23 + 22 --- 29 + 22 --- 35 + 36 <--x 22 + 23 --- 30 + 23 --- 36 + 37 <--x 23 24 --- 32 24 --- 38 39 <--x 24 diff --git a/rust/kcl-lib/tests/kcl_samples/brake-rotor/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/brake-rotor/artifact_graph_flowchart.snap.md index 8522c246a..3a04bb5a6 100644 --- a/rust/kcl-lib/tests/kcl_samples/brake-rotor/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/brake-rotor/artifact_graph_flowchart.snap.md @@ -213,7 +213,8 @@ flowchart LR 109["SweepEdge Adjacent"] 110["SweepEdge Adjacent"] 111["SweepEdge Adjacent"] - 112["EdgeCut Fillet
[3014, 3304, 0]"] + 112["SweepEdge Adjacent"] + 113["EdgeCut Fillet
[3014, 3304, 0]"] %% [ProgramBodyItem { index: 26 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] 1 --- 8 1 --- 9 @@ -277,7 +278,7 @@ flowchart LR 27 --- 83 27 x--> 86 27 --- 96 - 27 --- 111 + 27 --- 112 28 --- 68 28 x--> 85 28 --- 90 @@ -300,31 +301,31 @@ flowchart LR 34 --- 98 62 <--x 36 36 --- 78 - 36 x--> 103 + 36 --- 103 62 <--x 37 37 --- 77 - 37 --- 103 + 37 --- 104 62 <--x 38 38 --- 82 - 38 --- 104 + 38 --- 105 62 <--x 39 39 --- 79 - 39 --- 105 + 39 --- 106 62 <--x 40 40 --- 74 - 40 --- 106 + 40 --- 107 62 <--x 41 41 --- 81 - 41 --- 107 + 41 --- 108 62 <--x 42 42 --- 76 - 42 --- 108 + 42 --- 109 62 <--x 43 43 --- 75 - 43 --- 109 + 43 --- 110 62 <--x 44 44 --- 80 - 44 --- 110 + 44 --- 111 45 --- 73 45 x--> 82 45 --- 95 @@ -338,7 +339,7 @@ flowchart LR 60 --- 86 60 --- 89 60 --- 96 - 60 --- 111 + 60 --- 112 61 --- 69 61 --- 70 61 --- 71 @@ -370,6 +371,7 @@ flowchart LR 62 --- 108 62 --- 109 62 --- 110 + 62 --- 111 64 --- 73 64 --- 95 64 --- 102 @@ -390,29 +392,31 @@ flowchart LR 73 --- 95 73 --- 102 95 <--x 74 - 105 <--x 74 - 74 --- 106 - 108 <--x 75 - 75 --- 109 - 107 <--x 76 - 76 --- 108 - 77 --- 103 + 106 <--x 74 + 74 --- 107 + 109 <--x 75 + 75 --- 110 + 108 <--x 76 + 76 --- 109 + 103 <--x 77 + 77 --- 104 78 --- 103 - 110 <--x 78 - 104 <--x 79 - 79 --- 105 - 109 <--x 80 - 80 --- 110 - 106 <--x 81 - 81 --- 107 - 82 --- 104 + 111 <--x 78 + 105 <--x 79 + 79 --- 106 + 110 <--x 80 + 80 --- 111 + 107 <--x 81 + 81 --- 108 + 104 <--x 82 + 82 --- 105 83 --- 96 - 83 --- 111 + 83 --- 112 91 <--x 87 92 <--x 87 93 <--x 87 94 <--x 87 90 <--x 88 96 <--x 89 - 98 <--x 112 + 98 <--x 113 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md index 9680b70cb..e538ef4c1 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/artifact_graph_flowchart.snap.md @@ -647,6 +647,7 @@ flowchart LR 481["SweepEdge Adjacent"] 482["SweepEdge Adjacent"] 483["SweepEdge Adjacent"] + 484["SweepEdge Adjacent"] 1 --- 11 1 --- 12 2 --- 17 @@ -828,7 +829,7 @@ flowchart LR 36 --- 286 36 x--> 330 36 --- 373 - 36 --- 447 + 36 --- 448 38 --- 224 38 x--> 341 38 --- 342 @@ -836,7 +837,7 @@ flowchart LR 39 --- 317 39 x--> 332 39 --- 380 - 39 --- 478 + 39 --- 479 176 <--x 40 40 --- 247 40 --- 408 @@ -864,167 +865,167 @@ flowchart LR 50 --- 264 50 x--> 339 50 --- 366 - 50 --- 426 + 50 --- 427 51 --- 291 51 x--> 326 51 --- 378 - 51 --- 452 + 51 --- 453 52 --- 290 52 x--> 326 52 --- 377 - 52 --- 451 + 52 --- 452 53 --- 265 53 x--> 339 53 --- 365 - 53 --- 425 + 53 --- 426 54 --- 288 54 x--> 326 54 --- 376 - 54 --- 450 + 54 --- 451 55 --- 263 55 x--> 339 55 --- 364 - 55 --- 424 + 55 --- 425 56 --- 262 56 x--> 339 56 --- 363 - 56 --- 423 + 56 --- 424 57 --- 289 57 x--> 326 57 --- 375 - 57 --- 449 + 57 --- 450 180 <--x 60 60 --- 308 - 60 --- 454 + 60 --- 455 180 <--x 61 61 --- 310 - 61 --- 455 + 61 --- 456 180 <--x 62 62 --- 311 - 62 --- 456 + 62 --- 457 180 <--x 63 63 --- 301 - 63 --- 457 + 63 --- 458 180 <--x 64 64 --- 316 - 64 --- 458 + 64 --- 459 180 <--x 65 65 --- 315 - 65 --- 459 + 65 --- 460 180 <--x 66 66 --- 295 - 66 --- 460 + 66 --- 461 180 <--x 67 67 --- 303 - 67 --- 461 + 67 --- 462 180 <--x 68 68 --- 297 - 68 --- 462 + 68 --- 463 180 <--x 69 69 --- 300 - 69 --- 463 + 69 --- 464 180 <--x 70 70 --- 309 - 70 --- 464 + 70 --- 465 180 <--x 71 71 --- 298 - 71 --- 465 + 71 --- 466 180 <--x 72 72 --- 293 - 72 --- 466 + 72 --- 467 180 <--x 73 73 --- 294 - 73 --- 467 + 73 --- 468 180 <--x 74 74 --- 305 - 74 --- 468 + 74 --- 469 180 <--x 75 75 --- 306 - 75 --- 469 + 75 --- 470 180 <--x 76 76 --- 307 - 76 --- 470 + 76 --- 471 180 <--x 77 77 --- 296 - 77 --- 471 + 77 --- 472 180 <--x 78 78 --- 302 - 78 --- 472 + 78 --- 473 180 <--x 79 79 --- 304 - 79 --- 473 + 79 --- 474 180 <--x 80 80 --- 313 - 80 --- 474 + 80 --- 475 180 <--x 81 81 --- 299 - 81 --- 475 + 81 --- 476 180 <--x 82 82 --- 312 - 82 --- 476 + 82 --- 477 180 <--x 83 83 --- 314 - 83 --- 477 + 83 --- 478 84 --- 285 84 x--> 324 84 --- 372 - 84 --- 446 + 84 --- 447 85 --- 280 85 x--> 333 85 --- 367 - 85 --- 441 + 85 --- 442 86 --- 260 86 x--> 338 86 --- 361 - 86 --- 421 + 86 --- 422 87 --- 292 87 x--> 324 87 --- 379 - 87 --- 453 + 87 --- 454 88 --- 322 88 x--> 329 88 --- 385 - 88 --- 483 + 88 --- 484 89 --- 261 89 x--> 340 89 --- 362 - 89 --- 422 + 89 --- 423 90 --- 287 90 x--> 324 90 --- 374 - 90 --- 448 + 90 --- 449 91 --- 282 91 x--> 324 91 --- 368 - 91 --- 442 + 91 --- 443 92 --- 281 92 x--> 324 92 --- 369 - 92 --- 443 + 92 --- 444 93 --- 283 93 x--> 324 93 --- 370 - 93 --- 444 + 93 --- 445 94 --- 284 94 x--> 324 94 --- 371 - 94 --- 445 + 94 --- 446 96 --- 318 96 x--> 340 96 --- 384 - 96 --- 482 + 96 --- 483 97 --- 321 97 x--> 340 97 --- 383 - 97 --- 481 + 97 --- 482 98 --- 320 98 x--> 340 98 --- 382 - 98 --- 480 + 98 --- 481 99 --- 319 99 x--> 340 99 --- 381 - 99 --- 479 + 99 --- 480 101 --- 233 101 x--> 337 101 --- 343 @@ -1095,73 +1096,73 @@ flowchart LR 117 --- 403 222 <--x 118 118 --- 252 - 118 x--> 413 + 118 --- 413 222 <--x 119 119 --- 255 - 119 --- 413 + 119 --- 414 222 <--x 120 120 --- 259 - 120 --- 414 + 120 --- 415 222 <--x 121 121 --- 253 - 121 --- 415 + 121 --- 416 222 <--x 122 122 --- 256 - 122 --- 416 + 122 --- 417 222 <--x 123 123 --- 257 - 123 --- 417 + 123 --- 418 222 <--x 124 124 --- 254 - 124 --- 418 + 124 --- 419 222 <--x 125 125 --- 258 - 125 --- 419 + 125 --- 420 222 <--x 126 126 --- 251 - 126 --- 420 + 126 --- 421 223 <--x 127 127 --- 275 - 127 --- 427 + 127 --- 428 223 <--x 128 128 --- 277 - 128 --- 428 + 128 --- 429 223 <--x 129 129 --- 269 - 129 --- 429 + 129 --- 430 223 <--x 130 130 --- 276 - 130 --- 430 + 130 --- 431 223 <--x 131 131 --- 266 - 131 --- 431 + 131 --- 432 223 <--x 132 132 --- 279 - 132 --- 432 + 132 --- 433 223 <--x 133 133 --- 270 - 133 --- 433 + 133 --- 434 223 <--x 134 134 --- 278 - 134 --- 434 + 134 --- 435 223 <--x 135 135 --- 267 - 135 --- 435 + 135 --- 436 223 <--x 136 136 --- 271 - 136 --- 436 + 136 --- 437 223 <--x 137 137 --- 268 - 137 --- 437 + 137 --- 438 223 <--x 138 138 --- 273 - 138 --- 438 + 138 --- 439 223 <--x 139 139 --- 274 - 139 --- 439 + 139 --- 440 223 <--x 140 140 --- 272 - 140 --- 440 + 140 --- 441 164 --- 250 164 --- 323 164 --- 332 @@ -1171,13 +1172,13 @@ flowchart LR 165 --- 330 165 --- 341 165 --- 373 - 165 --- 447 + 165 --- 448 166 --- 224 166 --- 342 166 --- 386 174 --- 317 174 --- 380 - 174 --- 478 + 174 --- 479 176 --- 246 176 --- 247 176 --- 248 @@ -1204,10 +1205,10 @@ flowchart LR 178 --- 364 178 --- 365 178 --- 366 - 178 --- 423 178 --- 424 178 --- 425 178 --- 426 + 178 --- 427 179 --- 288 179 --- 289 179 --- 290 @@ -1218,10 +1219,10 @@ flowchart LR 179 --- 376 179 --- 377 179 --- 378 - 179 --- 449 179 --- 450 179 --- 451 179 --- 452 + 179 --- 453 180 --- 293 180 --- 294 180 --- 295 @@ -1246,7 +1247,6 @@ flowchart LR 180 --- 314 180 --- 315 180 --- 316 - 180 --- 454 180 --- 455 180 --- 456 180 --- 457 @@ -1270,34 +1270,35 @@ flowchart LR 180 --- 475 180 --- 476 180 --- 477 + 180 --- 478 181 --- 285 181 --- 324 181 --- 333 181 --- 372 - 181 --- 446 + 181 --- 447 182 --- 280 182 --- 338 182 --- 367 - 182 --- 441 + 182 --- 442 185 --- 260 185 --- 361 - 185 --- 421 + 185 --- 422 188 --- 292 188 --- 336 188 --- 379 - 188 --- 453 + 188 --- 454 189 --- 322 189 --- 329 189 --- 340 189 --- 385 - 189 --- 483 + 189 --- 484 191 --- 261 191 --- 362 - 191 --- 422 + 191 --- 423 205 --- 287 205 --- 334 205 --- 374 - 205 --- 448 + 205 --- 449 213 --- 281 213 --- 282 213 --- 283 @@ -1307,10 +1308,10 @@ flowchart LR 213 --- 369 213 --- 370 213 --- 371 - 213 --- 442 213 --- 443 213 --- 444 213 --- 445 + 213 --- 446 218 --- 318 218 --- 319 218 --- 320 @@ -1320,10 +1321,10 @@ flowchart LR 218 --- 382 218 --- 383 218 --- 384 - 218 --- 479 218 --- 480 218 --- 481 218 --- 482 + 218 --- 483 221 --- 225 221 --- 226 221 --- 227 @@ -1394,6 +1395,7 @@ flowchart LR 222 --- 418 222 --- 419 222 --- 420 + 222 --- 421 223 --- 266 223 --- 267 223 --- 268 @@ -1408,7 +1410,6 @@ flowchart LR 223 --- 277 223 --- 278 223 --- 279 - 223 --- 427 223 --- 428 223 --- 429 223 --- 430 @@ -1422,59 +1423,60 @@ flowchart LR 223 --- 438 223 --- 439 223 --- 440 + 223 --- 441 224 --- 342 224 --- 386 225 --- 356 + 399 <--x 225 225 --- 400 - 401 <--x 225 226 --- 344 + 387 <--x 226 226 --- 388 - 389 <--x 226 227 --- 348 + 391 <--x 227 227 --- 392 - 393 <--x 227 228 --- 355 + 398 <--x 228 228 --- 399 - 400 <--x 228 229 --- 346 + 389 <--x 229 229 --- 390 - 391 <--x 229 230 --- 351 + 394 <--x 230 230 --- 395 - 396 <--x 230 231 --- 359 - 387 <--x 231 + 402 <--x 231 231 --- 403 232 --- 358 + 401 <--x 232 232 --- 402 - 403 <--x 232 233 --- 343 233 --- 387 - 388 <--x 233 + 403 <--x 233 234 --- 357 + 400 <--x 234 234 --- 401 - 402 <--x 234 235 --- 353 + 396 <--x 235 235 --- 397 - 398 <--x 235 236 --- 352 + 395 <--x 236 236 --- 396 - 397 <--x 236 237 --- 354 + 397 <--x 237 237 --- 398 - 399 <--x 237 238 --- 345 + 388 <--x 238 238 --- 389 - 390 <--x 238 239 --- 347 + 390 <--x 239 239 --- 391 - 392 <--x 239 240 --- 349 + 392 <--x 240 240 --- 393 - 394 <--x 240 241 --- 350 + 393 <--x 241 241 --- 394 - 395 <--x 241 406 <--x 242 242 --- 407 243 --- 404 @@ -1493,164 +1495,166 @@ flowchart LR 249 --- 411 250 --- 360 250 --- 412 - 419 <--x 251 - 251 --- 420 + 420 <--x 251 + 251 --- 421 252 --- 413 - 420 <--x 252 - 414 <--x 253 - 253 --- 415 - 417 <--x 254 - 254 --- 418 - 255 --- 413 - 415 <--x 256 - 256 --- 416 - 416 <--x 257 - 257 --- 417 - 418 <--x 258 - 258 --- 419 - 259 --- 414 + 421 <--x 252 + 415 <--x 253 + 253 --- 416 + 418 <--x 254 + 254 --- 419 + 413 <--x 255 + 255 --- 414 + 416 <--x 256 + 256 --- 417 + 417 <--x 257 + 257 --- 418 + 419 <--x 258 + 258 --- 420 + 414 <--x 259 + 259 --- 415 260 --- 361 - 260 --- 421 + 260 --- 422 261 --- 362 - 261 --- 422 + 261 --- 423 262 --- 363 - 262 --- 423 - 424 <--x 262 + 262 --- 424 + 425 <--x 262 263 --- 364 - 263 --- 424 - 425 <--x 263 + 263 --- 425 + 426 <--x 263 264 --- 366 - 423 <--x 264 - 264 --- 426 + 424 <--x 264 + 264 --- 427 265 --- 365 - 265 --- 425 - 426 <--x 265 - 430 <--x 266 - 266 --- 431 - 434 <--x 267 - 267 --- 435 - 436 <--x 268 - 268 --- 437 - 428 <--x 269 - 269 --- 429 - 432 <--x 270 - 270 --- 433 - 435 <--x 271 - 271 --- 436 - 439 <--x 272 - 272 --- 440 - 437 <--x 273 - 273 --- 438 - 438 <--x 274 - 274 --- 439 - 275 --- 427 - 440 <--x 275 - 429 <--x 276 - 276 --- 430 - 427 <--x 277 - 277 --- 428 - 433 <--x 278 - 278 --- 434 - 431 <--x 279 - 279 --- 432 + 265 --- 426 + 427 <--x 265 + 431 <--x 266 + 266 --- 432 + 435 <--x 267 + 267 --- 436 + 437 <--x 268 + 268 --- 438 + 429 <--x 269 + 269 --- 430 + 433 <--x 270 + 270 --- 434 + 436 <--x 271 + 271 --- 437 + 440 <--x 272 + 272 --- 441 + 438 <--x 273 + 273 --- 439 + 439 <--x 274 + 274 --- 440 + 275 --- 428 + 441 <--x 275 + 430 <--x 276 + 276 --- 431 + 428 <--x 277 + 277 --- 429 + 434 <--x 278 + 278 --- 435 + 432 <--x 279 + 279 --- 433 280 --- 367 - 280 --- 441 + 280 --- 442 281 --- 369 - 281 --- 443 - 444 <--x 281 + 443 <--x 281 + 281 --- 444 282 --- 368 - 282 --- 442 - 443 <--x 282 + 282 --- 443 + 446 <--x 282 283 --- 370 - 283 --- 444 - 445 <--x 283 + 444 <--x 283 + 283 --- 445 284 --- 371 - 442 <--x 284 - 284 --- 445 + 445 <--x 284 + 284 --- 446 285 --- 372 - 285 --- 446 + 285 --- 447 286 --- 373 - 286 --- 447 + 286 --- 448 287 --- 374 - 287 --- 448 + 287 --- 449 288 --- 376 - 449 <--x 288 - 288 --- 450 + 288 --- 451 + 452 <--x 288 289 --- 375 - 289 --- 449 - 452 <--x 289 + 289 --- 450 + 451 <--x 289 290 --- 377 - 450 <--x 290 - 290 --- 451 + 290 --- 452 + 453 <--x 290 291 --- 378 - 451 <--x 291 - 291 --- 452 + 450 <--x 291 + 291 --- 453 292 --- 379 - 292 --- 453 - 465 <--x 293 - 293 --- 466 - 466 <--x 294 - 294 --- 467 - 459 <--x 295 - 295 --- 460 - 470 <--x 296 - 296 --- 471 - 461 <--x 297 - 297 --- 462 - 464 <--x 298 - 298 --- 465 - 474 <--x 299 - 299 --- 475 - 462 <--x 300 - 300 --- 463 - 456 <--x 301 - 301 --- 457 - 471 <--x 302 - 302 --- 472 - 460 <--x 303 - 303 --- 461 - 472 <--x 304 - 304 --- 473 - 467 <--x 305 - 305 --- 468 - 468 <--x 306 - 306 --- 469 - 469 <--x 307 - 307 --- 470 - 308 --- 454 - 477 <--x 308 - 463 <--x 309 - 309 --- 464 - 454 <--x 310 - 310 --- 455 - 455 <--x 311 - 311 --- 456 - 475 <--x 312 - 312 --- 476 - 473 <--x 313 - 313 --- 474 - 476 <--x 314 - 314 --- 477 - 458 <--x 315 - 315 --- 459 - 457 <--x 316 - 316 --- 458 + 292 --- 454 + 466 <--x 293 + 293 --- 467 + 467 <--x 294 + 294 --- 468 + 460 <--x 295 + 295 --- 461 + 471 <--x 296 + 296 --- 472 + 462 <--x 297 + 297 --- 463 + 465 <--x 298 + 298 --- 466 + 475 <--x 299 + 299 --- 476 + 463 <--x 300 + 300 --- 464 + 457 <--x 301 + 301 --- 458 + 472 <--x 302 + 302 --- 473 + 461 <--x 303 + 303 --- 462 + 473 <--x 304 + 304 --- 474 + 468 <--x 305 + 305 --- 469 + 469 <--x 306 + 306 --- 470 + 470 <--x 307 + 307 --- 471 + 308 --- 455 + 478 <--x 308 + 464 <--x 309 + 309 --- 465 + 455 <--x 310 + 310 --- 456 + 456 <--x 311 + 311 --- 457 + 476 <--x 312 + 312 --- 477 + 474 <--x 313 + 313 --- 475 + 477 <--x 314 + 314 --- 478 + 459 <--x 315 + 315 --- 460 + 458 <--x 316 + 316 --- 459 317 --- 380 - 317 --- 478 + 317 --- 479 318 --- 384 - 479 <--x 318 - 318 --- 482 + 480 <--x 318 + 318 --- 483 319 --- 381 - 319 --- 479 - 480 <--x 319 + 319 --- 480 + 481 <--x 319 320 --- 382 - 320 --- 480 - 481 <--x 320 + 320 --- 481 + 482 <--x 320 321 --- 383 - 321 --- 481 - 482 <--x 321 + 321 --- 482 + 483 <--x 321 322 --- 385 - 322 --- 483 + 322 --- 484 380 <--x 323 361 <--x 324 368 <--x 325 diff --git a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap index ffbfcaada..aad72b0e4 100644 --- a/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/car-wheel-assembly/ops.snap @@ -48,6 +48,99 @@ description: Operations executed car-wheel-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternCircular3d", @@ -188,6 +281,70 @@ description: Operations executed car-wheel-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { diff --git a/rust/kcl-lib/tests/kcl_samples/cold-plate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/cold-plate/artifact_graph_flowchart.snap.md index 1e6d5f854..fa53da10e 100644 --- a/rust/kcl-lib/tests/kcl_samples/cold-plate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/cold-plate/artifact_graph_flowchart.snap.md @@ -366,112 +366,112 @@ flowchart LR 11 ---- 74 26 --- 75 26 x--> 108 - 26 --- 138 - 26 --- 170 + 26 --- 139 + 26 --- 171 27 --- 76 27 x--> 108 - 27 --- 124 - 27 --- 156 + 27 --- 114 + 27 --- 146 28 --- 77 28 x--> 108 - 28 --- 137 - 28 --- 169 + 28 --- 115 + 28 --- 147 29 --- 78 29 x--> 108 - 29 --- 133 - 29 --- 165 + 29 --- 132 + 29 --- 164 30 --- 79 30 x--> 108 - 30 --- 116 - 30 --- 148 + 30 --- 124 + 30 --- 156 31 --- 80 31 x--> 108 - 31 --- 115 - 31 --- 147 + 31 --- 138 + 31 --- 170 32 --- 81 32 x--> 108 - 32 --- 118 - 32 --- 150 + 32 --- 129 + 32 --- 161 33 --- 82 33 x--> 108 - 33 --- 134 - 33 --- 166 + 33 --- 119 + 33 --- 151 34 --- 83 34 x--> 108 - 34 --- 129 - 34 --- 161 + 34 --- 123 + 34 --- 155 35 --- 84 35 x--> 108 - 35 --- 127 - 35 --- 159 + 35 --- 135 + 35 --- 167 36 --- 85 36 x--> 108 - 36 --- 132 - 36 --- 164 + 36 --- 125 + 36 --- 157 37 --- 86 37 x--> 108 - 37 --- 122 - 37 --- 154 + 37 --- 116 + 37 --- 148 38 --- 87 38 x--> 108 - 38 --- 123 - 38 --- 155 + 38 --- 131 + 38 --- 163 39 --- 88 39 x--> 108 - 39 --- 131 - 39 --- 163 + 39 --- 127 + 39 --- 159 40 --- 89 40 x--> 108 - 40 --- 119 - 40 --- 151 + 40 --- 134 + 40 --- 166 41 --- 90 41 x--> 108 41 --- 130 41 --- 162 42 --- 91 42 x--> 108 - 42 --- 114 - 42 --- 146 + 42 --- 136 + 42 --- 168 43 --- 92 43 x--> 108 - 43 --- 125 - 43 --- 157 + 43 --- 126 + 43 --- 158 44 --- 93 44 x--> 108 - 44 --- 121 - 44 --- 153 + 44 --- 113 + 44 --- 145 45 --- 94 45 x--> 108 - 45 --- 135 - 45 --- 167 + 45 --- 133 + 45 --- 165 46 --- 95 46 x--> 108 - 46 --- 120 - 46 --- 152 + 46 --- 137 + 46 --- 169 47 --- 96 47 x--> 108 - 47 --- 126 - 47 --- 158 + 47 --- 128 + 47 --- 160 48 --- 97 48 x--> 108 - 48 --- 117 - 48 --- 149 + 48 --- 118 + 48 --- 150 49 --- 98 49 x--> 108 - 49 --- 113 - 49 --- 145 + 49 --- 121 + 49 --- 153 50 --- 99 50 x--> 108 - 50 --- 136 - 50 --- 168 + 50 --- 120 + 50 --- 152 51 --- 100 51 x--> 108 - 51 --- 128 - 51 --- 160 + 51 --- 117 + 51 --- 149 52 --- 101 52 x--> 108 - 52 --- 139 - 52 --- 171 + 52 --- 122 + 52 --- 154 61 --- 102 61 x--> 109 61 --- 140 @@ -594,87 +594,87 @@ flowchart LR 74 --- 174 74 --- 175 74 --- 176 - 75 --- 138 - 75 --- 170 - 171 <--x 75 - 76 --- 124 - 76 --- 156 - 157 <--x 76 - 77 --- 137 - 77 --- 169 - 170 <--x 77 - 78 --- 133 - 78 --- 165 - 166 <--x 78 - 79 --- 116 - 79 --- 148 - 149 <--x 79 - 80 --- 115 - 80 --- 147 - 148 <--x 80 - 81 --- 118 - 81 --- 150 - 151 <--x 81 - 82 --- 134 - 82 --- 166 - 167 <--x 82 - 83 --- 129 - 83 --- 161 - 162 <--x 83 - 84 --- 127 - 84 --- 159 - 160 <--x 84 - 85 --- 132 - 85 --- 164 - 165 <--x 85 - 86 --- 122 - 86 --- 154 - 155 <--x 86 - 87 --- 123 - 87 --- 155 - 156 <--x 87 - 88 --- 131 - 88 --- 163 - 164 <--x 88 - 89 --- 119 - 89 --- 151 - 152 <--x 89 + 75 --- 139 + 145 <--x 75 + 75 --- 171 + 76 --- 114 + 76 --- 146 + 147 <--x 76 + 77 --- 115 + 77 --- 147 + 148 <--x 77 + 78 --- 132 + 78 --- 164 + 165 <--x 78 + 79 --- 124 + 79 --- 156 + 157 <--x 79 + 80 --- 138 + 80 --- 170 + 171 <--x 80 + 81 --- 129 + 81 --- 161 + 162 <--x 81 + 82 --- 119 + 82 --- 151 + 152 <--x 82 + 83 --- 123 + 83 --- 155 + 156 <--x 83 + 84 --- 135 + 84 --- 167 + 168 <--x 84 + 85 --- 125 + 85 --- 157 + 158 <--x 85 + 86 --- 116 + 86 --- 148 + 149 <--x 86 + 87 --- 131 + 87 --- 163 + 164 <--x 87 + 88 --- 127 + 88 --- 159 + 160 <--x 88 + 89 --- 134 + 89 --- 166 + 167 <--x 89 90 --- 130 90 --- 162 163 <--x 90 - 91 --- 114 - 91 --- 146 - 147 <--x 91 - 92 --- 125 - 92 --- 157 - 158 <--x 92 - 93 --- 121 - 93 --- 153 - 154 <--x 93 - 94 --- 135 - 94 --- 167 - 168 <--x 94 - 95 --- 120 - 95 --- 152 - 153 <--x 95 - 96 --- 126 - 96 --- 158 - 159 <--x 96 - 97 --- 117 - 97 --- 149 - 150 <--x 97 - 98 --- 113 - 98 --- 145 - 146 <--x 98 - 99 --- 136 - 99 --- 168 - 169 <--x 99 - 100 --- 128 - 100 --- 160 - 161 <--x 100 - 101 --- 139 - 145 <--x 101 - 101 --- 171 + 91 --- 136 + 91 --- 168 + 169 <--x 91 + 92 --- 126 + 92 --- 158 + 159 <--x 92 + 93 --- 113 + 93 --- 145 + 146 <--x 93 + 94 --- 133 + 94 --- 165 + 166 <--x 94 + 95 --- 137 + 95 --- 169 + 170 <--x 95 + 96 --- 128 + 96 --- 160 + 161 <--x 96 + 97 --- 118 + 97 --- 150 + 151 <--x 97 + 98 --- 121 + 98 --- 153 + 154 <--x 98 + 99 --- 120 + 99 --- 152 + 153 <--x 99 + 100 --- 117 + 100 --- 149 + 150 <--x 100 + 101 --- 122 + 101 --- 154 + 155 <--x 101 102 --- 140 102 --- 172 103 --- 144 diff --git a/rust/kcl-lib/tests/kcl_samples/counterdrilled-weldment/ops.snap b/rust/kcl-lib/tests/kcl_samples/counterdrilled-weldment/ops.snap index e5334f246..bdc433f82 100644 --- a/rust/kcl-lib/tests/kcl_samples/counterdrilled-weldment/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/counterdrilled-weldment/ops.snap @@ -1105,141 +1105,8 @@ description: Operations executed counterdrilled-weldment.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 2.5, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.5, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1251,141 +1118,8 @@ description: Operations executed counterdrilled-weldment.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -2.5, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.5, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/cpu-cooler/ops.snap b/rust/kcl-lib/tests/kcl_samples/cpu-cooler/ops.snap index bda20bb0e..3acac7003 100644 --- a/rust/kcl-lib/tests/kcl_samples/cpu-cooler/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/cpu-cooler/ops.snap @@ -66,6 +66,220 @@ description: Operations executed cpu-cooler.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 27.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 100.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 27.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 100.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 27.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 100.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternLinear3d", diff --git a/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/ops.snap b/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/ops.snap index b053e6b88..c2fc60a59 100644 --- a/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/curtain-wall-anchor-plate/ops.snap @@ -625,6 +625,70 @@ description: Operations executed curtain-wall-anchor-plate.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 200.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -70.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", @@ -672,6 +736,70 @@ description: Operations executed curtain-wall-anchor-plate.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 140.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "subtract", @@ -802,6 +930,134 @@ description: Operations executed curtain-wall-anchor-plate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 200.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -70.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternLinear3d", diff --git a/rust/kcl-lib/tests/kcl_samples/dodecahedron/ops.snap b/rust/kcl-lib/tests/kcl_samples/dodecahedron/ops.snap index 43d20ce59..d06b03d3e 100644 --- a/rust/kcl-lib/tests/kcl_samples/dodecahedron/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/dodecahedron/ops.snap @@ -543,6 +543,774 @@ description: Operations executed dodecahedron.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.1, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.3, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.4, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.6, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.7, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.8, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.9, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.11, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -260.12, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -1695,6 +2463,858 @@ description: Operations executed dodecahedron.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 116.565, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 116.565, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 72.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 116.565, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 144.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 116.565, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 216.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 116.565, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 288.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 63.435, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 36.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 63.435, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 108.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 63.435, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 63.435, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 252.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "pitch": { + "value": { + "type": "Number", + "value": 63.435, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 324.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { diff --git a/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap b/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap index fac11e149..a30381df3 100644 --- a/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/enclosure/ops.snap @@ -153,185 +153,8 @@ description: Operations executed enclosure.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 3.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -343,185 +166,8 @@ description: Operations executed enclosure.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 3.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -533,185 +179,8 @@ description: Operations executed enclosure.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 3.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -723,185 +192,8 @@ description: Operations executed enclosure.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 3.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/engine-valve/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/engine-valve/artifact_graph_flowchart.snap.md index 1aa5fd857..a78461776 100644 --- a/rust/kcl-lib/tests/kcl_samples/engine-valve/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/engine-valve/artifact_graph_flowchart.snap.md @@ -191,7 +191,8 @@ flowchart LR 100["SweepEdge Adjacent"] 101["SweepEdge Adjacent"] 102["SweepEdge Adjacent"] - 103["EdgeCut Chamfer
[2565, 2678, 0]"] + 103["SweepEdge Adjacent"] + 104["EdgeCut Chamfer
[2565, 2678, 0]"] %% [ProgramBodyItem { index: 19 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] 1 --- 11 2 <--x 3 @@ -246,25 +247,25 @@ flowchart LR 78 --- 19 45 <--x 20 20 --- 68 - 20 x--> 97 + 20 --- 97 45 <--x 21 21 --- 65 - 21 --- 97 + 21 --- 98 45 <--x 22 22 --- 64 - 22 --- 98 + 22 --- 99 45 <--x 23 23 --- 66 - 23 --- 99 + 23 --- 100 45 <--x 24 24 --- 63 - 24 --- 100 + 24 --- 101 45 <--x 25 25 --- 62 - 25 --- 101 + 25 --- 102 45 <--x 26 26 --- 67 - 26 --- 102 + 26 --- 103 28 --- 57 28 x--> 70 28 --- 84 @@ -310,6 +311,7 @@ flowchart LR 45 --- 100 45 --- 101 45 --- 102 + 45 --- 103 46 --- 57 46 --- 70 46 --- 75 @@ -362,18 +364,20 @@ flowchart LR 60 --- 95 61 --- 88 61 --- 96 - 100 <--x 62 - 62 --- 101 - 99 <--x 63 - 63 --- 100 - 64 --- 98 - 65 --- 97 - 98 <--x 66 - 66 --- 99 - 101 <--x 67 - 67 --- 102 + 101 <--x 62 + 62 --- 102 + 100 <--x 63 + 63 --- 101 + 98 <--x 64 + 64 --- 99 + 97 <--x 65 + 65 --- 98 + 99 <--x 66 + 66 --- 100 + 102 <--x 67 + 67 --- 103 68 --- 97 - 102 <--x 68 + 103 <--x 68 86 <--x 73 81 <--x 74 84 <--x 75 @@ -382,5 +386,5 @@ flowchart LR 87 <--x 78 88 <--x 79 85 <--x 80 - 81 <--x 103 + 81 <--x 104 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap index ebb54be99..889014356 100644 --- a/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/exhaust-manifold/ops.snap @@ -8,175 +8,8 @@ description: Operations executed exhaust-manifold.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.0, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -188,175 +21,8 @@ description: Operations executed exhaust-manifold.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 2.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.01745240643728351, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.9998476951563913, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -368,175 +34,8 @@ description: Operations executed exhaust-manifold.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 4.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.4115143586051088, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.9114032766354453, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -548,175 +47,8 @@ description: Operations executed exhaust-manifold.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 6.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.4257792915650726, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.9048270524660196, - "ty": { - "type": "Known", - "type": "Count" - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap index db0c521f0..7410781e1 100644 --- a/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/focusrite-scarlett-mounting-bracket/ops.snap @@ -8,185 +8,8 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 44.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "zAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": -1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -346,185 +169,8 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 49.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "zAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -731,185 +377,8 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 49.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "zAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1116,185 +585,8 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": -52.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "zAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1338,185 +630,8 @@ description: Operations executed focusrite-scarlett-mounting-bracket.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": -52.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "zAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap index ddeb75037..791293225 100644 --- a/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/food-service-spatula/ops.snap @@ -674,185 +674,8 @@ description: Operations executed food-service-spatula.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 208.593833, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 75.921946, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.34202, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.939693, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.939693, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.34202, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md index cab3b4cc4..4cccd27da 100644 --- a/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/french-press/artifact_graph_flowchart.snap.md @@ -514,6 +514,7 @@ flowchart LR 296["SweepEdge Adjacent"] 297["SweepEdge Adjacent"] 298["SweepEdge Adjacent"] + 299["SweepEdge Adjacent"] 1 --- 16 2 --- 17 3 <--x 12 @@ -628,16 +629,16 @@ flowchart LR 28 ---- 133 110 <--x 29 29 --- 153 - 29 x--> 256 + 29 --- 256 110 <--x 30 30 --- 151 - 30 --- 256 + 30 --- 257 110 <--x 31 31 --- 150 - 31 --- 257 + 31 --- 258 110 <--x 32 32 --- 152 - 32 --- 258 + 32 --- 259 34 --- 137 34 x--> 197 34 --- 219 @@ -705,143 +706,143 @@ flowchart LR 51 --- 187 51 x--> 198 51 --- 239 - 51 --- 292 + 51 --- 293 52 --- 178 52 x--> 203 52 --- 237 - 52 --- 283 + 52 --- 284 53 --- 176 53 x--> 203 53 --- 236 - 53 --- 282 + 53 --- 283 54 --- 177 54 x--> 203 54 --- 235 - 54 --- 281 + 54 --- 282 116 <--x 56 56 --- 192 - 56 --- 293 + 56 --- 294 116 <--x 57 57 --- 191 - 57 --- 294 + 57 --- 295 116 <--x 58 58 --- 189 - 58 --- 295 + 58 --- 296 116 <--x 59 59 --- 190 - 59 --- 296 + 59 --- 297 116 <--x 60 60 --- 188 - 60 --- 297 + 60 --- 298 116 <--x 61 61 --- 193 - 61 --- 298 + 61 --- 299 117 <--x 63 63 --- 185 - 63 --- 284 + 63 --- 285 117 <--x 64 64 --- 179 - 64 --- 285 + 64 --- 286 117 <--x 65 65 --- 184 - 65 --- 286 + 65 --- 287 117 <--x 66 66 --- 182 - 66 --- 287 + 66 --- 288 117 <--x 67 67 --- 181 - 67 --- 288 + 67 --- 289 117 <--x 68 68 --- 180 - 68 --- 289 + 68 --- 290 117 <--x 69 69 --- 183 - 69 --- 290 + 69 --- 291 71 --- 186 71 x--> 194 71 --- 238 - 71 --- 291 + 71 --- 292 73 --- 154 73 x--> 199 73 --- 220 - 73 --- 259 + 73 --- 260 74 --- 155 74 x--> 199 74 --- 221 - 74 --- 260 + 74 --- 261 75 --- 168 75 x--> 195 75 --- 234 - 75 --- 273 + 75 --- 274 132 <--x 76 76 --- 170 - 76 --- 274 + 76 --- 275 132 <--x 77 77 --- 171 - 77 --- 275 + 77 --- 276 132 <--x 78 78 --- 169 - 78 --- 276 + 78 --- 277 132 <--x 79 79 --- 173 - 79 --- 277 + 79 --- 278 132 <--x 80 80 --- 175 - 80 --- 278 + 80 --- 279 132 <--x 81 81 --- 174 - 81 --- 279 + 81 --- 280 132 <--x 82 82 --- 172 - 82 --- 280 + 82 --- 281 84 --- 166 84 x--> 201 84 --- 233 - 84 --- 272 + 84 --- 273 85 --- 163 85 x--> 201 85 --- 232 - 85 --- 271 + 85 --- 272 86 --- 156 86 x--> 201 86 --- 231 - 86 --- 270 + 86 --- 271 87 --- 161 87 x--> 201 87 --- 230 - 87 --- 269 + 87 --- 270 88 --- 167 88 x--> 201 88 --- 229 - 88 --- 268 + 88 --- 269 89 --- 158 89 x--> 201 89 --- 228 - 89 --- 267 + 89 --- 268 90 --- 160 90 x--> 201 90 --- 227 - 90 --- 266 + 90 --- 267 91 --- 157 91 x--> 201 91 --- 226 - 91 --- 265 + 91 --- 266 92 --- 162 92 x--> 201 92 --- 225 - 92 --- 264 + 92 --- 265 93 --- 165 93 x--> 201 93 --- 224 - 93 --- 263 + 93 --- 264 94 --- 159 94 x--> 201 94 --- 223 - 94 --- 262 + 94 --- 263 95 --- 164 95 x--> 201 95 --- 222 - 95 --- 261 + 95 --- 262 110 --- 150 110 --- 151 110 --- 152 @@ -849,6 +850,7 @@ flowchart LR 110 --- 256 110 --- 257 110 --- 258 + 110 --- 259 111 --- 134 111 --- 135 111 --- 136 @@ -903,28 +905,28 @@ flowchart LR 112 --- 198 112 --- 203 112 --- 239 - 112 --- 292 + 112 --- 293 114 --- 176 114 --- 177 114 --- 178 114 --- 235 114 --- 236 114 --- 237 - 114 --- 281 114 --- 282 114 --- 283 + 114 --- 284 116 --- 188 116 --- 189 116 --- 190 116 --- 191 116 --- 192 116 --- 193 - 116 --- 293 116 --- 294 116 --- 295 116 --- 296 116 --- 297 116 --- 298 + 116 --- 299 117 --- 179 117 --- 180 117 --- 181 @@ -932,29 +934,29 @@ flowchart LR 117 --- 183 117 --- 184 117 --- 185 - 117 --- 284 117 --- 285 117 --- 286 117 --- 287 117 --- 288 117 --- 289 117 --- 290 + 117 --- 291 118 --- 186 118 --- 194 118 --- 199 118 --- 238 - 118 --- 291 + 118 --- 292 122 --- 154 122 --- 220 - 122 --- 259 + 122 --- 260 129 --- 155 129 --- 221 - 129 --- 260 + 129 --- 261 131 --- 168 131 --- 195 131 --- 200 131 --- 234 - 131 --- 273 + 131 --- 274 132 --- 169 132 --- 170 132 --- 171 @@ -962,13 +964,13 @@ flowchart LR 132 --- 173 132 --- 174 132 --- 175 - 132 --- 274 132 --- 275 132 --- 276 132 --- 277 132 --- 278 132 --- 279 132 --- 280 + 132 --- 281 133 --- 156 133 --- 157 133 --- 158 @@ -995,7 +997,6 @@ flowchart LR 133 --- 231 133 --- 232 133 --- 233 - 133 --- 261 133 --- 262 133 --- 263 133 --- 264 @@ -1007,155 +1008,158 @@ flowchart LR 133 --- 270 133 --- 271 133 --- 272 + 133 --- 273 134 --- 209 - 244 <--x 134 134 --- 245 + 246 <--x 134 135 --- 207 - 242 <--x 135 135 --- 243 + 244 <--x 135 136 --- 217 - 252 <--x 136 136 --- 253 + 254 <--x 136 137 --- 219 - 254 <--x 137 + 240 <--x 137 137 --- 255 138 --- 211 - 246 <--x 138 138 --- 247 + 248 <--x 138 139 --- 204 139 --- 240 - 255 <--x 139 + 241 <--x 139 140 --- 210 - 245 <--x 140 140 --- 246 + 247 <--x 140 141 --- 205 - 240 <--x 141 141 --- 241 + 242 <--x 141 142 --- 212 - 247 <--x 142 142 --- 248 + 249 <--x 142 143 --- 214 - 249 <--x 143 143 --- 250 + 251 <--x 143 144 --- 213 - 248 <--x 144 144 --- 249 + 250 <--x 144 145 --- 216 - 251 <--x 145 145 --- 252 + 253 <--x 145 146 --- 215 - 250 <--x 146 146 --- 251 + 252 <--x 146 147 --- 206 - 241 <--x 147 147 --- 242 + 243 <--x 147 148 --- 208 - 243 <--x 148 148 --- 244 + 245 <--x 148 149 --- 218 - 253 <--x 149 149 --- 254 - 150 --- 257 - 151 --- 256 - 257 <--x 152 - 152 --- 258 + 255 <--x 149 + 257 <--x 150 + 150 --- 258 + 256 <--x 151 + 151 --- 257 + 258 <--x 152 + 152 --- 259 153 --- 256 - 258 <--x 153 + 259 <--x 153 154 --- 220 - 154 --- 259 + 154 --- 260 155 --- 221 - 155 --- 260 + 155 --- 261 156 --- 231 - 156 --- 270 - 271 <--x 156 + 156 --- 271 + 272 <--x 156 157 --- 226 - 157 --- 265 - 266 <--x 157 + 157 --- 266 + 267 <--x 157 158 --- 228 - 158 --- 267 - 268 <--x 158 + 158 --- 268 + 269 <--x 158 159 --- 223 - 159 --- 262 - 263 <--x 159 + 159 --- 263 + 264 <--x 159 160 --- 227 - 160 --- 266 - 267 <--x 160 + 160 --- 267 + 268 <--x 160 161 --- 230 - 161 --- 269 - 270 <--x 161 + 161 --- 270 + 271 <--x 161 162 --- 225 - 162 --- 264 - 265 <--x 162 + 162 --- 265 + 266 <--x 162 163 --- 232 - 163 --- 271 - 272 <--x 163 + 163 --- 272 + 273 <--x 163 164 --- 222 - 164 --- 261 - 262 <--x 164 + 164 --- 262 + 263 <--x 164 165 --- 224 - 165 --- 263 - 264 <--x 165 + 165 --- 264 + 265 <--x 165 166 --- 233 - 261 <--x 166 - 166 --- 272 + 262 <--x 166 + 166 --- 273 167 --- 229 - 167 --- 268 - 269 <--x 167 + 167 --- 269 + 270 <--x 167 168 --- 234 - 168 --- 273 - 275 <--x 169 - 169 --- 276 - 170 --- 274 - 280 <--x 170 - 274 <--x 171 - 171 --- 275 - 279 <--x 172 - 172 --- 280 - 276 <--x 173 - 173 --- 277 - 278 <--x 174 - 174 --- 279 - 277 <--x 175 - 175 --- 278 + 168 --- 274 + 276 <--x 169 + 169 --- 277 + 170 --- 275 + 281 <--x 170 + 275 <--x 171 + 171 --- 276 + 280 <--x 172 + 172 --- 281 + 277 <--x 173 + 173 --- 278 + 279 <--x 174 + 174 --- 280 + 278 <--x 175 + 175 --- 279 176 --- 236 - 176 --- 282 - 283 <--x 176 + 176 --- 283 + 284 <--x 176 177 --- 235 - 177 --- 281 - 282 <--x 177 + 177 --- 282 + 283 <--x 177 178 --- 237 - 281 <--x 178 - 178 --- 283 - 284 <--x 179 - 179 --- 285 - 288 <--x 180 - 180 --- 289 - 287 <--x 181 - 181 --- 288 - 286 <--x 182 - 182 --- 287 - 289 <--x 183 - 183 --- 290 - 285 <--x 184 - 184 --- 286 - 185 --- 284 - 290 <--x 185 + 282 <--x 178 + 178 --- 284 + 285 <--x 179 + 179 --- 286 + 289 <--x 180 + 180 --- 290 + 288 <--x 181 + 181 --- 289 + 287 <--x 182 + 182 --- 288 + 290 <--x 183 + 183 --- 291 + 286 <--x 184 + 184 --- 287 + 185 --- 285 + 291 <--x 185 186 --- 238 - 186 --- 291 + 186 --- 292 187 --- 239 - 187 --- 292 - 296 <--x 188 - 188 --- 297 - 294 <--x 189 - 189 --- 295 - 295 <--x 190 - 190 --- 296 - 293 <--x 191 - 191 --- 294 - 192 --- 293 - 298 <--x 192 - 297 <--x 193 - 193 --- 298 + 187 --- 293 + 297 <--x 188 + 188 --- 298 + 295 <--x 189 + 189 --- 296 + 296 <--x 190 + 190 --- 297 + 294 <--x 191 + 191 --- 295 + 192 --- 294 + 299 <--x 192 + 298 <--x 193 + 193 --- 299 220 <--x 194 221 <--x 194 222 <--x 196 diff --git a/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap b/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap index e40612368..69d4dc9eb 100644 --- a/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/french-press/ops.snap @@ -123,185 +123,8 @@ description: Operations executed french-press.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.26, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.26, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ops.snap b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ops.snap index 52f95835f..69e72aff5 100644 --- a/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/gridfinity-bins-stacking-lip/ops.snap @@ -1587,141 +1587,8 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 3.75, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 11.75, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1733,141 +1600,8 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 122.25, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 11.75, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1879,141 +1613,8 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 3.75, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 11.75, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2025,141 +1626,8 @@ description: Operations executed gridfinity-bins-stacking-lip.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 80.25, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 11.75, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/hammer/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/hammer/artifact_graph_flowchart.snap.md index fedf7b817..658313a44 100644 --- a/rust/kcl-lib/tests/kcl_samples/hammer/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/hammer/artifact_graph_flowchart.snap.md @@ -408,7 +408,8 @@ flowchart LR 246["SweepEdge Adjacent"] 247["SweepEdge Adjacent"] 248["SweepEdge Adjacent"] - 249["EdgeCut Fillet
[3438, 3552, 0]"] + 249["SweepEdge Adjacent"] + 250["EdgeCut Fillet
[3438, 3552, 0]"] %% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] 1 --- 8 2 <--x 6 @@ -676,25 +677,25 @@ flowchart LR 64 x--> 143 64 --- 186 64 --- 231 - 64 --- 249 + 64 --- 250 85 <--x 65 65 --- 136 - 65 x--> 244 + 65 --- 244 85 <--x 66 66 --- 141 - 66 --- 244 + 66 --- 245 85 <--x 67 67 --- 138 - 67 --- 245 + 67 --- 246 85 <--x 68 68 --- 137 - 68 --- 246 + 68 --- 247 85 <--x 69 69 --- 139 - 69 --- 247 + 69 --- 248 85 <--x 70 70 --- 140 - 70 --- 248 + 70 --- 249 79 --- 98 79 --- 99 79 --- 100 @@ -853,6 +854,7 @@ flowchart LR 85 --- 246 85 --- 247 85 --- 248 + 85 --- 249 90 --- 86 88 --- 87 87 --- 89 @@ -992,15 +994,17 @@ flowchart LR 135 --- 239 240 <--x 135 136 --- 244 - 248 <--x 136 - 245 <--x 137 - 137 --- 246 - 138 --- 245 - 246 <--x 139 - 139 --- 247 - 247 <--x 140 - 140 --- 248 - 141 --- 244 + 249 <--x 136 + 246 <--x 137 + 137 --- 247 + 245 <--x 138 + 138 --- 246 + 247 <--x 139 + 139 --- 248 + 248 <--x 140 + 140 --- 249 + 244 <--x 141 + 141 --- 245 154 <--x 142 155 <--x 142 156 <--x 142 diff --git a/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/ops.snap b/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/ops.snap index 37ca09a48..b0c07e064 100644 --- a/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/helical-planetary-gearset/ops.snap @@ -2474,6 +2474,38 @@ description: Operations executed helical-planetary-gearset.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "y": { + "value": { + "type": "Number", + "value": 20.7, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternCircular3d", diff --git a/rust/kcl-lib/tests/kcl_samples/helium-tank/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/helium-tank/artifact_graph_flowchart.snap.md index f08f9655f..2c155d4f4 100644 --- a/rust/kcl-lib/tests/kcl_samples/helium-tank/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/helium-tank/artifact_graph_flowchart.snap.md @@ -582,48 +582,48 @@ flowchart LR 46 --- 226 72 --- 112 72 x--> 151 - 72 --- 169 - 72 --- 203 + 72 --- 164 + 72 --- 198 73 --- 113 73 x--> 151 - 73 --- 166 - 73 --- 200 + 73 --- 160 + 73 --- 194 74 --- 114 74 x--> 151 - 74 --- 160 - 74 --- 194 + 74 --- 163 + 74 --- 197 75 --- 115 75 x--> 151 - 75 --- 168 - 75 --- 202 + 75 --- 166 + 75 --- 200 76 --- 116 76 x--> 151 - 76 --- 170 - 76 --- 204 + 76 --- 165 + 76 --- 199 77 --- 117 77 x--> 151 - 77 --- 162 - 77 --- 196 + 77 --- 170 + 77 --- 204 78 --- 118 78 x--> 151 - 78 --- 161 - 78 --- 195 + 78 --- 169 + 78 --- 203 79 --- 119 79 x--> 151 - 79 --- 165 - 79 --- 199 + 79 --- 161 + 79 --- 195 80 --- 120 80 x--> 151 - 80 --- 163 - 80 --- 197 + 80 --- 167 + 80 --- 201 81 --- 121 81 x--> 151 - 81 --- 167 - 81 --- 201 + 81 --- 162 + 81 --- 196 82 --- 122 82 x--> 151 - 82 --- 164 - 82 --- 198 + 82 --- 168 + 82 --- 202 84 --- 123 84 x--> 145 84 --- 171 @@ -756,39 +756,39 @@ flowchart LR 109 --- 107 111 --- 159 111 --- 193 - 112 --- 169 - 112 --- 203 - 204 <--x 112 - 113 --- 166 - 113 --- 200 - 201 <--x 113 - 114 --- 160 - 114 --- 194 - 195 <--x 114 - 115 --- 168 - 115 --- 202 - 203 <--x 115 - 116 --- 170 - 194 <--x 116 - 116 --- 204 - 117 --- 162 - 117 --- 196 - 197 <--x 117 - 118 --- 161 - 118 --- 195 - 196 <--x 118 - 119 --- 165 - 119 --- 199 - 200 <--x 119 - 120 --- 163 - 120 --- 197 - 198 <--x 120 - 121 --- 167 - 121 --- 201 - 202 <--x 121 - 122 --- 164 - 122 --- 198 - 199 <--x 122 + 112 --- 164 + 112 --- 198 + 199 <--x 112 + 113 --- 160 + 113 --- 194 + 195 <--x 113 + 114 --- 163 + 114 --- 197 + 198 <--x 114 + 115 --- 166 + 115 --- 200 + 201 <--x 115 + 116 --- 165 + 116 --- 199 + 200 <--x 116 + 117 --- 170 + 194 <--x 117 + 117 --- 204 + 118 --- 169 + 118 --- 203 + 204 <--x 118 + 119 --- 161 + 119 --- 195 + 196 <--x 119 + 120 --- 167 + 120 --- 201 + 202 <--x 120 + 121 --- 162 + 121 --- 196 + 197 <--x 121 + 122 --- 168 + 122 --- 202 + 203 <--x 122 123 --- 171 123 --- 205 124 --- 186 diff --git a/rust/kcl-lib/tests/kcl_samples/herringbone-gear/ops.snap b/rust/kcl-lib/tests/kcl_samples/herringbone-gear/ops.snap index 594c89cb2..e0791e534 100644 --- a/rust/kcl-lib/tests/kcl_samples/herringbone-gear/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/herringbone-gear/ops.snap @@ -450,6 +450,38 @@ description: Operations executed herringbone-gear.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "loft", @@ -485,13 +517,8 @@ description: Operations executed herringbone-gear.kcl "type": "Number", "value": 1.0, "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } + "type": "Known", + "type": "Count" } }, "sourceRange": [] diff --git a/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/ops.snap b/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/ops.snap index 9b6de0e38..04ac6693f 100644 --- a/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/herringbone-planetary-gearset/ops.snap @@ -899,38 +899,53 @@ description: Operations executed herringbone-planetary-gearset.kcl }, { "type": "StdLibCall", - "name": "loft", + "name": "translate", "unlabeledArg": { "value": { - "type": "Array", - "value": [ - { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - }, - { - "type": "Sketch", - "value": { - "artifactId": "[uuid]" - } - } - ] + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } }, "sourceRange": [] }, "labeledArgs": { - "vDegree": { + "z": { "value": { "type": "Number", - "value": 1.0, + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 8.0, "ty": { "type": "Default", "len": { @@ -981,13 +996,52 @@ description: Operations executed herringbone-planetary-gearset.kcl "type": "Number", "value": 1.0, "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "loft", + "unlabeledArg": { + "value": { + "type": "Array", + "value": [ + { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" } + }, + { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + } + ] + }, + "sourceRange": [] + }, + "labeledArgs": { + "vDegree": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Known", + "type": "Count" } }, "sourceRange": [] @@ -1528,6 +1582,38 @@ description: Operations executed herringbone-planetary-gearset.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 8.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "loft", @@ -1563,13 +1649,8 @@ description: Operations executed herringbone-planetary-gearset.kcl "type": "Number", "value": 1.0, "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } + "type": "Known", + "type": "Count" } }, "sourceRange": [] @@ -1853,6 +1934,38 @@ description: Operations executed herringbone-planetary-gearset.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "y": { + "value": { + "type": "Number", + "value": 28.95, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternCircular3d", diff --git a/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md index 2a7dcd93e..b078da727 100644 --- a/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/i-beam/artifact_graph_flowchart.snap.md @@ -177,72 +177,72 @@ flowchart LR 2 ---- 34 17 --- 35 17 x--> 52 - 17 --- 61 - 17 --- 78 + 17 --- 67 + 17 --- 84 18 --- 36 18 x--> 52 - 18 --- 55 - 18 --- 72 + 18 --- 58 + 18 --- 75 19 --- 37 19 x--> 52 - 19 --- 64 - 19 --- 81 + 19 --- 56 + 19 --- 73 20 --- 38 20 x--> 52 - 20 --- 63 - 20 --- 80 + 20 --- 68 + 20 --- 85 21 --- 39 21 x--> 52 - 21 --- 58 - 21 --- 75 + 21 --- 63 + 21 --- 80 22 --- 40 22 x--> 52 - 22 --- 66 - 22 --- 83 + 22 --- 54 + 22 --- 71 23 --- 41 23 x--> 52 - 23 --- 56 - 23 --- 73 + 23 --- 60 + 23 --- 77 24 --- 42 24 x--> 52 - 24 --- 68 - 24 --- 85 + 24 --- 57 + 24 --- 74 25 --- 43 25 x--> 52 - 25 --- 67 - 25 --- 84 + 25 --- 64 + 25 --- 81 26 --- 44 26 x--> 52 - 26 --- 54 - 26 --- 71 + 26 --- 59 + 26 --- 76 27 --- 45 27 x--> 52 27 --- 69 27 --- 86 28 --- 46 28 x--> 52 - 28 --- 60 - 28 --- 77 + 28 --- 66 + 28 --- 83 29 --- 47 29 x--> 52 - 29 --- 57 - 29 --- 74 + 29 --- 55 + 29 --- 72 30 --- 48 30 x--> 52 - 30 --- 65 - 30 --- 82 + 30 --- 61 + 30 --- 78 31 --- 49 31 x--> 52 - 31 --- 62 - 31 --- 79 + 31 --- 70 + 31 --- 87 32 --- 50 32 x--> 52 - 32 --- 70 - 32 --- 87 + 32 --- 65 + 32 --- 82 33 --- 51 33 x--> 52 - 33 --- 59 - 33 --- 76 + 33 --- 62 + 33 --- 79 34 --- 35 34 --- 36 34 --- 37 @@ -296,57 +296,57 @@ flowchart LR 34 --- 85 34 --- 86 34 --- 87 - 35 --- 61 - 77 <--x 35 - 35 --- 78 - 36 --- 55 - 71 <--x 36 - 36 --- 72 - 37 --- 64 - 80 <--x 37 - 37 --- 81 - 38 --- 63 - 79 <--x 38 - 38 --- 80 - 39 --- 58 - 74 <--x 39 - 39 --- 75 - 40 --- 66 - 82 <--x 40 - 40 --- 83 - 41 --- 56 - 72 <--x 41 - 41 --- 73 - 42 --- 68 - 84 <--x 42 - 42 --- 85 - 43 --- 67 - 83 <--x 43 - 43 --- 84 - 44 --- 54 - 44 --- 71 - 87 <--x 44 + 35 --- 67 + 83 <--x 35 + 35 --- 84 + 36 --- 58 + 74 <--x 36 + 36 --- 75 + 37 --- 56 + 72 <--x 37 + 37 --- 73 + 38 --- 68 + 84 <--x 38 + 38 --- 85 + 39 --- 63 + 79 <--x 39 + 39 --- 80 + 40 --- 54 + 40 --- 71 + 87 <--x 40 + 41 --- 60 + 76 <--x 41 + 41 --- 77 + 42 --- 57 + 73 <--x 42 + 42 --- 74 + 43 --- 64 + 80 <--x 43 + 43 --- 81 + 44 --- 59 + 75 <--x 44 + 44 --- 76 45 --- 69 85 <--x 45 45 --- 86 - 46 --- 60 - 76 <--x 46 - 46 --- 77 - 47 --- 57 - 73 <--x 47 - 47 --- 74 - 48 --- 65 - 81 <--x 48 - 48 --- 82 - 49 --- 62 - 78 <--x 49 - 49 --- 79 - 50 --- 70 - 86 <--x 50 - 50 --- 87 - 51 --- 59 - 75 <--x 51 - 51 --- 76 + 46 --- 66 + 82 <--x 46 + 46 --- 83 + 47 --- 55 + 71 <--x 47 + 47 --- 72 + 48 --- 61 + 77 <--x 48 + 48 --- 78 + 49 --- 70 + 86 <--x 49 + 49 --- 87 + 50 --- 65 + 81 <--x 50 + 50 --- 82 + 51 --- 62 + 78 <--x 51 + 51 --- 79 54 <--x 53 55 <--x 53 56 <--x 53 diff --git a/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap b/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap index 96384c5e1..c0f953720 100644 --- a/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/keyboard/ops.snap @@ -190,180 +190,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -375,180 +203,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -560,180 +216,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -745,180 +229,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -930,180 +242,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1115,180 +255,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1300,180 +268,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1485,180 +281,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1670,180 +294,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1855,180 +307,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2040,180 +320,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2225,180 +333,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2410,180 +346,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2595,180 +359,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2780,180 +372,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -2965,180 +385,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -3150,180 +398,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -3335,180 +411,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -3520,180 +424,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -3705,180 +437,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -3890,180 +450,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.7, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -8758,180 +5146,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.81, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -8975,180 +5191,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.81, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -9160,180 +5204,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.81, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -9409,180 +5281,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.81, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -9594,180 +5294,8 @@ description: Operations executed keyboard.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.81, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.12186934340514748, - "ty": { - "type": "Known", - "type": "Count" - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_commands.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_commands.snap index b3bc2a6cf..91ceb5f65 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_commands.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_commands.snap @@ -78,7 +78,7 @@ description: Artifact commands mounting-plate.kcl "path": "[uuid]", "to": { "x": -76.2, - "y": -127.0, + "y": 127.0, "z": 0.0 } } @@ -106,11 +106,11 @@ description: Artifact commands mounting-plate.kcl "segment": { "type": "line", "end": { - "x": 76.2, - "y": -127.0, + "x": 152.4, + "y": 0.0, "z": 0.0 }, - "relative": false + "relative": true } } }, @@ -123,11 +123,28 @@ description: Artifact commands mounting-plate.kcl "segment": { "type": "line", "end": { - "x": 76.2, - "y": 127.0, + "x": 0.0, + "y": -254.0, "z": 0.0 }, - "relative": false + "relative": true + } + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "extend_path", + "path": "[uuid]", + "segment": { + "type": "line", + "end": { + "x": -152.4, + "y": -0.0, + "z": 0.0 + }, + "relative": true } } }, @@ -714,40 +731,48 @@ description: Artifact commands mounting-plate.kcl "cmdId": "[uuid]", "range": [], "command": { - "type": "solid3d_get_prev_adjacent_edge", + "type": "solid3d_get_common_edge", "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" + "face_ids": [ + "[uuid]", + "[uuid]" + ] } }, { "cmdId": "[uuid]", "range": [], "command": { - "type": "solid3d_get_prev_adjacent_edge", + "type": "solid3d_get_common_edge", "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" + "face_ids": [ + "[uuid]", + "[uuid]" + ] } }, { "cmdId": "[uuid]", "range": [], "command": { - "type": "solid3d_get_prev_adjacent_edge", + "type": "solid3d_get_common_edge", "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" + "face_ids": [ + "[uuid]", + "[uuid]" + ] } }, { "cmdId": "[uuid]", "range": [], "command": { - "type": "solid3d_get_prev_adjacent_edge", + "type": "solid3d_get_common_edge", "object_id": "[uuid]", - "edge_id": "[uuid]", - "face_id": "[uuid]" + "face_ids": [ + "[uuid]", + "[uuid]" + ] } } ] diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md index 5ea0e1702..546e3861f 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/artifact_graph_flowchart.snap.md @@ -1,78 +1,80 @@ ```mermaid flowchart LR subgraph path2 [Path] - 2["Path
[584, 639, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] - 8["Segment
[647, 715, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] - 9["Segment
[723, 789, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] - 10["Segment
[797, 865, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] - 11["Segment
[873, 892, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] - 20[Solid2d] - end - subgraph path3 [Path] - 3["Path
[1150, 1295, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }, CallKwArg { index: 0 }] - 12["Segment
[1150, 1295, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }, CallKwArg { index: 0 }] + 2["Path
[506, 570, 0]"] + %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] + 8["Segment
[576, 641, 0]"] + %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] + 9["Segment
[647, 739, 0]"] + %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }] + 10["Segment
[745, 844, 0]"] + %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }] + 11["Segment
[850, 929, 0]"] + %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }] + 12["Segment
[935, 942, 0]"] + %% [ProgramBodyItem { index: 8 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }] 19[Solid2d] end + subgraph path3 [Path] + 3["Path
[1043, 1188, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }, CallKwArg { index: 0 }] + 13["Segment
[1043, 1188, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }, CallKwArg { index: 0 }] + 23[Solid2d] + end subgraph path4 [Path] - 4["Path
[1320, 1464, 0]"] + 4["Path
[1213, 1357, 0]"] %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }, CallKwArg { index: 0 }] - 13["Segment
[1320, 1464, 0]"] + 14["Segment
[1213, 1357, 0]"] %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 2 }, CallKwArg { index: 0 }] - 22[Solid2d] - end - subgraph path5 [Path] - 5["Path
[1489, 1635, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }] - 14["Segment
[1489, 1635, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }] - 21[Solid2d] - end - subgraph path6 [Path] - 6["Path
[1660, 1805, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }, CallKwArg { index: 0 }] - 15["Segment
[1660, 1805, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }, CallKwArg { index: 0 }] - 17[Solid2d] - end - subgraph path7 [Path] - 7["Path
[1830, 1882, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }, CallKwArg { index: 0 }] - 16["Segment
[1830, 1882, 0]"] - %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }, CallKwArg { index: 0 }] 18[Solid2d] end - 1["Plane
[559, 576, 0]"] - %% [ProgramBodyItem { index: 5 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] - 23["Sweep Extrusion
[1889, 1921, 0]"] + subgraph path5 [Path] + 5["Path
[1382, 1528, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }] + 15["Segment
[1382, 1528, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 3 }, CallKwArg { index: 0 }] + 20[Solid2d] + end + subgraph path6 [Path] + 6["Path
[1553, 1698, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }, CallKwArg { index: 0 }] + 16["Segment
[1553, 1698, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 4 }, CallKwArg { index: 0 }] + 22[Solid2d] + end + subgraph path7 [Path] + 7["Path
[1723, 1775, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }, CallKwArg { index: 0 }] + 17["Segment
[1723, 1775, 0]"] + %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 5 }, CallKwArg { index: 0 }] + 21[Solid2d] + end + 1["Plane
[476, 493, 0]"] + %% [ProgramBodyItem { index: 7 }, VariableDeclarationDeclaration, VariableDeclarationInit] + 24["Sweep Extrusion
[1782, 1814, 0]"] %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 6 }] - 24[Wall] - %% face_code_ref=Missing NodePath 25[Wall] %% face_code_ref=Missing NodePath 26[Wall] %% face_code_ref=Missing NodePath 27[Wall] %% face_code_ref=Missing NodePath - 28["Cap Start"] + 28[Wall] %% face_code_ref=Missing NodePath - 29["Cap End"] + 29["Cap Start"] + %% face_code_ref=Missing NodePath + 30["Cap End"] %% face_code_ref=Missing NodePath - 30["SweepEdge Opposite"] 31["SweepEdge Opposite"] 32["SweepEdge Opposite"] 33["SweepEdge Opposite"] - 34["SweepEdge Adjacent"] + 34["SweepEdge Opposite"] 35["SweepEdge Adjacent"] 36["SweepEdge Adjacent"] 37["SweepEdge Adjacent"] - 38["EdgeCut Fillet
[1927, 2192, 0]"] + 38["SweepEdge Adjacent"] + 39["EdgeCut Fillet
[1820, 2153, 0]"] %% [ProgramBodyItem { index: 9 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 7 }] 1 --- 2 1 --- 3 @@ -84,63 +86,64 @@ flowchart LR 2 --- 9 2 --- 10 2 --- 11 - 2 --- 20 - 2 ---- 23 - 3 --- 12 - 3 --- 19 - 4 --- 13 - 4 --- 22 - 5 --- 14 - 5 --- 21 - 6 --- 15 - 6 --- 17 - 7 --- 16 - 7 --- 18 - 8 --- 27 - 8 x--> 28 - 8 --- 30 + 2 --- 12 + 2 --- 19 + 2 ---- 24 + 3 --- 13 + 3 --- 23 + 4 --- 14 + 4 --- 18 + 5 --- 15 + 5 --- 20 + 6 --- 16 + 6 --- 22 + 7 --- 17 + 7 --- 21 + 8 --- 28 + 8 x--> 29 8 --- 34 - 9 --- 25 - 9 x--> 28 - 9 --- 31 - 9 --- 35 - 10 --- 24 - 10 x--> 28 + 8 --- 38 + 9 --- 26 + 9 x--> 29 + 9 --- 33 + 9 --- 37 + 10 --- 25 + 10 x--> 29 10 --- 32 10 --- 36 - 11 --- 26 - 11 x--> 28 - 11 --- 33 - 11 --- 37 - 23 --- 24 - 23 --- 25 - 23 --- 26 - 23 --- 27 - 23 --- 28 - 23 --- 29 - 23 --- 30 - 23 --- 31 - 23 --- 32 - 23 --- 33 - 23 --- 34 - 23 --- 35 - 23 --- 36 - 23 --- 37 + 11 --- 27 + 11 x--> 29 + 11 --- 31 + 11 --- 35 + 24 --- 25 + 24 --- 26 + 24 --- 27 + 24 --- 28 + 24 --- 29 + 24 --- 30 + 24 --- 31 24 --- 32 - 35 <--x 24 + 24 --- 33 + 24 --- 34 + 24 --- 35 24 --- 36 - 25 --- 31 - 34 <--x 25 - 25 --- 35 + 24 --- 37 + 24 --- 38 + 25 --- 32 + 25 --- 36 + 37 <--x 25 26 --- 33 - 36 <--x 26 26 --- 37 - 27 --- 30 - 27 --- 34 - 37 <--x 27 - 30 <--x 29 - 31 <--x 29 - 32 <--x 29 - 33 <--x 29 - 37 <--x 38 + 38 <--x 26 + 27 --- 31 + 27 --- 35 + 36 <--x 27 + 28 --- 34 + 35 <--x 28 + 28 --- 38 + 31 <--x 30 + 32 <--x 30 + 33 <--x 30 + 34 <--x 30 + 37 <--x 39 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap index 69ca3b847..9d4aebb3f 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ast.snap @@ -173,1018 +173,6 @@ description: Result of parsing mounting-plate.kcl "type": "VariableDeclaration", "type": "VariableDeclaration" }, - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "rectShape", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": { - "body": [ - { - "commentStart": 0, - "declaration": { - "commentStart": 0, - "end": 0, - "id": { - "commentStart": 0, - "end": 0, - "name": "rr", - "start": 0, - "type": "Identifier" - }, - "init": { - "body": [ - { - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "startSketchOn", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "XY", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "at", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "startProfile", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge1" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge2" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "endAbsolute", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "-", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - { - "commentStart": 0, - "end": 0, - "left": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "raw": "1", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 1.0, - "suffix": "None" - } - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "operator": "+", - "right": { - "commentStart": 0, - "end": 0, - "left": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "operator": "/", - "right": { - "commentStart": 0, - "end": 0, - "raw": "2", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 2.0, - "suffix": "None" - } - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - }, - "start": 0, - "type": "BinaryExpression", - "type": "BinaryExpression" - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge3" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "line", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - }, - { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "tag", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "end": 0, - "start": 0, - "type": "TagDeclarator", - "type": "TagDeclarator", - "value": "edge4" - } - } - ], - "callee": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "close", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "CallExpressionKw", - "type": "CallExpressionKw", - "unlabeled": null - } - ], - "commentStart": 0, - "end": 0, - "start": 0, - "type": "PipeExpression", - "type": "PipeExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "const", - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, - { - "argument": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "rr", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - }, - "commentStart": 0, - "end": 0, - "start": 0, - "type": "ReturnStatement", - "type": "ReturnStatement" - } - ], - "commentStart": 0, - "end": 0, - "start": 0 - }, - "commentStart": 0, - "end": 0, - "params": [ - { - "type": "Parameter", - "identifier": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier" - } - }, - { - "type": "Parameter", - "identifier": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - } - }, - { - "type": "Parameter", - "identifier": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - } - } - ], - "start": 0, - "type": "FunctionExpression", - "type": "FunctionExpression" - }, - "start": 0, - "type": "VariableDeclarator" - }, - "end": 0, - "kind": "fn", - "preComments": [ - "", - "", - "// Create a function that defines the body width and length of the mounting plate. Tag the corners so they can be passed through the fillet function." - ], - "start": 0, - "type": "VariableDeclaration", - "type": "VariableDeclaration" - }, { "commentStart": 0, "declaration": { @@ -1264,108 +252,11 @@ description: Result of parsing mounting-plate.kcl "id": { "commentStart": 0, "end": 0, - "name": "rs", + "name": "sketch001", "start": 0, "type": "Identifier" }, "init": { - "arguments": [ - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "pos", - "start": 0, - "type": "Identifier" - }, - "arg": { - "commentStart": 0, - "elements": [ - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - }, - { - "commentStart": 0, - "end": 0, - "raw": "0", - "start": 0, - "type": "Literal", - "type": "Literal", - "value": { - "value": 0.0, - "suffix": "None" - } - } - ], - "end": 0, - "start": 0, - "type": "ArrayExpression", - "type": "ArrayExpression" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "w", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateWidth", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - }, - { - "type": "LabeledArg", - "label": { - "commentStart": 0, - "end": 0, - "name": "l", - "start": 0, - "type": "Identifier" - }, - "arg": { - "abs_path": false, - "commentStart": 0, - "end": 0, - "name": { - "commentStart": 0, - "end": 0, - "name": "plateLength", - "start": 0, - "type": "Identifier" - }, - "path": [], - "start": 0, - "type": "Name", - "type": "Name" - } - } - ], "callee": { "abs_path": false, "commentStart": 0, @@ -1373,7 +264,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "rectShape", + "name": "startSketchOn", "start": 0, "type": "Identifier" }, @@ -1386,18 +277,733 @@ description: Result of parsing mounting-plate.kcl "start": 0, "type": "CallExpressionKw", "type": "CallExpressionKw", - "unlabeled": null + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "XY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "rectShape", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "at", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "left": { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "/", + "right": { + "commentStart": 0, + "end": 0, + "raw": "2", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 2.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startProfile", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateWidth", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "basePlateEdge1" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "left": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "segAng", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "operator": "-", + "right": { + "commentStart": 0, + "end": 0, + "raw": "90", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 90.0, + "suffix": "None" + } + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "plateLength", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "basePlateEdge2" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "angle", + "start": 0, + "type": "Identifier" + }, + "arg": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "segAng", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "length", + "start": 0, + "type": "Identifier" + }, + "arg": { + "argument": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "segLen", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "basePlateEdge3" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "angledLine", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "endAbsolute", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartX", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "profileStartY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeSubstitution", + "type": "PipeSubstitution" + } + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + }, + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "tag", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "TagDeclarator", + "type": "TagDeclarator", + "value": "basePlateEdge4" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "line", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "close", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + } + ], + "commentStart": 0, + "end": 0, + "nonCodeMeta": { + "nonCodeNodes": { + "5": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLineBlockComment", + "value": "Create the mounting plate extrusion, holes, and fillets", + "style": "line" + } + } + ] + }, + "startNodes": [] + }, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" }, "start": 0, "type": "VariableDeclarator" }, "end": 0, "kind": "const", - "preComments": [ - "", - "", - "// Create the mounting plate extrusion, holes, and fillets" - ], "start": 0, "type": "VariableDeclaration", "type": "VariableDeclaration" @@ -1423,7 +1029,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "rs", + "name": "rectShape", "start": 0, "type": "Identifier" }, @@ -2585,6 +2191,59 @@ description: Result of parsing mounting-plate.kcl "commentStart": 0, "elements": [ { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "faces", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge3", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], "callee": { "abs_path": false, "commentStart": 0, @@ -2592,7 +2251,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "getPreviousAdjacentEdge", + "name": "getCommonEdge", "start": 0, "type": "Identifier" }, @@ -2605,48 +2264,62 @@ description: Result of parsing mounting-plate.kcl "start": 0, "type": "CallExpressionKw", "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "rs", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "tags", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "edge1", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - } + "unlabeled": null }, { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "faces", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge4", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge3", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], "callee": { "abs_path": false, "commentStart": 0, @@ -2654,7 +2327,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "getPreviousAdjacentEdge", + "name": "getCommonEdge", "start": 0, "type": "Identifier" }, @@ -2667,48 +2340,62 @@ description: Result of parsing mounting-plate.kcl "start": 0, "type": "CallExpressionKw", "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "rs", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "tags", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "edge2", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - } + "unlabeled": null }, { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "faces", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge4", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], "callee": { "abs_path": false, "commentStart": 0, @@ -2716,7 +2403,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "getPreviousAdjacentEdge", + "name": "getCommonEdge", "start": 0, "type": "Identifier" }, @@ -2729,48 +2416,62 @@ description: Result of parsing mounting-plate.kcl "start": 0, "type": "CallExpressionKw", "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "rs", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "tags", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "edge3", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - } + "unlabeled": null }, { + "arguments": [ + { + "type": "LabeledArg", + "label": { + "commentStart": 0, + "end": 0, + "name": "faces", + "start": 0, + "type": "Identifier" + }, + "arg": { + "commentStart": 0, + "elements": [ + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge2", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "basePlateEdge1", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], "callee": { "abs_path": false, "commentStart": 0, @@ -2778,7 +2479,7 @@ description: Result of parsing mounting-plate.kcl "name": { "commentStart": 0, "end": 0, - "name": "getPreviousAdjacentEdge", + "name": "getCommonEdge", "start": 0, "type": "Identifier" }, @@ -2791,46 +2492,7 @@ description: Result of parsing mounting-plate.kcl "start": 0, "type": "CallExpressionKw", "type": "CallExpressionKw", - "unlabeled": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "computed": false, - "end": 0, - "object": { - "commentStart": 0, - "end": 0, - "name": "rs", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "tags", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - }, - "property": { - "commentStart": 0, - "end": 0, - "name": "edge4", - "start": 0, - "type": "Identifier", - "type": "Identifier" - }, - "start": 0, - "type": "MemberExpression", - "type": "MemberExpression" - } + "unlabeled": null } ], "end": 0, @@ -2960,7 +2622,19 @@ description: Result of parsing mounting-plate.kcl } ], "nonCodeMeta": { - "nonCodeNodes": {}, + "nonCodeNodes": { + "6": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, "startNodes": [ { "commentStart": 0, diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap index 3c9c4908c..2a98da382 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/ops.snap @@ -16,84 +16,6 @@ description: Operations executed mounting-plate.kcl "labeledArgs": {}, "sourceRange": [] }, - { - "type": "GroupBegin", - "group": { - "type": "FunctionCall", - "name": "rectShape", - "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": { - "l": { - "value": { - "type": "Number", - "value": 10.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "sourceRange": [] - }, - "pos": { - "value": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "sourceRange": [] - }, - "w": { - "value": { - "type": "Number", - "value": 6.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "sourceRange": [] - } - } - }, - "sourceRange": [] - }, { "type": "StdLibCall", "name": "subtract2d", @@ -306,8 +228,5 @@ description: Operations executed mounting-plate.kcl } }, "sourceRange": [] - }, - { - "type": "GroupEnd" } ] diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/program_memory.snap b/rust/kcl-lib/tests/kcl_samples/mounting-plate/program_memory.snap index 7e98a02ab..10bd93321 100644 --- a/rust/kcl-lib/tests/kcl_samples/mounting-plate/program_memory.snap +++ b/rust/kcl-lib/tests/kcl_samples/mounting-plate/program_memory.snap @@ -3,6 +3,26 @@ source: kcl-lib/src/simulation_tests.rs description: Variables in memory after executing mounting-plate.kcl --- { + "basePlateEdge1": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "basePlateEdge1" + }, + "basePlateEdge2": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "basePlateEdge2" + }, + "basePlateEdge3": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "basePlateEdge3" + }, + "basePlateEdge4": { + "type": "TagIdentifier", + "type": "TagIdentifier", + "value": "basePlateEdge4" + }, "centerHoleDiameter": { "type": "Number", "value": 2.0, @@ -16,26 +36,6 @@ description: Variables in memory after executing mounting-plate.kcl } } }, - "edge1": { - "type": "TagIdentifier", - "type": "TagIdentifier", - "value": "edge1" - }, - "edge2": { - "type": "TagIdentifier", - "type": "TagIdentifier", - "value": "edge2" - }, - "edge3": { - "type": "TagIdentifier", - "type": "TagIdentifier", - "value": "edge3" - }, - "edge4": { - "type": "TagIdentifier", - "type": "TagIdentifier", - "value": "edge4" - }, "filletRadius": { "type": "Number", "value": 0.5, @@ -87,11 +87,11 @@ description: Variables in memory after executing mounting-plate.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 708, - "end": 714, - "start": 708, + "commentStart": 625, + "end": 640, + "start": 625, "type": "TagDeclarator", - "value": "edge1" + "value": "basePlateEdge1" }, "type": "extrudePlane" }, @@ -100,11 +100,11 @@ description: Variables in memory after executing mounting-plate.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 782, - "end": 788, - "start": 782, + "commentStart": 723, + "end": 738, + "start": 723, "type": "TagDeclarator", - "value": "edge2" + "value": "basePlateEdge2" }, "type": "extrudePlane" }, @@ -113,11 +113,11 @@ description: Variables in memory after executing mounting-plate.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 858, - "end": 864, - "start": 858, + "commentStart": 828, + "end": 843, + "start": 828, "type": "TagDeclarator", - "value": "edge3" + "value": "basePlateEdge3" }, "type": "extrudePlane" }, @@ -126,11 +126,11 @@ description: Variables in memory after executing mounting-plate.kcl "id": "[uuid]", "sourceRange": [], "tag": { - "commentStart": 885, - "end": 891, - "start": 885, + "commentStart": 913, + "end": 928, + "start": 913, "type": "TagDeclarator", - "value": "edge4" + "value": "basePlateEdge4" }, "type": "extrudePlane" } @@ -146,39 +146,14 @@ description: Variables in memory after executing mounting-plate.kcl }, "from": [ -3.0, - -5.0 + 5.0 ], "tag": { - "commentStart": 708, - "end": 714, - "start": 708, + "commentStart": 625, + "end": 640, + "start": 625, "type": "TagDeclarator", - "value": "edge1" - }, - "to": [ - 3.0, - -5.0 - ], - "type": "ToPoint", - "units": { - "type": "Inches" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 3.0, - -5.0 - ], - "tag": { - "commentStart": 782, - "end": 788, - "start": 782, - "type": "TagDeclarator", - "value": "edge2" + "value": "basePlateEdge1" }, "to": [ 3.0, @@ -199,11 +174,61 @@ description: Variables in memory after executing mounting-plate.kcl 5.0 ], "tag": { - "commentStart": 858, - "end": 864, - "start": 858, + "commentStart": 723, + "end": 738, + "start": 723, "type": "TagDeclarator", - "value": "edge3" + "value": "basePlateEdge2" + }, + "to": [ + 3.0, + -5.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 3.0, + -5.0 + ], + "tag": { + "commentStart": 828, + "end": 843, + "start": 828, + "type": "TagDeclarator", + "value": "basePlateEdge3" + }, + "to": [ + -3.0, + -5.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -3.0, + -5.0 + ], + "tag": { + "commentStart": 913, + "end": 928, + "start": 913, + "type": "TagDeclarator", + "value": "basePlateEdge4" }, "to": [ -3.0, @@ -223,16 +248,10 @@ description: Variables in memory after executing mounting-plate.kcl -3.0, 5.0 ], - "tag": { - "commentStart": 885, - "end": 891, - "start": 885, - "type": "TagDeclarator", - "value": "edge4" - }, + "tag": null, "to": [ -3.0, - -5.0 + 5.0 ], "type": "ToPoint", "units": { @@ -273,11 +292,11 @@ description: Variables in memory after executing mounting-plate.kcl "start": { "from": [ -3.0, - -5.0 + 5.0 ], "to": [ -3.0, - -5.0 + 5.0 ], "units": { "type": "Inches" @@ -289,21 +308,21 @@ description: Variables in memory after executing mounting-plate.kcl } }, "tags": { - "edge1": { + "basePlateEdge1": { "type": "TagIdentifier", - "value": "edge1" + "value": "basePlateEdge1" }, - "edge2": { + "basePlateEdge2": { "type": "TagIdentifier", - "value": "edge2" + "value": "basePlateEdge2" }, - "edge3": { + "basePlateEdge3": { "type": "TagIdentifier", - "value": "edge3" + "value": "basePlateEdge3" }, - "edge4": { + "basePlateEdge4": { "type": "TagIdentifier", - "value": "edge4" + "value": "basePlateEdge4" } }, "artifactId": "[uuid]", @@ -435,10 +454,6 @@ description: Variables in memory after executing mounting-plate.kcl } }, "rectShape": { - "type": "Function", - "value": null - }, - "rs": { "type": "Sketch", "value": { "type": "Sketch", @@ -451,39 +466,14 @@ description: Variables in memory after executing mounting-plate.kcl }, "from": [ -3.0, - -5.0 + 5.0 ], "tag": { - "commentStart": 708, - "end": 714, - "start": 708, + "commentStart": 625, + "end": 640, + "start": 625, "type": "TagDeclarator", - "value": "edge1" - }, - "to": [ - 3.0, - -5.0 - ], - "type": "ToPoint", - "units": { - "type": "Inches" - } - }, - { - "__geoMeta": { - "id": "[uuid]", - "sourceRange": [] - }, - "from": [ - 3.0, - -5.0 - ], - "tag": { - "commentStart": 782, - "end": 788, - "start": 782, - "type": "TagDeclarator", - "value": "edge2" + "value": "basePlateEdge1" }, "to": [ 3.0, @@ -504,11 +494,61 @@ description: Variables in memory after executing mounting-plate.kcl 5.0 ], "tag": { - "commentStart": 858, - "end": 864, - "start": 858, + "commentStart": 723, + "end": 738, + "start": 723, "type": "TagDeclarator", - "value": "edge3" + "value": "basePlateEdge2" + }, + "to": [ + 3.0, + -5.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + 3.0, + -5.0 + ], + "tag": { + "commentStart": 828, + "end": 843, + "start": 828, + "type": "TagDeclarator", + "value": "basePlateEdge3" + }, + "to": [ + -3.0, + -5.0 + ], + "type": "ToPoint", + "units": { + "type": "Inches" + } + }, + { + "__geoMeta": { + "id": "[uuid]", + "sourceRange": [] + }, + "from": [ + -3.0, + -5.0 + ], + "tag": { + "commentStart": 913, + "end": 928, + "start": 913, + "type": "TagDeclarator", + "value": "basePlateEdge4" }, "to": [ -3.0, @@ -528,16 +568,10 @@ description: Variables in memory after executing mounting-plate.kcl -3.0, 5.0 ], - "tag": { - "commentStart": 885, - "end": 891, - "start": 885, - "type": "TagDeclarator", - "value": "edge4" - }, + "tag": null, "to": [ -3.0, - -5.0 + 5.0 ], "type": "ToPoint", "units": { @@ -578,11 +612,11 @@ description: Variables in memory after executing mounting-plate.kcl "start": { "from": [ -3.0, - -5.0 + 5.0 ], "to": [ -3.0, - -5.0 + 5.0 ], "units": { "type": "Inches" @@ -594,21 +628,21 @@ description: Variables in memory after executing mounting-plate.kcl } }, "tags": { - "edge1": { + "basePlateEdge1": { "type": "TagIdentifier", - "value": "edge1" + "value": "basePlateEdge1" }, - "edge2": { + "basePlateEdge2": { "type": "TagIdentifier", - "value": "edge2" + "value": "basePlateEdge2" }, - "edge3": { + "basePlateEdge3": { "type": "TagIdentifier", - "value": "edge3" + "value": "basePlateEdge3" }, - "edge4": { + "basePlateEdge4": { "type": "TagIdentifier", - "value": "edge4" + "value": "basePlateEdge4" } }, "artifactId": "[uuid]", @@ -617,5 +651,37 @@ description: Variables in memory after executing mounting-plate.kcl "type": "Inches" } } + }, + "sketch001": { + "type": "Plane", + "value": { + "artifactId": "[uuid]", + "id": "[uuid]", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Mm" + } + }, + "value": "XY", + "xAxis": { + "x": 1.0, + "y": 0.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + }, + "yAxis": { + "x": 0.0, + "y": 1.0, + "z": 0.0, + "units": { + "type": "Unknown" + } + } + } } } diff --git a/rust/kcl-lib/tests/kcl_samples/mounting-plate/rendered_model.png b/rust/kcl-lib/tests/kcl_samples/mounting-plate/rendered_model.png index 316ac5373..c20858030 100644 Binary files a/rust/kcl-lib/tests/kcl_samples/mounting-plate/rendered_model.png and b/rust/kcl-lib/tests/kcl_samples/mounting-plate/rendered_model.png differ diff --git a/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/ops.snap b/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/ops.snap index 44b27c425..12f72dbd1 100644 --- a/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/pdu-faceplate/ops.snap @@ -387,6 +387,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -208.963, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -470,6 +534,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -158.4, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", @@ -545,6 +673,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -158.4, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -573,6 +765,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -128.063, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -601,6 +857,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -97.725, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", @@ -624,6 +944,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -97.725, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", @@ -679,6 +1063,70 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -97.725, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", @@ -851,6 +1299,134 @@ description: Operations executed pdu-faceplate.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 222.475, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -266.3, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -13.335, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", diff --git a/rust/kcl-lib/tests/kcl_samples/pillow-block-bearing/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/pillow-block-bearing/artifact_graph_flowchart.snap.md index d1a4c2b0a..7e536c670 100644 --- a/rust/kcl-lib/tests/kcl_samples/pillow-block-bearing/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/pillow-block-bearing/artifact_graph_flowchart.snap.md @@ -259,7 +259,8 @@ flowchart LR 182["SweepEdge Adjacent"] 183["SweepEdge Adjacent"] 184["SweepEdge Adjacent"] - 185["EdgeCut Fillet
[1308, 1593, 3]"] + 185["SweepEdge Adjacent"] + 186["EdgeCut Fillet
[1308, 1593, 3]"] 1 --- 6 2 --- 7 3 --- 8 @@ -347,44 +348,44 @@ flowchart LR 129 --- 20 77 <--x 21 21 --- 103 - 21 x--> 161 + 21 --- 161 77 <--x 22 22 --- 104 - 22 --- 161 + 22 --- 162 78 <--x 23 23 --- 124 - 23 --- 181 + 23 --- 182 78 <--x 24 24 --- 125 - 24 --- 182 + 24 --- 183 78 <--x 25 25 --- 126 - 25 --- 183 + 25 --- 184 78 <--x 26 26 --- 127 - 26 --- 184 + 26 --- 185 27 --- 107 27 x--> 133 27 --- 138 - 27 --- 164 + 27 --- 165 79 <--x 28 28 --- 114 - 28 --- 166 + 28 --- 167 79 <--x 29 29 --- 113 - 29 --- 167 + 29 --- 168 79 <--x 30 30 --- 111 - 30 --- 168 + 30 --- 169 79 <--x 31 31 --- 112 - 31 --- 169 + 31 --- 170 79 <--x 32 32 --- 109 - 32 --- 170 + 32 --- 171 79 <--x 33 33 --- 110 - 33 --- 171 + 33 --- 172 80 <--x 35 35 --- 101 35 --- 149 @@ -424,74 +425,75 @@ flowchart LR 48 --- 116 48 x--> 128 48 --- 140 - 48 --- 172 + 48 --- 173 49 --- 117 49 x--> 128 49 --- 141 - 49 --- 173 + 49 --- 174 50 --- 118 50 x--> 128 50 --- 142 - 50 --- 174 + 50 --- 175 51 --- 115 51 x--> 128 51 --- 143 - 51 --- 175 + 51 --- 176 54 --- 122 54 x--> 134 54 --- 147 - 54 --- 179 + 54 --- 180 55 --- 123 55 x--> 134 55 --- 148 - 55 --- 180 + 55 --- 181 56 --- 106 56 x--> 134 56 --- 137 - 56 --- 163 + 56 --- 164 57 --- 119 57 x--> 134 57 --- 144 - 57 --- 176 + 57 --- 177 58 --- 108 58 x--> 130 58 --- 139 - 58 --- 165 + 58 --- 166 59 --- 120 59 x--> 131 59 --- 145 - 59 --- 177 + 59 --- 178 60 --- 105 60 x--> 129 60 --- 136 - 60 --- 162 + 60 --- 163 61 --- 121 61 x--> 132 61 --- 146 - 61 --- 178 + 61 --- 179 77 --- 103 77 --- 104 77 --- 161 + 77 --- 162 78 --- 124 78 --- 125 78 --- 126 78 --- 127 - 78 --- 181 78 --- 182 78 --- 183 78 --- 184 + 78 --- 185 79 --- 109 79 --- 110 79 --- 111 79 --- 112 79 --- 113 79 --- 114 - 79 --- 166 79 --- 167 79 --- 168 79 --- 169 79 --- 170 79 --- 171 + 79 --- 172 80 --- 91 80 --- 92 80 --- 93 @@ -520,7 +522,7 @@ flowchart LR 81 --- 133 81 --- 135 81 --- 138 - 81 --- 164 + 81 --- 165 82 --- 115 82 --- 116 82 --- 117 @@ -531,38 +533,38 @@ flowchart LR 82 --- 141 82 --- 142 82 --- 143 - 82 --- 172 82 --- 173 82 --- 174 82 --- 175 + 82 --- 176 83 --- 106 83 --- 131 83 --- 137 - 83 --- 163 + 83 --- 164 84 --- 119 84 --- 130 84 --- 144 - 84 --- 176 + 84 --- 177 85 --- 122 85 --- 129 85 --- 147 - 85 --- 179 + 85 --- 180 86 --- 123 86 --- 132 86 --- 148 - 86 --- 180 + 86 --- 181 87 --- 105 87 --- 136 - 87 --- 162 + 87 --- 163 88 --- 108 88 --- 139 - 88 --- 165 + 88 --- 166 89 --- 120 89 --- 145 - 89 --- 177 + 89 --- 178 90 --- 121 90 --- 146 - 90 --- 178 + 90 --- 179 155 <--x 91 91 --- 156 154 <--x 92 @@ -588,57 +590,59 @@ flowchart LR 153 <--x 102 102 --- 154 103 --- 161 - 104 --- 161 + 162 <--x 103 + 161 <--x 104 + 104 --- 162 105 --- 136 - 105 --- 162 + 105 --- 163 106 --- 137 - 106 --- 163 + 106 --- 164 107 --- 138 - 107 --- 164 + 107 --- 165 108 --- 139 - 108 --- 165 - 169 <--x 109 - 109 --- 170 - 170 <--x 110 - 110 --- 171 - 167 <--x 111 - 111 --- 168 - 168 <--x 112 - 112 --- 169 - 166 <--x 113 - 113 --- 167 - 114 --- 166 - 171 <--x 114 + 108 --- 166 + 170 <--x 109 + 109 --- 171 + 171 <--x 110 + 110 --- 172 + 168 <--x 111 + 111 --- 169 + 169 <--x 112 + 112 --- 170 + 167 <--x 113 + 113 --- 168 + 114 --- 167 + 172 <--x 114 115 --- 143 - 174 <--x 115 - 115 --- 175 + 175 <--x 115 + 115 --- 176 116 --- 140 - 116 --- 172 - 175 <--x 116 + 116 --- 173 + 176 <--x 116 117 --- 141 - 172 <--x 117 - 117 --- 173 + 173 <--x 117 + 117 --- 174 118 --- 142 - 173 <--x 118 - 118 --- 174 + 174 <--x 118 + 118 --- 175 119 --- 144 - 119 --- 176 + 119 --- 177 120 --- 145 - 120 --- 177 + 120 --- 178 121 --- 146 - 121 --- 178 + 121 --- 179 122 --- 147 - 122 --- 179 + 122 --- 180 123 --- 148 - 123 --- 180 - 124 --- 181 - 184 <--x 124 - 181 <--x 125 - 125 --- 182 - 182 <--x 126 - 126 --- 183 - 183 <--x 127 - 127 --- 184 + 123 --- 181 + 124 --- 182 + 185 <--x 124 + 182 <--x 125 + 125 --- 183 + 183 <--x 126 + 126 --- 184 + 184 <--x 127 + 127 --- 185 136 <--x 128 139 <--x 128 145 <--x 128 @@ -652,5 +656,5 @@ flowchart LR 142 <--x 134 143 <--x 134 138 <--x 135 - 173 <--x 185 + 174 <--x 186 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap index 710b7d93a..beddea7bc 100644 --- a/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/pipe-flange-assembly/ops.snap @@ -88,6 +88,213 @@ description: Operations executed pipe-flange-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.151, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -0.091, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -99,6 +306,70 @@ description: Operations executed pipe-flange-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 2.375, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.69, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternCircular3d", @@ -363,6 +634,134 @@ description: Operations executed pipe-flange-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 2.375, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.722, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 90.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternCircular3d", @@ -514,6 +913,70 @@ description: Operations executed pipe-flange-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 2.375, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -1.42, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternCircular3d", @@ -665,6 +1128,141 @@ description: Operations executed pipe-flange-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": -90.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.44, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -676,6 +1274,141 @@ description: Operations executed pipe-flange-assembly.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 90.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -0.591, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", diff --git a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ops.snap b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ops.snap index 84302ddf3..3b2556b7d 100644 --- a/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/poopy-shoe/ops.snap @@ -168,141 +168,8 @@ description: Operations executed poopy-shoe.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": -1.4375, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -401,141 +268,8 @@ description: Operations executed poopy-shoe.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": -3.875, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -690,141 +424,8 @@ description: Operations executed poopy-shoe.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": -3.875, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.125, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "xAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": -1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - }, - "yAxis": { - "type": "Object", - "value": { - "x": { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "y": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - "z": { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - } - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_graph_flowchart.snap.md index c85027d93..8c43a43c1 100644 --- a/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/artifact_graph_flowchart.snap.md @@ -300,6 +300,7 @@ flowchart LR 164["SweepEdge Adjacent"] 165["SweepEdge Adjacent"] 166["SweepEdge Adjacent"] + 167["SweepEdge Adjacent"] 1 --- 11 2 <--x 10 2 --- 12 @@ -441,22 +442,22 @@ flowchart LR 54 --- 138 89 <--x 56 56 --- 115 - 56 x--> 156 + 56 --- 156 89 <--x 57 57 --- 114 - 57 --- 156 + 57 --- 157 89 <--x 58 58 --- 110 - 58 --- 157 + 58 --- 158 89 <--x 59 59 --- 113 - 59 --- 158 + 59 --- 159 89 <--x 60 60 --- 112 - 60 --- 159 + 60 --- 160 89 <--x 61 61 --- 111 - 61 --- 160 + 61 --- 161 90 <--x 63 63 --- 102 63 --- 144 @@ -477,22 +478,22 @@ flowchart LR 68 --- 149 91 <--x 70 70 --- 118 - 70 --- 161 + 70 --- 162 91 <--x 71 71 --- 121 - 71 --- 162 + 71 --- 163 91 <--x 72 72 --- 120 - 72 --- 163 + 72 --- 164 91 <--x 73 73 --- 116 - 73 --- 164 + 73 --- 165 91 <--x 74 74 --- 119 - 74 --- 165 + 74 --- 166 91 <--x 75 75 --- 117 - 75 --- 166 + 75 --- 167 86 --- 104 86 --- 105 86 --- 106 @@ -544,6 +545,7 @@ flowchart LR 89 --- 158 89 --- 159 89 --- 160 + 89 --- 161 90 --- 98 90 --- 99 90 --- 100 @@ -562,12 +564,12 @@ flowchart LR 91 --- 119 91 --- 120 91 --- 121 - 91 --- 161 91 --- 162 91 --- 163 91 --- 164 91 --- 165 91 --- 166 + 91 --- 167 92 --- 127 92 --- 139 140 <--x 92 @@ -616,28 +618,30 @@ flowchart LR 109 --- 132 109 --- 150 151 <--x 109 - 110 --- 157 - 159 <--x 111 - 111 --- 160 - 158 <--x 112 - 112 --- 159 - 157 <--x 113 - 113 --- 158 - 114 --- 156 + 157 <--x 110 + 110 --- 158 + 160 <--x 111 + 111 --- 161 + 159 <--x 112 + 112 --- 160 + 158 <--x 113 + 113 --- 159 + 156 <--x 114 + 114 --- 157 115 --- 156 - 160 <--x 115 - 163 <--x 116 - 116 --- 164 - 165 <--x 117 - 117 --- 166 - 118 --- 161 - 166 <--x 118 - 164 <--x 119 - 119 --- 165 - 162 <--x 120 - 120 --- 163 - 161 <--x 121 - 121 --- 162 + 161 <--x 115 + 164 <--x 116 + 116 --- 165 + 166 <--x 117 + 117 --- 167 + 118 --- 162 + 167 <--x 118 + 165 <--x 119 + 119 --- 166 + 163 <--x 120 + 120 --- 164 + 162 <--x 121 + 121 --- 163 132 <--x 124 133 <--x 124 134 <--x 124 diff --git a/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/ops.snap b/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/ops.snap index c40230ed2..f2727367b 100644 --- a/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/prosthetic-hip/ops.snap @@ -74,15 +74,66 @@ description: Operations executed prosthetic-hip.kcl }, { "type": "StdLibCall", - "name": "startSketchOn", + "name": "translate", "unlabeledArg": { "value": { - "type": "Plane", - "artifact_id": "[uuid]" + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } }, "sourceRange": [] }, - "labeledArgs": {}, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 110.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -25.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, "sourceRange": [] }, { @@ -98,6 +149,70 @@ description: Operations executed prosthetic-hip.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 130.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", @@ -111,6 +226,147 @@ description: Operations executed prosthetic-hip.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 140.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 145.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "loft", @@ -360,23 +616,10 @@ description: Operations executed prosthetic-hip.kcl }, { "type": "StdLibCall", - "name": "startSketchOn", + "name": "translate", "unlabeledArg": { "value": { - "type": "Plane", - "artifact_id": "[uuid]" - }, - "sourceRange": [] - }, - "labeledArgs": {}, - "sourceRange": [] - }, - { - "type": "StdLibCall", - "name": "revolve", - "unlabeledArg": { - "value": { - "type": "Sketch", + "type": "Solid", "value": { "artifactId": "[uuid]" } @@ -384,10 +627,10 @@ description: Operations executed prosthetic-hip.kcl "sourceRange": [] }, "labeledArgs": { - "angle": { + "x": { "value": { "type": "Number", - "value": 360.0, + "value": -16.1, "ty": { "type": "Default", "len": { @@ -400,71 +643,49 @@ description: Operations executed prosthetic-hip.kcl }, "sourceRange": [] }, - "axis": { + "z": { "value": { - "type": "Object", - "value": { - "direction": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] + "type": "Number", + "value": 133.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" }, - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" } } }, @@ -587,5 +808,280 @@ description: Operations executed prosthetic-hip.kcl } }, "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -16.1, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 133.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "revolve", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 360.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Object", + "value": { + "direction": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "origin": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -16.1, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 133.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": -36.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] } ] diff --git a/rust/kcl-lib/tests/kcl_samples/router-template-cross-bar/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/router-template-cross-bar/artifact_graph_flowchart.snap.md index 46068901b..bc63e871c 100644 --- a/rust/kcl-lib/tests/kcl_samples/router-template-cross-bar/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/router-template-cross-bar/artifact_graph_flowchart.snap.md @@ -595,28 +595,28 @@ flowchart LR 75 --- 137 76 --- 115 76 --- 146 - 149 <--x 76 + 147 <--x 76 77 --- 116 - 146 <--x 77 77 --- 147 + 148 <--x 77 78 --- 118 - 148 <--x 78 + 146 <--x 78 78 --- 149 79 --- 117 - 147 <--x 79 79 --- 148 + 149 <--x 79 80 --- 120 - 150 <--x 80 80 --- 151 + 152 <--x 80 81 --- 122 - 152 <--x 81 + 150 <--x 81 81 --- 153 82 --- 119 82 --- 150 - 153 <--x 82 + 151 <--x 82 83 --- 121 - 151 <--x 83 83 --- 152 + 153 <--x 83 115 <--x 88 116 <--x 88 117 <--x 88 diff --git a/rust/kcl-lib/tests/kcl_samples/router-template-slate/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/router-template-slate/artifact_graph_flowchart.snap.md index c4057bf4b..6ead50aee 100644 --- a/rust/kcl-lib/tests/kcl_samples/router-template-slate/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/router-template-slate/artifact_graph_flowchart.snap.md @@ -213,31 +213,31 @@ flowchart LR 11 --- 38 11 x--> 57 11 --- 67 - 11 --- 85 + 11 x--> 86 13 --- 42 13 x--> 57 13 --- 66 - 13 --- 84 + 13 --- 85 14 --- 45 14 x--> 57 14 --- 65 - 14 --- 83 + 14 --- 84 15 --- 44 15 x--> 57 15 --- 64 - 15 --- 82 + 15 --- 83 16 --- 36 16 x--> 57 16 --- 63 - 16 --- 81 + 16 --- 82 17 --- 37 17 x--> 57 17 --- 62 - 17 --- 80 + 17 --- 81 18 --- 46 18 x--> 57 18 --- 61 - 18 x--> 89 + 18 --- 80 20 --- 48 20 x--> 55 20 --- 72 @@ -333,36 +333,36 @@ flowchart LR 35 --- 96 35 --- 97 36 --- 63 - 36 --- 81 - 82 <--x 36 + 36 --- 82 + 83 <--x 36 37 --- 62 - 37 --- 80 - 81 <--x 37 + 37 --- 81 + 82 <--x 37 38 --- 67 - 38 --- 85 + 38 --- 86 39 --- 69 - 86 <--x 39 39 --- 87 + 88 <--x 39 40 --- 70 - 87 <--x 40 40 --- 88 + 89 <--x 40 41 --- 68 - 85 <--x 41 41 --- 86 + 87 <--x 41 42 --- 66 - 42 --- 84 + 42 --- 85 43 --- 71 - 88 <--x 43 + 80 <--x 43 43 --- 89 44 --- 64 - 44 --- 82 - 83 <--x 44 + 44 --- 83 + 84 <--x 44 45 --- 65 - 45 --- 83 - 84 <--x 45 + 45 --- 84 + 85 <--x 45 46 --- 61 - 80 <--x 46 - 46 --- 89 + 46 --- 80 + 81 <--x 46 47 --- 74 91 <--x 47 47 --- 92 @@ -376,16 +376,16 @@ flowchart LR 92 <--x 50 50 --- 93 51 --- 78 - 95 <--x 51 51 --- 96 + 97 <--x 51 52 --- 76 52 --- 94 - 97 <--x 52 + 95 <--x 52 53 --- 77 - 94 <--x 53 53 --- 95 + 96 <--x 53 54 --- 79 - 96 <--x 54 + 94 <--x 54 54 --- 97 72 <--x 58 73 <--x 58 diff --git a/rust/kcl-lib/tests/kcl_samples/sash-window/ops.snap b/rust/kcl-lib/tests/kcl_samples/sash-window/ops.snap index ca7fc844c..19ce2b553 100644 --- a/rust/kcl-lib/tests/kcl_samples/sash-window/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/sash-window/ops.snap @@ -709,6 +709,134 @@ description: Operations executed sash-window.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": -227.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", @@ -784,6 +912,134 @@ description: Operations executed sash-window.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -12.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", @@ -859,6 +1115,198 @@ description: Operations executed sash-window.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -12.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": -0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupBegin", "group": { @@ -1006,6 +1454,70 @@ description: Operations executed sash-window.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 227.5, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", diff --git a/rust/kcl-lib/tests/kcl_samples/shepherds-hook-bolt/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/shepherds-hook-bolt/artifact_graph_flowchart.snap.md index 566a5a944..da692f7ee 100644 --- a/rust/kcl-lib/tests/kcl_samples/shepherds-hook-bolt/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/shepherds-hook-bolt/artifact_graph_flowchart.snap.md @@ -87,7 +87,8 @@ flowchart LR 42["SweepEdge Adjacent"] 43["SweepEdge Adjacent"] 44["SweepEdge Adjacent"] - 45["EdgeCut Fillet
[2297, 2422, 0]"] + 45["SweepEdge Adjacent"] + 46["EdgeCut Fillet
[2297, 2422, 0]"] %% [ProgramBodyItem { index: 22 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 1 }] 1 --- 5 2 --- 6 @@ -117,22 +118,22 @@ flowchart LR 13 --- 31 13 x--> 35 13 --- 39 - 13 --- 44 + 13 --- 45 25 <--x 14 14 --- 28 - 14 x--> 40 + 14 --- 40 25 <--x 15 15 --- 29 - 15 --- 40 + 15 --- 41 25 <--x 16 16 --- 26 - 16 --- 41 + 16 --- 42 25 <--x 17 17 --- 27 - 17 --- 42 + 17 --- 43 25 <--x 18 18 --- 30 - 18 --- 43 + 18 --- 44 23 --- 32 23 --- 33 23 --- 34 @@ -142,7 +143,7 @@ flowchart LR 24 --- 35 24 --- 37 24 --- 39 - 24 --- 44 + 24 --- 45 25 --- 26 25 --- 27 25 --- 28 @@ -152,16 +153,18 @@ flowchart LR 25 --- 41 25 --- 42 25 --- 43 - 26 --- 41 - 41 <--x 27 - 27 --- 42 + 25 --- 44 + 26 --- 42 + 42 <--x 27 + 27 --- 43 28 --- 40 - 43 <--x 28 - 29 --- 40 - 42 <--x 30 - 30 --- 43 + 44 <--x 28 + 40 <--x 29 + 29 --- 41 + 43 <--x 30 + 30 --- 44 31 --- 39 - 31 --- 44 + 31 --- 45 39 <--x 37 - 39 <--x 45 + 39 <--x 46 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/ops.snap b/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/ops.snap index b5de954e7..be7e4b54c 100644 --- a/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/spur-reduction-gearset/ops.snap @@ -535,6 +535,70 @@ description: Operations executed spur-reduction-gearset.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 52.3, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "yaw": { + "value": { + "type": "Number", + "value": 3.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" }, diff --git a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_graph_flowchart.snap.md index b116a9da6..49b1ddbf9 100644 --- a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/artifact_graph_flowchart.snap.md @@ -1085,440 +1085,440 @@ flowchart LR 3 --- 212 101 --- 215 101 x--> 325 - 101 --- 356 - 101 --- 465 + 101 --- 361 + 101 --- 470 102 --- 216 102 x--> 325 - 102 --- 327 - 102 --- 436 + 102 --- 337 + 102 --- 446 103 --- 217 103 x--> 325 - 103 --- 418 - 103 --- 527 + 103 --- 383 + 103 --- 492 104 --- 218 104 x--> 325 - 104 --- 364 - 104 --- 473 + 104 --- 350 + 104 --- 459 105 --- 219 105 x--> 325 - 105 --- 396 - 105 --- 505 + 105 --- 408 + 105 --- 517 106 --- 220 106 x--> 325 - 106 --- 374 - 106 --- 483 + 106 --- 422 + 106 --- 531 107 --- 221 107 x--> 325 - 107 --- 405 - 107 --- 514 + 107 --- 352 + 107 --- 461 108 --- 222 108 x--> 325 - 108 --- 369 - 108 --- 478 + 108 --- 377 + 108 --- 486 109 --- 223 109 x--> 325 - 109 --- 409 - 109 --- 518 + 109 --- 396 + 109 --- 505 110 --- 224 110 x--> 325 - 110 --- 422 - 110 --- 531 + 110 --- 373 + 110 --- 482 111 --- 225 111 x--> 325 - 111 --- 347 - 111 --- 456 + 111 --- 366 + 111 --- 475 112 --- 226 112 x--> 325 - 112 --- 400 - 112 --- 509 + 112 --- 433 + 112 --- 542 113 --- 227 113 x--> 325 - 113 --- 382 - 113 --- 491 + 113 --- 347 + 113 --- 456 114 --- 228 114 x--> 325 - 114 --- 388 - 114 --- 497 + 114 --- 429 + 114 --- 538 115 --- 229 115 x--> 325 - 115 --- 428 - 115 --- 537 + 115 --- 345 + 115 --- 454 116 --- 230 116 x--> 325 - 116 --- 333 - 116 --- 442 + 116 --- 379 + 116 --- 488 117 --- 231 117 x--> 325 - 117 --- 387 - 117 --- 496 + 117 --- 348 + 117 --- 457 118 --- 232 118 x--> 325 - 118 --- 410 - 118 --- 519 + 118 --- 360 + 118 --- 469 119 --- 233 119 x--> 325 - 119 --- 407 - 119 --- 516 + 119 --- 359 + 119 --- 468 120 --- 234 120 x--> 325 - 120 --- 419 - 120 --- 528 + 120 --- 390 + 120 --- 499 121 --- 235 121 x--> 325 - 121 --- 358 - 121 --- 467 + 121 --- 330 + 121 --- 439 122 --- 236 122 x--> 325 - 122 --- 413 - 122 --- 522 + 122 --- 391 + 122 --- 500 123 --- 237 123 x--> 325 - 123 --- 420 - 123 --- 529 + 123 --- 375 + 123 --- 484 124 --- 238 124 x--> 325 - 124 --- 367 - 124 --- 476 + 124 --- 418 + 124 --- 527 125 --- 239 125 x--> 325 - 125 --- 348 - 125 --- 457 + 125 --- 380 + 125 --- 489 126 --- 240 126 x--> 325 - 126 --- 430 - 126 --- 539 + 126 --- 411 + 126 --- 520 127 --- 241 127 x--> 325 - 127 --- 363 - 127 --- 472 + 127 --- 403 + 127 --- 512 128 --- 242 128 x--> 325 - 128 --- 354 - 128 --- 463 + 128 --- 339 + 128 --- 448 129 --- 243 129 x--> 325 - 129 --- 341 - 129 --- 450 + 129 --- 409 + 129 --- 518 130 --- 244 130 x--> 325 - 130 --- 404 - 130 --- 513 + 130 --- 338 + 130 --- 447 131 --- 245 131 x--> 325 - 131 --- 361 - 131 --- 470 + 131 --- 374 + 131 --- 483 132 --- 246 132 x--> 325 - 132 --- 371 - 132 --- 480 + 132 --- 358 + 132 --- 467 133 --- 247 133 x--> 325 - 133 --- 365 - 133 --- 474 + 133 --- 397 + 133 --- 506 134 --- 248 134 x--> 325 - 134 --- 372 - 134 --- 481 + 134 --- 425 + 134 --- 534 135 --- 249 135 x--> 325 - 135 --- 351 - 135 --- 460 + 135 --- 356 + 135 --- 465 136 --- 250 136 x--> 325 - 136 --- 411 - 136 --- 520 + 136 --- 388 + 136 --- 497 137 --- 251 137 x--> 325 - 137 --- 375 - 137 --- 484 + 137 --- 399 + 137 --- 508 138 --- 252 138 x--> 325 - 138 --- 350 - 138 --- 459 + 138 --- 367 + 138 --- 476 139 --- 253 139 x--> 325 - 139 --- 398 - 139 --- 507 + 139 --- 420 + 139 --- 529 140 --- 254 140 x--> 325 - 140 --- 342 - 140 --- 451 + 140 --- 392 + 140 --- 501 141 --- 255 141 x--> 325 - 141 --- 328 - 141 --- 437 + 141 --- 394 + 141 --- 503 142 --- 256 142 x--> 325 - 142 --- 416 - 142 --- 525 + 142 --- 415 + 142 --- 524 143 --- 257 143 x--> 325 - 143 --- 399 - 143 --- 508 + 143 --- 410 + 143 --- 519 144 --- 258 144 x--> 325 - 144 --- 334 - 144 --- 443 + 144 --- 333 + 144 --- 442 145 --- 259 145 x--> 325 - 145 --- 432 - 145 --- 541 + 145 --- 419 + 145 --- 528 146 --- 260 146 x--> 325 - 146 --- 357 - 146 --- 466 + 146 --- 351 + 146 --- 460 147 --- 261 147 x--> 325 - 147 --- 403 - 147 --- 512 + 147 --- 404 + 147 --- 513 148 --- 262 148 x--> 325 - 148 --- 366 - 148 --- 475 + 148 --- 378 + 148 --- 487 149 --- 263 149 x--> 325 - 149 --- 362 - 149 --- 471 + 149 --- 363 + 149 --- 472 150 --- 264 150 x--> 325 - 150 --- 414 - 150 --- 523 + 150 --- 405 + 150 --- 514 151 --- 265 151 x--> 325 - 151 --- 423 - 151 --- 532 + 151 --- 342 + 151 --- 451 152 --- 266 152 x--> 325 - 152 --- 379 - 152 --- 488 + 152 --- 370 + 152 --- 479 153 --- 267 153 x--> 325 - 153 --- 415 - 153 --- 524 + 153 --- 371 + 153 --- 480 154 --- 268 154 x--> 325 - 154 --- 326 - 154 --- 435 + 154 --- 327 + 154 --- 436 155 --- 269 155 x--> 325 - 155 --- 385 - 155 --- 494 + 155 --- 402 + 155 --- 511 156 --- 270 156 x--> 325 - 156 --- 426 - 156 --- 535 + 156 --- 357 + 156 --- 466 157 --- 271 157 x--> 325 - 157 --- 376 - 157 --- 485 + 157 --- 384 + 157 --- 493 158 --- 272 158 x--> 325 - 158 --- 368 - 158 --- 477 + 158 --- 430 + 158 --- 539 159 --- 273 159 x--> 325 - 159 --- 377 - 159 --- 486 + 159 --- 335 + 159 --- 444 160 --- 274 160 x--> 325 - 160 --- 424 - 160 --- 533 + 160 --- 334 + 160 --- 443 161 --- 275 161 x--> 325 - 161 --- 345 - 161 --- 454 + 161 --- 354 + 161 --- 463 162 --- 276 162 x--> 325 - 162 --- 329 - 162 --- 438 + 162 --- 406 + 162 --- 515 163 --- 277 163 x--> 325 - 163 --- 352 - 163 --- 461 + 163 --- 427 + 163 --- 536 164 --- 278 164 x--> 325 - 164 --- 391 - 164 --- 500 + 164 --- 336 + 164 --- 445 165 --- 279 165 x--> 325 - 165 --- 393 - 165 --- 502 + 165 --- 416 + 165 --- 525 166 --- 280 166 x--> 325 - 166 --- 386 - 166 --- 495 + 166 --- 353 + 166 --- 462 167 --- 281 167 x--> 325 - 167 --- 337 - 167 --- 446 + 167 --- 398 + 167 --- 507 168 --- 282 168 x--> 325 - 168 --- 339 - 168 --- 448 + 168 --- 432 + 168 --- 541 169 --- 283 169 x--> 325 - 169 --- 346 - 169 --- 455 + 169 --- 426 + 169 --- 535 170 --- 284 170 x--> 325 - 170 --- 395 - 170 --- 504 + 170 --- 386 + 170 --- 495 171 --- 285 171 x--> 325 - 171 --- 394 - 171 --- 503 + 171 --- 381 + 171 --- 490 172 --- 286 172 x--> 325 - 172 --- 417 - 172 --- 526 + 172 --- 340 + 172 --- 449 173 --- 287 173 x--> 325 - 173 --- 335 - 173 --- 444 + 173 --- 393 + 173 --- 502 174 --- 288 174 x--> 325 - 174 --- 331 - 174 --- 440 + 174 --- 417 + 174 --- 526 175 --- 289 175 x--> 325 - 175 --- 343 - 175 --- 452 + 175 --- 412 + 175 --- 521 176 --- 290 176 x--> 325 - 176 --- 359 - 176 --- 468 + 176 --- 423 + 176 --- 532 177 --- 291 177 x--> 325 - 177 --- 397 - 177 --- 506 + 177 --- 407 + 177 --- 516 178 --- 292 178 x--> 325 - 178 --- 390 - 178 --- 499 + 178 --- 369 + 178 --- 478 179 --- 293 179 x--> 325 - 179 --- 408 - 179 --- 517 + 179 --- 421 + 179 --- 530 180 --- 294 180 x--> 325 - 180 --- 360 - 180 --- 469 + 180 --- 387 + 180 --- 496 181 --- 295 181 x--> 325 - 181 --- 433 - 181 --- 542 + 181 --- 389 + 181 --- 498 182 --- 296 182 x--> 325 - 182 --- 332 - 182 --- 441 + 182 --- 372 + 182 --- 481 183 --- 297 183 x--> 325 - 183 --- 378 - 183 --- 487 + 183 --- 329 + 183 --- 438 184 --- 298 184 x--> 325 - 184 --- 389 - 184 --- 498 + 184 --- 326 + 184 --- 435 185 --- 299 185 x--> 325 - 185 --- 383 - 185 --- 492 + 185 --- 332 + 185 --- 441 186 --- 300 186 x--> 325 - 186 --- 340 - 186 --- 449 + 186 --- 434 + 186 --- 543 187 --- 301 187 x--> 325 - 187 --- 336 - 187 --- 445 + 187 --- 413 + 187 --- 522 188 --- 302 188 x--> 325 - 188 --- 381 - 188 --- 490 + 188 --- 395 + 188 --- 504 189 --- 303 189 x--> 325 - 189 --- 429 - 189 --- 538 + 189 --- 431 + 189 --- 540 190 --- 304 190 x--> 325 - 190 --- 434 - 190 --- 543 + 190 --- 344 + 190 --- 453 191 --- 305 191 x--> 325 - 191 --- 370 - 191 --- 479 + 191 --- 414 + 191 --- 523 192 --- 306 192 x--> 325 - 192 --- 402 - 192 --- 511 + 192 --- 424 + 192 --- 533 193 --- 307 193 x--> 325 - 193 --- 406 - 193 --- 515 + 193 --- 328 + 193 --- 437 194 --- 308 194 x--> 325 - 194 --- 431 - 194 --- 540 + 194 --- 349 + 194 --- 458 195 --- 309 195 x--> 325 - 195 --- 344 - 195 --- 453 + 195 --- 428 + 195 --- 537 196 --- 310 196 x--> 325 - 196 --- 425 - 196 --- 534 + 196 --- 382 + 196 --- 491 197 --- 311 197 x--> 325 - 197 --- 427 - 197 --- 536 + 197 --- 385 + 197 --- 494 198 --- 312 198 x--> 325 - 198 --- 373 - 198 --- 482 + 198 --- 331 + 198 --- 440 199 --- 313 199 x--> 325 - 199 --- 380 - 199 --- 489 + 199 --- 355 + 199 --- 464 200 --- 314 200 x--> 325 - 200 --- 392 - 200 --- 501 + 200 --- 376 + 200 --- 485 201 --- 315 201 x--> 325 - 201 --- 349 - 201 --- 458 + 201 --- 401 + 201 --- 510 202 --- 316 202 x--> 325 - 202 --- 338 - 202 --- 447 + 202 --- 368 + 202 --- 477 203 --- 317 203 x--> 325 - 203 --- 330 - 203 --- 439 + 203 --- 362 + 203 --- 471 204 --- 318 204 x--> 325 - 204 --- 353 - 204 --- 462 + 204 --- 364 + 204 --- 473 205 --- 319 205 x--> 325 - 205 --- 384 - 205 --- 493 + 205 --- 365 + 205 --- 474 206 --- 320 206 x--> 325 - 206 --- 412 - 206 --- 521 + 206 --- 341 + 206 --- 450 207 --- 321 207 x--> 325 - 207 --- 421 - 207 --- 530 + 207 --- 400 + 207 --- 509 208 --- 322 208 x--> 325 - 208 --- 401 - 208 --- 510 + 208 --- 343 + 208 --- 452 209 --- 323 209 x--> 325 - 209 --- 355 - 209 --- 464 + 209 --- 346 + 209 --- 455 214 --- 215 214 --- 216 214 --- 217 @@ -1848,333 +1848,333 @@ flowchart LR 214 --- 541 214 --- 542 214 --- 543 - 215 --- 356 - 464 <--x 215 - 215 --- 465 - 216 --- 327 - 435 <--x 216 - 216 --- 436 - 217 --- 418 - 526 <--x 217 - 217 --- 527 - 218 --- 364 - 472 <--x 218 - 218 --- 473 - 219 --- 396 - 504 <--x 219 - 219 --- 505 - 220 --- 374 - 482 <--x 220 - 220 --- 483 - 221 --- 405 - 513 <--x 221 - 221 --- 514 - 222 --- 369 - 477 <--x 222 - 222 --- 478 - 223 --- 409 - 517 <--x 223 - 223 --- 518 - 224 --- 422 - 530 <--x 224 - 224 --- 531 - 225 --- 347 - 455 <--x 225 - 225 --- 456 - 226 --- 400 - 508 <--x 226 - 226 --- 509 - 227 --- 382 - 490 <--x 227 - 227 --- 491 - 228 --- 388 - 496 <--x 228 - 228 --- 497 - 229 --- 428 - 536 <--x 229 - 229 --- 537 - 230 --- 333 - 441 <--x 230 - 230 --- 442 - 231 --- 387 - 495 <--x 231 - 231 --- 496 - 232 --- 410 - 518 <--x 232 - 232 --- 519 - 233 --- 407 - 515 <--x 233 - 233 --- 516 - 234 --- 419 - 527 <--x 234 - 234 --- 528 - 235 --- 358 - 466 <--x 235 - 235 --- 467 - 236 --- 413 - 521 <--x 236 - 236 --- 522 - 237 --- 420 - 528 <--x 237 - 237 --- 529 - 238 --- 367 - 475 <--x 238 - 238 --- 476 - 239 --- 348 - 456 <--x 239 - 239 --- 457 - 240 --- 430 - 538 <--x 240 - 240 --- 539 - 241 --- 363 - 471 <--x 241 - 241 --- 472 - 242 --- 354 - 462 <--x 242 - 242 --- 463 - 243 --- 341 - 449 <--x 243 - 243 --- 450 - 244 --- 404 - 512 <--x 244 - 244 --- 513 - 245 --- 361 - 469 <--x 245 - 245 --- 470 - 246 --- 371 - 479 <--x 246 - 246 --- 480 - 247 --- 365 - 473 <--x 247 - 247 --- 474 - 248 --- 372 - 480 <--x 248 - 248 --- 481 - 249 --- 351 - 459 <--x 249 - 249 --- 460 - 250 --- 411 - 519 <--x 250 - 250 --- 520 - 251 --- 375 - 483 <--x 251 - 251 --- 484 - 252 --- 350 - 458 <--x 252 - 252 --- 459 - 253 --- 398 - 506 <--x 253 - 253 --- 507 - 254 --- 342 - 450 <--x 254 - 254 --- 451 - 255 --- 328 - 436 <--x 255 - 255 --- 437 - 256 --- 416 - 524 <--x 256 - 256 --- 525 - 257 --- 399 - 507 <--x 257 - 257 --- 508 - 258 --- 334 - 442 <--x 258 - 258 --- 443 - 259 --- 432 - 540 <--x 259 - 259 --- 541 - 260 --- 357 - 465 <--x 260 - 260 --- 466 - 261 --- 403 - 511 <--x 261 - 261 --- 512 - 262 --- 366 - 474 <--x 262 - 262 --- 475 - 263 --- 362 - 470 <--x 263 - 263 --- 471 - 264 --- 414 - 522 <--x 264 - 264 --- 523 - 265 --- 423 - 531 <--x 265 - 265 --- 532 - 266 --- 379 - 487 <--x 266 - 266 --- 488 - 267 --- 415 - 523 <--x 267 - 267 --- 524 - 268 --- 326 - 268 --- 435 - 543 <--x 268 - 269 --- 385 - 493 <--x 269 - 269 --- 494 - 270 --- 426 - 534 <--x 270 - 270 --- 535 - 271 --- 376 - 484 <--x 271 - 271 --- 485 - 272 --- 368 - 476 <--x 272 - 272 --- 477 - 273 --- 377 - 485 <--x 273 - 273 --- 486 - 274 --- 424 - 532 <--x 274 - 274 --- 533 - 275 --- 345 - 453 <--x 275 - 275 --- 454 - 276 --- 329 - 437 <--x 276 - 276 --- 438 - 277 --- 352 - 460 <--x 277 - 277 --- 461 - 278 --- 391 - 499 <--x 278 - 278 --- 500 - 279 --- 393 - 501 <--x 279 - 279 --- 502 - 280 --- 386 - 494 <--x 280 - 280 --- 495 - 281 --- 337 - 445 <--x 281 - 281 --- 446 - 282 --- 339 - 447 <--x 282 - 282 --- 448 - 283 --- 346 - 454 <--x 283 - 283 --- 455 - 284 --- 395 - 503 <--x 284 - 284 --- 504 - 285 --- 394 - 502 <--x 285 - 285 --- 503 - 286 --- 417 - 525 <--x 286 - 286 --- 526 - 287 --- 335 - 443 <--x 287 - 287 --- 444 - 288 --- 331 - 439 <--x 288 - 288 --- 440 - 289 --- 343 - 451 <--x 289 - 289 --- 452 - 290 --- 359 - 467 <--x 290 - 290 --- 468 - 291 --- 397 - 505 <--x 291 - 291 --- 506 - 292 --- 390 - 498 <--x 292 - 292 --- 499 - 293 --- 408 - 516 <--x 293 - 293 --- 517 - 294 --- 360 - 468 <--x 294 - 294 --- 469 - 295 --- 433 - 541 <--x 295 - 295 --- 542 - 296 --- 332 - 440 <--x 296 - 296 --- 441 - 297 --- 378 - 486 <--x 297 - 297 --- 487 - 298 --- 389 - 497 <--x 298 - 298 --- 498 - 299 --- 383 - 491 <--x 299 - 299 --- 492 - 300 --- 340 - 448 <--x 300 - 300 --- 449 - 301 --- 336 - 444 <--x 301 - 301 --- 445 - 302 --- 381 - 489 <--x 302 - 302 --- 490 - 303 --- 429 - 537 <--x 303 - 303 --- 538 - 304 --- 434 - 542 <--x 304 - 304 --- 543 - 305 --- 370 - 478 <--x 305 - 305 --- 479 - 306 --- 402 - 510 <--x 306 - 306 --- 511 - 307 --- 406 - 514 <--x 307 - 307 --- 515 - 308 --- 431 - 539 <--x 308 - 308 --- 540 - 309 --- 344 - 452 <--x 309 - 309 --- 453 - 310 --- 425 - 533 <--x 310 - 310 --- 534 - 311 --- 427 - 535 <--x 311 - 311 --- 536 - 312 --- 373 - 481 <--x 312 - 312 --- 482 - 313 --- 380 - 488 <--x 313 - 313 --- 489 - 314 --- 392 - 500 <--x 314 - 314 --- 501 - 315 --- 349 - 457 <--x 315 - 315 --- 458 - 316 --- 338 - 446 <--x 316 - 316 --- 447 - 317 --- 330 - 438 <--x 317 - 317 --- 439 - 318 --- 353 - 461 <--x 318 - 318 --- 462 - 319 --- 384 - 492 <--x 319 - 319 --- 493 - 320 --- 412 - 520 <--x 320 - 320 --- 521 - 321 --- 421 - 529 <--x 321 - 321 --- 530 - 322 --- 401 - 509 <--x 322 - 322 --- 510 - 323 --- 355 - 463 <--x 323 - 323 --- 464 + 215 --- 361 + 469 <--x 215 + 215 --- 470 + 216 --- 337 + 445 <--x 216 + 216 --- 446 + 217 --- 383 + 491 <--x 217 + 217 --- 492 + 218 --- 350 + 458 <--x 218 + 218 --- 459 + 219 --- 408 + 516 <--x 219 + 219 --- 517 + 220 --- 422 + 530 <--x 220 + 220 --- 531 + 221 --- 352 + 460 <--x 221 + 221 --- 461 + 222 --- 377 + 485 <--x 222 + 222 --- 486 + 223 --- 396 + 504 <--x 223 + 223 --- 505 + 224 --- 373 + 481 <--x 224 + 224 --- 482 + 225 --- 366 + 474 <--x 225 + 225 --- 475 + 226 --- 433 + 541 <--x 226 + 226 --- 542 + 227 --- 347 + 455 <--x 227 + 227 --- 456 + 228 --- 429 + 537 <--x 228 + 228 --- 538 + 229 --- 345 + 453 <--x 229 + 229 --- 454 + 230 --- 379 + 487 <--x 230 + 230 --- 488 + 231 --- 348 + 456 <--x 231 + 231 --- 457 + 232 --- 360 + 468 <--x 232 + 232 --- 469 + 233 --- 359 + 467 <--x 233 + 233 --- 468 + 234 --- 390 + 498 <--x 234 + 234 --- 499 + 235 --- 330 + 438 <--x 235 + 235 --- 439 + 236 --- 391 + 499 <--x 236 + 236 --- 500 + 237 --- 375 + 483 <--x 237 + 237 --- 484 + 238 --- 418 + 526 <--x 238 + 238 --- 527 + 239 --- 380 + 488 <--x 239 + 239 --- 489 + 240 --- 411 + 519 <--x 240 + 240 --- 520 + 241 --- 403 + 511 <--x 241 + 241 --- 512 + 242 --- 339 + 447 <--x 242 + 242 --- 448 + 243 --- 409 + 517 <--x 243 + 243 --- 518 + 244 --- 338 + 446 <--x 244 + 244 --- 447 + 245 --- 374 + 482 <--x 245 + 245 --- 483 + 246 --- 358 + 466 <--x 246 + 246 --- 467 + 247 --- 397 + 505 <--x 247 + 247 --- 506 + 248 --- 425 + 533 <--x 248 + 248 --- 534 + 249 --- 356 + 464 <--x 249 + 249 --- 465 + 250 --- 388 + 496 <--x 250 + 250 --- 497 + 251 --- 399 + 507 <--x 251 + 251 --- 508 + 252 --- 367 + 475 <--x 252 + 252 --- 476 + 253 --- 420 + 528 <--x 253 + 253 --- 529 + 254 --- 392 + 500 <--x 254 + 254 --- 501 + 255 --- 394 + 502 <--x 255 + 255 --- 503 + 256 --- 415 + 523 <--x 256 + 256 --- 524 + 257 --- 410 + 518 <--x 257 + 257 --- 519 + 258 --- 333 + 441 <--x 258 + 258 --- 442 + 259 --- 419 + 527 <--x 259 + 259 --- 528 + 260 --- 351 + 459 <--x 260 + 260 --- 460 + 261 --- 404 + 512 <--x 261 + 261 --- 513 + 262 --- 378 + 486 <--x 262 + 262 --- 487 + 263 --- 363 + 471 <--x 263 + 263 --- 472 + 264 --- 405 + 513 <--x 264 + 264 --- 514 + 265 --- 342 + 450 <--x 265 + 265 --- 451 + 266 --- 370 + 478 <--x 266 + 266 --- 479 + 267 --- 371 + 479 <--x 267 + 267 --- 480 + 268 --- 327 + 435 <--x 268 + 268 --- 436 + 269 --- 402 + 510 <--x 269 + 269 --- 511 + 270 --- 357 + 465 <--x 270 + 270 --- 466 + 271 --- 384 + 492 <--x 271 + 271 --- 493 + 272 --- 430 + 538 <--x 272 + 272 --- 539 + 273 --- 335 + 443 <--x 273 + 273 --- 444 + 274 --- 334 + 442 <--x 274 + 274 --- 443 + 275 --- 354 + 462 <--x 275 + 275 --- 463 + 276 --- 406 + 514 <--x 276 + 276 --- 515 + 277 --- 427 + 535 <--x 277 + 277 --- 536 + 278 --- 336 + 444 <--x 278 + 278 --- 445 + 279 --- 416 + 524 <--x 279 + 279 --- 525 + 280 --- 353 + 461 <--x 280 + 280 --- 462 + 281 --- 398 + 506 <--x 281 + 281 --- 507 + 282 --- 432 + 540 <--x 282 + 282 --- 541 + 283 --- 426 + 534 <--x 283 + 283 --- 535 + 284 --- 386 + 494 <--x 284 + 284 --- 495 + 285 --- 381 + 489 <--x 285 + 285 --- 490 + 286 --- 340 + 448 <--x 286 + 286 --- 449 + 287 --- 393 + 501 <--x 287 + 287 --- 502 + 288 --- 417 + 525 <--x 288 + 288 --- 526 + 289 --- 412 + 520 <--x 289 + 289 --- 521 + 290 --- 423 + 531 <--x 290 + 290 --- 532 + 291 --- 407 + 515 <--x 291 + 291 --- 516 + 292 --- 369 + 477 <--x 292 + 292 --- 478 + 293 --- 421 + 529 <--x 293 + 293 --- 530 + 294 --- 387 + 495 <--x 294 + 294 --- 496 + 295 --- 389 + 497 <--x 295 + 295 --- 498 + 296 --- 372 + 480 <--x 296 + 296 --- 481 + 297 --- 329 + 437 <--x 297 + 297 --- 438 + 298 --- 326 + 298 --- 435 + 543 <--x 298 + 299 --- 332 + 440 <--x 299 + 299 --- 441 + 300 --- 434 + 542 <--x 300 + 300 --- 543 + 301 --- 413 + 521 <--x 301 + 301 --- 522 + 302 --- 395 + 503 <--x 302 + 302 --- 504 + 303 --- 431 + 539 <--x 303 + 303 --- 540 + 304 --- 344 + 452 <--x 304 + 304 --- 453 + 305 --- 414 + 522 <--x 305 + 305 --- 523 + 306 --- 424 + 532 <--x 306 + 306 --- 533 + 307 --- 328 + 436 <--x 307 + 307 --- 437 + 308 --- 349 + 457 <--x 308 + 308 --- 458 + 309 --- 428 + 536 <--x 309 + 309 --- 537 + 310 --- 382 + 490 <--x 310 + 310 --- 491 + 311 --- 385 + 493 <--x 311 + 311 --- 494 + 312 --- 331 + 439 <--x 312 + 312 --- 440 + 313 --- 355 + 463 <--x 313 + 313 --- 464 + 314 --- 376 + 484 <--x 314 + 314 --- 485 + 315 --- 401 + 509 <--x 315 + 315 --- 510 + 316 --- 368 + 476 <--x 316 + 316 --- 477 + 317 --- 362 + 470 <--x 317 + 317 --- 471 + 318 --- 364 + 472 <--x 318 + 318 --- 473 + 319 --- 365 + 473 <--x 319 + 319 --- 474 + 320 --- 341 + 449 <--x 320 + 320 --- 450 + 321 --- 400 + 508 <--x 321 + 321 --- 509 + 322 --- 343 + 451 <--x 322 + 322 --- 452 + 323 --- 346 + 454 <--x 323 + 323 --- 455 326 <--x 324 327 <--x 324 328 <--x 324 diff --git a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap index b83cd4b6f..611a5d921 100644 --- a/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/t-slot-rail/ops.snap @@ -41,6 +41,44 @@ description: Operations executed t-slot-rail.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "scale", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 1.5, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "extrude", diff --git a/rust/kcl-lib/tests/kcl_samples/telemetry-antenna/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/telemetry-antenna/artifact_graph_flowchart.snap.md index 5622f9c2a..da00655c6 100644 --- a/rust/kcl-lib/tests/kcl_samples/telemetry-antenna/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/telemetry-antenna/artifact_graph_flowchart.snap.md @@ -189,8 +189,7 @@ flowchart LR 103["SweepEdge Adjacent"] 104["SweepEdge Adjacent"] 105["SweepEdge Adjacent"] - 106["EdgeCut Chamfer
[1930, 1969, 0]"] - %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ExpressionStatementExpr, PipeBodyItem { index: 3 }] + 106["SweepEdge Adjacent"] 107["EdgeCut Chamfer
[1930, 1969, 0]"] %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ExpressionStatementExpr, PipeBodyItem { index: 3 }] 108["EdgeCut Chamfer
[1930, 1969, 0]"] @@ -201,6 +200,8 @@ flowchart LR %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ExpressionStatementExpr, PipeBodyItem { index: 3 }] 111["EdgeCut Chamfer
[1930, 1969, 0]"] %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ExpressionStatementExpr, PipeBodyItem { index: 3 }] + 112["EdgeCut Chamfer
[1930, 1969, 0]"] + %% [ProgramBodyItem { index: 12 }, VariableDeclarationDeclaration, VariableDeclarationInit, FunctionExpressionBody, FunctionExpressionBodyItem { index: 0 }, ExpressionStatementExpr, PipeBodyItem { index: 3 }] 1 --- 8 74 x--> 2 74 x--> 3 @@ -255,87 +256,87 @@ flowchart LR 74 --- 14 47 <--x 15 15 --- 69 - 15 x--> 87 + 15 --- 87 47 <--x 16 16 --- 74 - 16 --- 87 + 16 --- 88 47 <--x 17 17 --- 64 - 17 --- 88 + 17 --- 89 47 <--x 18 18 --- 65 - 18 --- 89 + 18 --- 90 47 <--x 19 19 --- 62 47 <--x 21 21 --- 68 - 21 --- 90 + 21 --- 91 47 <--x 22 22 --- 72 - 22 --- 91 + 22 --- 92 47 <--x 23 23 --- 71 - 23 --- 92 + 23 --- 93 47 <--x 24 24 --- 60 - 24 --- 93 + 24 --- 94 47 <--x 25 25 --- 61 - 25 --- 94 + 25 --- 95 47 <--x 26 26 --- 73 - 26 --- 95 + 26 --- 96 47 <--x 27 27 --- 66 - 27 --- 96 + 27 --- 97 47 <--x 28 28 --- 63 - 28 --- 97 + 28 --- 98 47 <--x 29 29 --- 58 - 29 --- 98 + 29 --- 99 47 <--x 30 30 --- 67 - 30 --- 99 + 30 --- 100 47 <--x 31 31 --- 59 - 31 --- 100 + 31 --- 101 47 <--x 32 32 --- 70 - 32 --- 101 + 32 --- 102 47 <--x 33 33 --- 57 - 33 --- 102 + 33 --- 103 34 --- 56 34 x--> 74 34 --- 80 34 --- 86 - 34 --- 106 + 34 --- 107 35 x--> 74 35 --- 76 35 --- 82 - 35 --- 104 - 35 --- 111 + 35 --- 105 + 35 --- 112 36 --- 54 36 x--> 74 36 --- 78 36 --- 84 - 36 --- 107 + 36 --- 108 37 x--> 74 37 --- 77 37 --- 83 - 37 --- 105 - 37 --- 108 + 37 --- 106 + 37 --- 109 38 x--> 74 38 --- 75 38 --- 81 - 38 --- 103 - 38 --- 110 + 38 --- 104 + 38 --- 111 39 --- 55 39 x--> 74 39 --- 79 39 --- 85 - 39 --- 109 + 39 --- 110 47 --- 57 47 --- 58 47 --- 59 @@ -370,6 +371,7 @@ flowchart LR 47 --- 100 47 --- 101 47 --- 102 + 47 --- 103 48 --- 54 48 --- 78 48 --- 84 @@ -381,13 +383,13 @@ flowchart LR 50 --- 86 51 --- 75 51 --- 81 - 51 --- 103 + 51 --- 104 52 --- 76 52 --- 82 - 52 --- 104 + 52 --- 105 53 --- 77 53 --- 83 - 53 --- 105 + 53 --- 106 54 --- 78 54 --- 84 55 --- 79 @@ -400,53 +402,55 @@ flowchart LR 81 <--x 57 82 <--x 57 83 <--x 57 - 100 <--x 57 101 <--x 57 - 57 x--> 102 - 96 <--x 58 + 102 <--x 57 + 57 x--> 103 97 <--x 58 - 58 x--> 98 - 98 <--x 59 + 98 <--x 58 + 58 x--> 99 99 <--x 59 - 59 x--> 100 - 91 <--x 60 + 100 <--x 59 + 59 x--> 101 92 <--x 60 - 60 x--> 93 - 92 <--x 61 + 93 <--x 60 + 60 x--> 94 93 <--x 61 - 61 x--> 94 - 89 <--x 62 - 95 <--x 63 + 94 <--x 61 + 61 x--> 95 + 90 <--x 62 96 <--x 63 - 63 x--> 97 - 64 --- 88 - 88 <--x 65 - 65 --- 89 - 94 <--x 66 + 97 <--x 63 + 63 x--> 98 + 88 <--x 64 + 64 --- 89 + 89 <--x 65 + 65 --- 90 95 <--x 66 - 66 x--> 96 - 97 <--x 67 + 96 <--x 66 + 66 x--> 97 98 <--x 67 - 67 x--> 99 - 68 x--> 90 + 99 <--x 67 + 67 x--> 100 + 68 x--> 91 69 --- 87 - 101 <--x 69 - 99 <--x 70 + 102 <--x 69 100 <--x 70 - 70 x--> 101 - 90 <--x 71 + 101 <--x 70 + 70 x--> 102 91 <--x 71 - 71 x--> 92 - 90 <--x 72 - 72 x--> 91 - 93 <--x 73 + 92 <--x 71 + 71 x--> 93 + 91 <--x 72 + 72 x--> 92 94 <--x 73 - 73 x--> 95 - 74 --- 87 + 95 <--x 73 + 73 x--> 96 + 87 <--x 74 + 74 --- 88 75 --- 81 - 75 --- 103 + 75 --- 104 76 --- 82 - 76 --- 104 + 76 --- 105 77 --- 83 - 77 --- 105 + 77 --- 106 ``` diff --git a/rust/kcl-lib/tests/kcl_samples/utility-sink/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kcl_samples/utility-sink/artifact_graph_flowchart.snap.md index b8941e232..d24a5db2e 100644 --- a/rust/kcl-lib/tests/kcl_samples/utility-sink/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kcl_samples/utility-sink/artifact_graph_flowchart.snap.md @@ -889,7 +889,7 @@ flowchart LR 99 --- 265 99 --- 314 106 --- 181 - 106 x--> 212 + 106 x--> 213 106 --- 260 106 --- 309 126 --- 194 @@ -1227,7 +1227,7 @@ flowchart LR 251 <--x 209 252 <--x 209 253 <--x 209 - 260 <--x 213 + 260 <--x 212 261 <--x 214 262 <--x 214 263 <--x 214 diff --git a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap index a2fc86c90..15a2b1867 100644 --- a/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap +++ b/rust/kcl-lib/tests/kcl_samples/walkie-talkie/ops.snap @@ -67,13 +67,258 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] }, { - "type": "GroupBegin", - "group": { - "type": "FunctionCall", - "name": "button", - "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -0.65, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -0.2, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 1.25, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.55, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -0.5, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 2.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } }, "sourceRange": [] }, @@ -89,13 +334,66 @@ description: Operations executed walkie-talkie.kcl "sourceRange": [] }, { - "type": "GroupBegin", - "group": { - "type": "FunctionCall", - "name": "button", - "functionSourceRange": [], - "unlabeledArg": null, - "labeledArgs": {} + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -0.895, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 1.25, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } }, "sourceRange": [] }, @@ -110,6 +408,362 @@ description: Operations executed walkie-talkie.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -0.895, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.73, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": "button", + "functionSourceRange": [], + "unlabeledArg": null, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 0.895, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.77, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "GroupBegin", + "group": { + "type": "FunctionCall", + "name": "button", + "functionSourceRange": [], + "unlabeledArg": null, + "labeledArgs": {} + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 180.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "global": { + "value": { + "type": "Bool", + "value": true + }, + "sourceRange": [] + }, + "x": { + "value": { + "type": "Number", + "value": 0.895, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": -1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.25, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", diff --git a/rust/kcl-lib/tests/kittycad_svg/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/kittycad_svg/artifact_graph_flowchart.snap.md index 76cc3d017..549da906d 100644 --- a/rust/kcl-lib/tests/kittycad_svg/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/kittycad_svg/artifact_graph_flowchart.snap.md @@ -2448,667 +2448,667 @@ flowchart LR 118 --- 502 118 x--> 568 118 --- 735 - 118 --- 1015 + 118 x--> 1016 120 --- 349 120 x--> 568 120 --- 734 - 120 --- 1014 + 120 --- 1015 121 --- 450 121 x--> 568 121 --- 733 - 121 --- 1013 + 121 --- 1014 122 --- 466 122 x--> 568 122 --- 732 - 122 --- 1012 + 122 --- 1013 123 --- 343 123 x--> 568 123 --- 731 - 123 --- 1011 + 123 --- 1012 124 --- 309 124 x--> 568 124 --- 730 - 124 --- 1010 + 124 --- 1011 125 --- 400 125 x--> 568 125 --- 729 - 125 --- 1009 + 125 --- 1010 126 --- 328 126 x--> 568 126 --- 728 - 126 --- 1008 + 126 --- 1009 127 --- 342 127 x--> 568 127 --- 727 - 127 --- 1007 + 127 --- 1008 128 --- 495 128 x--> 568 128 --- 726 - 128 --- 1006 + 128 --- 1007 129 --- 392 129 x--> 568 129 --- 725 - 129 --- 1005 + 129 --- 1006 130 --- 355 130 x--> 568 130 --- 724 - 130 --- 1004 + 130 --- 1005 131 --- 471 131 x--> 568 131 --- 723 - 131 --- 1003 + 131 --- 1004 132 --- 319 132 x--> 568 132 --- 722 - 132 --- 1002 + 132 --- 1003 133 --- 492 133 x--> 568 133 --- 721 - 133 --- 1001 + 133 --- 1002 134 --- 444 134 x--> 568 134 --- 720 - 134 --- 1000 + 134 --- 1001 135 --- 359 135 x--> 568 135 --- 719 - 135 --- 999 + 135 --- 1000 136 --- 447 136 x--> 568 136 --- 718 - 136 --- 998 + 136 --- 999 137 --- 458 137 x--> 568 137 --- 717 - 137 --- 997 + 137 --- 998 138 --- 307 138 x--> 568 138 --- 716 - 138 --- 996 + 138 --- 997 139 --- 556 139 x--> 568 139 --- 715 - 139 --- 995 + 139 --- 996 140 --- 287 140 x--> 568 140 --- 714 - 140 --- 994 + 140 --- 995 141 --- 477 141 x--> 568 141 --- 713 - 141 --- 993 + 141 --- 994 142 --- 558 142 x--> 568 142 --- 712 - 142 --- 992 + 142 --- 993 143 --- 493 143 x--> 568 143 --- 711 - 143 --- 991 + 143 --- 992 144 --- 378 144 x--> 568 144 --- 710 - 144 --- 990 + 144 --- 991 145 --- 505 145 x--> 568 145 --- 709 - 145 --- 989 + 145 --- 990 146 --- 468 146 x--> 568 146 --- 708 - 146 --- 988 + 146 --- 989 147 --- 353 147 x--> 568 147 --- 707 - 147 --- 987 + 147 --- 988 148 --- 459 148 x--> 568 148 --- 706 - 148 --- 986 + 148 --- 987 149 --- 372 149 x--> 568 149 --- 705 - 149 --- 985 + 149 --- 986 150 --- 363 150 x--> 568 150 --- 704 - 150 --- 984 + 150 --- 985 151 --- 526 151 x--> 568 151 --- 703 - 151 --- 983 + 151 --- 984 152 --- 553 152 x--> 568 152 --- 702 - 152 --- 982 + 152 --- 983 153 --- 517 153 x--> 568 153 --- 701 - 153 --- 981 + 153 --- 982 154 --- 390 154 x--> 568 154 --- 700 - 154 --- 980 + 154 --- 981 155 --- 501 155 x--> 568 155 --- 699 - 155 --- 979 + 155 --- 980 156 --- 521 156 x--> 568 156 --- 698 - 156 --- 978 + 156 --- 979 157 --- 323 157 x--> 568 157 --- 697 - 157 --- 977 + 157 --- 978 158 --- 489 158 x--> 568 158 --- 696 - 158 --- 976 + 158 --- 977 159 --- 293 159 x--> 568 159 --- 695 - 159 --- 975 + 159 --- 976 160 --- 414 160 x--> 568 160 --- 694 - 160 --- 974 + 160 --- 975 161 --- 375 161 x--> 568 161 --- 693 - 161 --- 973 + 161 --- 974 162 --- 315 162 x--> 568 162 --- 692 - 162 --- 972 + 162 --- 973 163 --- 448 163 x--> 568 163 --- 691 - 163 --- 971 + 163 --- 972 164 --- 516 164 x--> 568 164 --- 690 - 164 --- 970 + 164 --- 971 165 --- 289 165 x--> 568 165 --- 689 - 165 --- 969 + 165 --- 970 166 --- 397 166 x--> 568 166 --- 688 - 166 --- 968 + 166 --- 969 167 --- 480 167 x--> 568 167 --- 687 - 167 --- 967 + 167 --- 968 168 --- 331 168 x--> 568 168 --- 686 - 168 --- 966 + 168 --- 967 169 --- 529 169 x--> 568 169 --- 685 - 169 --- 965 + 169 --- 966 170 --- 428 170 x--> 568 170 --- 684 - 170 --- 964 + 170 --- 965 171 --- 322 171 x--> 568 171 --- 683 - 171 --- 963 + 171 --- 964 172 --- 504 172 x--> 568 172 --- 682 - 172 --- 962 + 172 --- 963 173 --- 437 173 x--> 568 173 --- 681 - 173 --- 961 + 173 --- 962 174 --- 327 174 x--> 568 174 --- 680 - 174 --- 960 + 174 --- 961 175 --- 487 175 x--> 568 175 --- 679 - 175 --- 959 + 175 --- 960 176 --- 406 176 x--> 568 176 --- 678 - 176 --- 958 + 176 --- 959 177 --- 524 177 x--> 568 177 --- 677 - 177 --- 957 + 177 --- 958 178 --- 423 178 x--> 568 178 --- 676 - 178 --- 956 + 178 --- 957 179 --- 301 179 x--> 568 179 --- 675 - 179 --- 955 + 179 --- 956 180 --- 333 180 x--> 568 180 --- 674 - 180 --- 954 + 180 --- 955 181 --- 302 181 x--> 568 181 --- 673 - 181 --- 953 + 181 --- 954 182 --- 550 182 x--> 568 182 --- 672 - 182 --- 952 + 182 --- 953 183 --- 519 183 x--> 568 183 --- 671 - 183 --- 951 + 183 --- 952 184 --- 559 184 x--> 568 184 --- 670 - 184 --- 950 + 184 --- 951 185 --- 341 185 x--> 568 185 --- 669 - 185 --- 949 + 185 --- 950 186 --- 542 186 x--> 568 186 --- 668 - 186 --- 948 + 186 --- 949 187 --- 478 187 x--> 568 187 --- 667 - 187 --- 947 + 187 --- 948 188 --- 518 188 x--> 568 188 --- 666 - 188 --- 946 + 188 --- 947 189 --- 554 189 x--> 568 189 --- 665 - 189 --- 945 + 189 --- 946 190 --- 490 190 x--> 568 190 --- 664 - 190 --- 944 + 190 --- 945 191 --- 337 191 x--> 568 191 --- 663 - 191 --- 943 + 191 --- 944 192 --- 520 192 x--> 568 192 --- 662 - 192 --- 942 + 192 --- 943 193 --- 362 193 x--> 568 193 --- 661 - 193 --- 941 + 193 --- 942 194 --- 376 194 x--> 568 194 --- 660 - 194 --- 940 + 194 --- 941 195 --- 336 195 x--> 568 195 --- 659 - 195 --- 939 + 195 --- 940 196 --- 539 196 x--> 568 196 --- 658 - 196 --- 938 + 196 --- 939 197 --- 453 197 x--> 568 197 --- 657 - 197 --- 937 + 197 --- 938 198 --- 325 198 x--> 568 198 --- 656 - 198 --- 936 + 198 --- 937 199 --- 384 199 x--> 568 199 --- 655 - 199 --- 935 + 199 --- 936 200 --- 360 200 x--> 568 200 --- 654 - 200 --- 934 + 200 --- 935 201 --- 494 201 x--> 568 201 --- 653 - 201 --- 933 + 201 --- 934 202 --- 422 202 x--> 568 202 --- 652 - 202 --- 932 + 202 --- 933 203 --- 462 203 x--> 568 203 --- 651 - 203 --- 931 + 203 --- 932 204 --- 386 204 x--> 568 204 --- 650 - 204 --- 930 + 204 --- 931 205 --- 324 205 x--> 568 205 --- 649 - 205 --- 929 + 205 --- 930 206 --- 503 206 x--> 568 206 --- 648 - 206 --- 928 + 206 --- 929 207 --- 312 207 x--> 568 207 --- 647 - 207 --- 927 + 207 --- 928 208 --- 552 208 x--> 568 208 --- 646 - 208 --- 926 + 208 --- 927 209 --- 457 209 x--> 568 209 --- 645 - 209 --- 925 + 209 --- 926 210 --- 370 210 x--> 568 210 --- 644 - 210 --- 924 + 210 --- 925 211 --- 544 211 x--> 568 211 --- 643 - 211 --- 923 + 211 --- 924 212 --- 472 212 x--> 568 212 --- 642 - 212 --- 922 + 212 --- 923 213 --- 476 213 x--> 568 213 --- 641 - 213 --- 921 + 213 --- 922 214 --- 410 214 x--> 568 214 --- 640 - 214 --- 920 + 214 --- 921 215 --- 561 215 x--> 568 215 --- 639 - 215 --- 919 + 215 --- 920 216 --- 514 216 x--> 568 216 --- 638 - 216 --- 918 + 216 --- 919 217 --- 449 217 x--> 568 217 --- 637 - 217 --- 917 + 217 --- 918 218 --- 348 218 x--> 568 218 --- 636 - 218 --- 916 + 218 --- 917 219 --- 545 219 x--> 568 219 --- 635 - 219 --- 915 + 219 --- 916 220 --- 455 220 x--> 568 220 --- 634 - 220 --- 914 + 220 --- 915 221 --- 404 221 x--> 568 221 --- 633 - 221 --- 913 + 221 --- 914 222 --- 291 222 x--> 568 222 --- 632 - 222 --- 912 + 222 --- 913 223 --- 344 223 x--> 568 223 --- 631 - 223 --- 911 + 223 --- 912 224 --- 335 224 x--> 568 224 --- 630 - 224 --- 910 + 224 --- 911 225 --- 298 225 x--> 568 225 --- 629 - 225 --- 909 + 225 --- 910 226 --- 413 226 x--> 568 226 --- 628 - 226 --- 908 + 226 --- 909 227 --- 532 227 x--> 568 227 --- 627 - 227 --- 907 + 227 --- 908 228 --- 365 228 x--> 568 228 --- 626 - 228 --- 906 + 228 --- 907 229 --- 431 229 x--> 568 229 --- 625 - 229 --- 905 + 229 --- 906 230 --- 499 230 x--> 568 230 --- 624 - 230 --- 904 + 230 --- 905 231 --- 475 231 x--> 568 231 --- 623 - 231 --- 903 + 231 --- 904 232 --- 460 232 x--> 568 232 --- 622 - 232 --- 902 + 232 --- 903 233 --- 482 233 x--> 568 233 --- 621 - 233 --- 901 + 233 --- 902 234 --- 427 234 x--> 568 234 --- 620 - 234 --- 900 + 234 --- 901 235 --- 452 235 x--> 568 235 --- 619 - 235 --- 899 + 235 --- 900 236 --- 297 236 x--> 568 236 --- 618 - 236 --- 898 + 236 --- 899 237 --- 295 237 x--> 568 237 --- 617 - 237 --- 897 + 237 --- 898 238 --- 313 238 x--> 568 238 --- 616 - 238 --- 896 + 238 --- 897 239 --- 512 239 x--> 568 239 --- 615 - 239 --- 895 + 239 --- 896 240 --- 465 240 x--> 568 240 --- 614 - 240 --- 894 + 240 --- 895 241 --- 440 241 x--> 568 241 --- 613 - 241 --- 893 + 241 --- 894 242 --- 443 242 x--> 568 242 --- 612 - 242 --- 892 + 242 --- 893 243 --- 464 243 x--> 568 243 --- 611 - 243 --- 891 + 243 --- 892 244 --- 467 244 x--> 568 244 --- 610 - 244 --- 890 + 244 --- 891 245 --- 534 245 x--> 568 245 --- 609 - 245 --- 889 + 245 --- 890 246 --- 340 246 x--> 568 246 --- 608 - 246 --- 888 + 246 --- 889 247 --- 351 247 x--> 568 247 --- 607 - 247 --- 887 + 247 --- 888 248 --- 334 248 x--> 568 248 --- 606 - 248 --- 886 + 248 --- 887 249 --- 451 249 x--> 568 249 --- 605 - 249 --- 885 + 249 --- 886 250 --- 537 250 x--> 568 250 --- 604 - 250 --- 884 + 250 --- 885 251 --- 474 251 x--> 568 251 --- 603 - 251 --- 883 + 251 --- 884 252 --- 402 252 x--> 568 252 --- 602 - 252 --- 882 + 252 --- 883 253 --- 486 253 x--> 568 253 --- 601 - 253 --- 881 + 253 --- 882 254 --- 429 254 x--> 568 254 --- 600 - 254 --- 880 + 254 --- 881 255 --- 563 255 x--> 568 255 --- 599 - 255 --- 879 + 255 --- 880 256 --- 395 256 x--> 568 256 --- 598 - 256 --- 878 + 256 --- 879 257 --- 470 257 x--> 568 257 --- 597 - 257 --- 877 + 257 --- 878 258 --- 407 258 x--> 568 258 --- 596 - 258 --- 876 + 258 --- 877 259 --- 403 259 x--> 568 259 --- 595 - 259 --- 875 + 259 --- 876 260 --- 530 260 x--> 568 260 --- 594 - 260 --- 874 + 260 --- 875 261 --- 358 261 x--> 568 261 --- 593 - 261 --- 873 + 261 --- 874 262 --- 567 262 x--> 568 262 --- 592 - 262 --- 872 + 262 --- 873 263 --- 398 263 x--> 568 263 --- 591 - 263 --- 871 + 263 --- 872 264 --- 387 264 x--> 568 264 --- 590 - 264 --- 870 + 264 --- 871 265 --- 565 265 x--> 568 265 --- 589 - 265 --- 869 + 265 --- 870 266 --- 485 266 x--> 568 266 --- 588 - 266 --- 868 + 266 --- 869 267 --- 438 267 x--> 568 267 --- 587 - 267 --- 867 + 267 --- 868 268 --- 290 268 x--> 568 268 --- 586 - 268 --- 866 + 268 --- 867 269 --- 421 269 x--> 568 269 --- 585 - 269 --- 865 + 269 --- 866 270 --- 513 270 x--> 568 270 --- 584 - 270 --- 864 + 270 --- 865 271 --- 356 271 x--> 568 271 --- 583 - 271 --- 863 + 271 --- 864 272 --- 368 272 x--> 568 272 --- 582 - 272 --- 862 + 272 --- 863 273 --- 318 273 x--> 568 273 --- 581 - 273 --- 861 + 273 --- 862 274 --- 434 274 x--> 568 274 --- 580 - 274 --- 860 + 274 --- 861 275 --- 479 275 x--> 568 275 --- 579 - 275 --- 859 + 275 --- 860 276 --- 366 276 x--> 568 276 --- 578 - 276 --- 858 + 276 --- 859 277 --- 441 277 x--> 568 277 --- 577 - 277 --- 857 + 277 --- 858 278 --- 454 278 x--> 568 278 --- 576 - 278 --- 856 + 278 --- 857 279 --- 417 279 x--> 568 279 --- 575 - 279 --- 855 + 279 --- 856 280 --- 294 280 x--> 568 280 --- 574 - 280 --- 854 + 280 --- 855 281 --- 383 281 x--> 568 281 --- 573 - 281 --- 853 + 281 --- 854 282 --- 430 282 x--> 568 282 --- 572 - 282 --- 852 + 282 --- 853 283 --- 350 283 x--> 568 283 --- 571 - 283 --- 851 + 283 --- 852 284 --- 442 284 x--> 568 284 --- 570 - 284 x--> 1130 + 284 --- 851 286 --- 287 286 --- 288 286 --- 289 @@ -3954,846 +3954,846 @@ flowchart LR 286 --- 1129 286 --- 1130 287 --- 714 - 287 --- 994 - 995 <--x 287 + 287 --- 995 + 996 <--x 287 288 --- 783 - 1062 <--x 288 288 --- 1063 + 1064 <--x 288 289 --- 689 - 289 --- 969 - 970 <--x 289 + 289 --- 970 + 971 <--x 289 290 --- 586 - 290 --- 866 - 867 <--x 290 + 290 --- 867 + 868 <--x 290 291 --- 632 - 291 --- 912 - 913 <--x 291 + 291 --- 913 + 914 <--x 291 292 --- 824 - 1103 <--x 292 292 --- 1104 + 1105 <--x 292 293 --- 695 - 293 --- 975 - 976 <--x 293 + 293 --- 976 + 977 <--x 293 294 --- 574 - 294 --- 854 - 855 <--x 294 + 294 --- 855 + 856 <--x 294 295 --- 617 - 295 --- 897 - 898 <--x 295 + 295 --- 898 + 899 <--x 295 296 --- 787 - 1066 <--x 296 296 --- 1067 + 1068 <--x 296 297 --- 618 - 297 --- 898 - 899 <--x 297 + 297 --- 899 + 900 <--x 297 298 --- 629 - 298 --- 909 - 910 <--x 298 + 298 --- 910 + 911 <--x 298 299 --- 777 - 1056 <--x 299 299 --- 1057 + 1058 <--x 299 300 --- 745 - 1024 <--x 300 300 --- 1025 + 1026 <--x 300 301 --- 675 - 301 --- 955 - 956 <--x 301 + 301 --- 956 + 957 <--x 301 302 --- 673 - 302 --- 953 - 954 <--x 302 + 302 --- 954 + 955 <--x 302 303 --- 776 - 1055 <--x 303 303 --- 1056 + 1057 <--x 303 304 --- 752 - 1031 <--x 304 304 --- 1032 + 1033 <--x 304 305 --- 775 - 1054 <--x 305 305 --- 1055 + 1056 <--x 305 306 --- 822 - 1101 <--x 306 306 --- 1102 + 1103 <--x 306 307 --- 716 - 307 --- 996 - 997 <--x 307 + 307 --- 997 + 998 <--x 307 308 --- 741 - 1020 <--x 308 308 --- 1021 + 1022 <--x 308 309 --- 730 - 309 --- 1010 - 1011 <--x 309 + 309 --- 1011 + 1012 <--x 309 310 --- 803 - 1082 <--x 310 310 --- 1083 + 1084 <--x 310 311 --- 758 - 1037 <--x 311 311 --- 1038 + 1039 <--x 311 312 --- 647 - 312 --- 927 - 928 <--x 312 + 312 --- 928 + 929 <--x 312 313 --- 616 - 313 --- 896 - 897 <--x 313 + 313 --- 897 + 898 <--x 313 314 --- 832 - 1111 <--x 314 314 --- 1112 + 1113 <--x 314 315 --- 692 - 315 --- 972 - 973 <--x 315 + 315 --- 973 + 974 <--x 315 316 --- 836 - 1115 <--x 316 316 --- 1116 + 1117 <--x 316 317 --- 760 - 1039 <--x 317 317 --- 1040 + 1041 <--x 317 318 --- 581 - 318 --- 861 - 862 <--x 318 + 318 --- 862 + 863 <--x 318 319 --- 722 - 319 --- 1002 - 1003 <--x 319 + 319 --- 1003 + 1004 <--x 319 320 --- 759 - 1038 <--x 320 320 --- 1039 + 1040 <--x 320 321 --- 749 - 1028 <--x 321 321 --- 1029 + 1030 <--x 321 322 --- 683 - 322 --- 963 - 964 <--x 322 + 322 --- 964 + 965 <--x 322 323 --- 697 - 323 --- 977 - 978 <--x 323 + 323 --- 978 + 979 <--x 323 324 --- 649 - 324 --- 929 - 930 <--x 324 + 324 --- 930 + 931 <--x 324 325 --- 656 - 325 --- 936 - 937 <--x 325 + 325 --- 937 + 938 <--x 325 326 --- 766 - 1045 <--x 326 326 --- 1046 + 1047 <--x 326 327 --- 680 - 327 --- 960 - 961 <--x 327 + 327 --- 961 + 962 <--x 327 328 --- 728 - 328 --- 1008 - 1009 <--x 328 + 328 --- 1009 + 1010 <--x 328 329 --- 769 - 1048 <--x 329 329 --- 1049 + 1050 <--x 329 330 --- 770 - 1049 <--x 330 330 --- 1050 + 1051 <--x 330 331 --- 686 - 331 --- 966 - 967 <--x 331 + 331 --- 967 + 968 <--x 331 332 --- 800 - 1079 <--x 332 332 --- 1080 + 1081 <--x 332 333 --- 674 - 333 --- 954 - 955 <--x 333 + 333 --- 955 + 956 <--x 333 334 --- 606 - 334 --- 886 - 887 <--x 334 + 334 --- 887 + 888 <--x 334 335 --- 630 - 335 --- 910 - 911 <--x 335 + 335 --- 911 + 912 <--x 335 336 --- 659 - 336 --- 939 - 940 <--x 336 + 336 --- 940 + 941 <--x 336 337 --- 663 - 337 --- 943 - 944 <--x 337 + 337 --- 944 + 945 <--x 337 338 --- 817 - 1096 <--x 338 338 --- 1097 + 1098 <--x 338 339 --- 834 - 1113 <--x 339 339 --- 1114 + 1115 <--x 339 340 --- 608 - 340 --- 888 - 889 <--x 340 + 340 --- 889 + 890 <--x 340 341 --- 669 - 341 --- 949 - 950 <--x 341 + 341 --- 950 + 951 <--x 341 342 --- 727 - 342 --- 1007 - 1008 <--x 342 + 342 --- 1008 + 1009 <--x 342 343 --- 731 - 343 --- 1011 - 1012 <--x 343 + 343 --- 1012 + 1013 <--x 343 344 --- 631 - 344 --- 911 - 912 <--x 344 + 344 --- 912 + 913 <--x 344 345 --- 809 - 1088 <--x 345 345 --- 1089 + 1090 <--x 345 346 --- 784 - 1063 <--x 346 346 --- 1064 + 1065 <--x 346 347 --- 841 - 1120 <--x 347 347 --- 1121 + 1122 <--x 347 348 --- 636 - 348 --- 916 - 917 <--x 348 + 348 --- 917 + 918 <--x 348 349 --- 734 - 349 --- 1014 + 349 --- 1015 350 --- 571 - 350 --- 851 - 852 <--x 350 + 350 --- 852 + 853 <--x 350 351 --- 607 - 351 --- 887 - 888 <--x 351 + 351 --- 888 + 889 <--x 351 352 --- 786 - 1065 <--x 352 352 --- 1066 + 1067 <--x 352 353 --- 707 - 353 --- 987 - 988 <--x 353 + 353 --- 988 + 989 <--x 353 354 --- 840 - 1119 <--x 354 354 --- 1120 + 1121 <--x 354 355 --- 724 - 355 --- 1004 - 1005 <--x 355 + 355 --- 1005 + 1006 <--x 355 356 --- 583 - 356 --- 863 - 864 <--x 356 + 356 --- 864 + 865 <--x 356 357 --- 772 - 1051 <--x 357 357 --- 1052 + 1053 <--x 357 358 --- 593 - 358 --- 873 - 874 <--x 358 + 358 --- 874 + 875 <--x 358 359 --- 719 - 359 --- 999 - 1000 <--x 359 + 359 --- 1000 + 1001 <--x 359 360 --- 654 - 360 --- 934 - 935 <--x 360 + 360 --- 935 + 936 <--x 360 361 --- 845 - 1124 <--x 361 361 --- 1125 + 1126 <--x 361 362 --- 661 - 362 --- 941 - 942 <--x 362 + 362 --- 942 + 943 <--x 362 363 --- 704 - 363 --- 984 - 985 <--x 363 + 363 --- 985 + 986 <--x 363 364 --- 773 - 1052 <--x 364 364 --- 1053 + 1054 <--x 364 365 --- 626 - 365 --- 906 - 907 <--x 365 + 365 --- 907 + 908 <--x 365 366 --- 578 - 366 --- 858 - 859 <--x 366 + 366 --- 859 + 860 <--x 366 367 --- 763 - 1042 <--x 367 367 --- 1043 + 1044 <--x 367 368 --- 582 - 368 --- 862 - 863 <--x 368 + 368 --- 863 + 864 <--x 368 369 --- 774 - 1053 <--x 369 369 --- 1054 + 1055 <--x 369 370 --- 644 - 370 --- 924 - 925 <--x 370 + 370 --- 925 + 926 <--x 370 371 --- 756 - 1035 <--x 371 371 --- 1036 + 1037 <--x 371 372 --- 705 - 372 --- 985 - 986 <--x 372 + 372 --- 986 + 987 <--x 372 373 --- 771 - 1050 <--x 373 373 --- 1051 + 1052 <--x 373 374 --- 748 - 1027 <--x 374 374 --- 1028 + 1029 <--x 374 375 --- 693 - 375 --- 973 - 974 <--x 375 + 375 --- 974 + 975 <--x 375 376 --- 660 - 376 --- 940 - 941 <--x 376 + 376 --- 941 + 942 <--x 376 377 --- 794 - 1073 <--x 377 377 --- 1074 + 1075 <--x 377 378 --- 710 - 378 --- 990 - 991 <--x 378 + 378 --- 991 + 992 <--x 378 379 --- 826 - 1105 <--x 379 379 --- 1106 + 1107 <--x 379 380 --- 846 - 1125 <--x 380 380 --- 1126 + 1127 <--x 380 381 --- 751 - 1030 <--x 381 381 --- 1031 + 1032 <--x 381 382 --- 819 - 1098 <--x 382 382 --- 1099 + 1100 <--x 382 383 --- 573 - 383 --- 853 - 854 <--x 383 + 383 --- 854 + 855 <--x 383 384 --- 655 - 384 --- 935 - 936 <--x 384 + 384 --- 936 + 937 <--x 384 385 --- 825 - 1104 <--x 385 385 --- 1105 + 1106 <--x 385 386 --- 650 - 386 --- 930 - 931 <--x 386 + 386 --- 931 + 932 <--x 386 387 --- 590 - 387 --- 870 - 871 <--x 387 + 387 --- 871 + 872 <--x 387 388 --- 802 - 1081 <--x 388 388 --- 1082 + 1083 <--x 388 389 --- 820 - 1099 <--x 389 389 --- 1100 + 1101 <--x 389 390 --- 700 - 390 --- 980 - 981 <--x 390 + 390 --- 981 + 982 <--x 390 391 --- 761 - 1040 <--x 391 391 --- 1041 + 1042 <--x 391 392 --- 725 - 392 --- 1005 - 1006 <--x 392 + 392 --- 1006 + 1007 <--x 392 393 --- 762 - 1041 <--x 393 393 --- 1042 + 1043 <--x 393 394 --- 813 - 1092 <--x 394 394 --- 1093 + 1094 <--x 394 395 --- 598 - 395 --- 878 - 879 <--x 395 + 395 --- 879 + 880 <--x 395 396 --- 768 - 1047 <--x 396 396 --- 1048 + 1049 <--x 396 397 --- 688 - 397 --- 968 - 969 <--x 397 + 397 --- 969 + 970 <--x 397 398 --- 591 - 398 --- 871 - 872 <--x 398 + 398 --- 872 + 873 <--x 398 399 --- 799 - 1078 <--x 399 399 --- 1079 + 1080 <--x 399 400 --- 729 - 400 --- 1009 - 1010 <--x 400 + 400 --- 1010 + 1011 <--x 400 401 --- 765 - 1044 <--x 401 401 --- 1045 + 1046 <--x 401 402 --- 602 - 402 --- 882 - 883 <--x 402 + 402 --- 883 + 884 <--x 402 403 --- 595 - 403 --- 875 - 876 <--x 403 + 403 --- 876 + 877 <--x 403 404 --- 633 - 404 --- 913 - 914 <--x 404 + 404 --- 914 + 915 <--x 404 405 --- 827 - 1106 <--x 405 405 --- 1107 + 1108 <--x 405 406 --- 678 - 406 --- 958 - 959 <--x 406 + 406 --- 959 + 960 <--x 406 407 --- 596 - 407 --- 876 - 877 <--x 407 + 407 --- 877 + 878 <--x 407 408 --- 736 - 1015 <--x 408 408 --- 1016 + 1017 <--x 408 409 --- 806 - 1085 <--x 409 409 --- 1086 + 1087 <--x 409 410 --- 640 - 410 --- 920 - 921 <--x 410 + 410 --- 921 + 922 <--x 410 411 --- 782 - 1061 <--x 411 411 --- 1062 + 1063 <--x 411 412 --- 837 - 1116 <--x 412 412 --- 1117 + 1118 <--x 412 413 --- 628 - 413 --- 908 - 909 <--x 413 + 413 --- 909 + 910 <--x 413 414 --- 694 - 414 --- 974 - 975 <--x 414 + 414 --- 975 + 976 <--x 414 415 --- 796 - 1075 <--x 415 415 --- 1076 + 1077 <--x 415 416 --- 753 - 1032 <--x 416 416 --- 1033 + 1034 <--x 416 417 --- 575 - 417 --- 855 - 856 <--x 417 + 417 --- 856 + 857 <--x 417 418 --- 807 - 1086 <--x 418 418 --- 1087 + 1088 <--x 418 419 --- 767 - 1046 <--x 419 419 --- 1047 + 1048 <--x 419 420 --- 829 - 1108 <--x 420 420 --- 1109 + 1110 <--x 420 421 --- 585 - 421 --- 865 - 866 <--x 421 + 421 --- 866 + 867 <--x 421 422 --- 652 - 422 --- 932 - 933 <--x 422 + 422 --- 933 + 934 <--x 422 423 --- 676 - 423 --- 956 - 957 <--x 423 + 423 --- 957 + 958 <--x 423 424 --- 848 - 1127 <--x 424 424 --- 1128 + 1129 <--x 424 425 --- 849 - 1128 <--x 425 425 --- 1129 + 1130 <--x 425 426 --- 814 - 1093 <--x 426 426 --- 1094 + 1095 <--x 426 427 --- 620 - 427 --- 900 - 901 <--x 427 + 427 --- 901 + 902 <--x 427 428 --- 684 - 428 --- 964 - 965 <--x 428 + 428 --- 965 + 966 <--x 428 429 --- 600 - 429 --- 880 - 881 <--x 429 + 429 --- 881 + 882 <--x 429 430 --- 572 - 430 --- 852 - 853 <--x 430 + 430 --- 853 + 854 <--x 430 431 --- 625 - 431 --- 905 - 906 <--x 431 + 431 --- 906 + 907 <--x 431 432 --- 812 - 1091 <--x 432 432 --- 1092 + 1093 <--x 432 433 --- 828 - 1107 <--x 433 433 --- 1108 + 1109 <--x 433 434 --- 580 - 434 --- 860 - 861 <--x 434 + 434 --- 861 + 862 <--x 434 435 --- 785 - 1064 <--x 435 435 --- 1065 + 1066 <--x 435 436 --- 831 - 1110 <--x 436 436 --- 1111 + 1112 <--x 436 437 --- 681 - 437 --- 961 - 962 <--x 437 + 437 --- 962 + 963 <--x 437 438 --- 587 - 438 --- 867 - 868 <--x 438 + 438 --- 868 + 869 <--x 438 439 --- 738 - 1017 <--x 439 439 --- 1018 + 1019 <--x 439 440 --- 613 - 440 --- 893 - 894 <--x 440 + 440 --- 894 + 895 <--x 440 441 --- 577 - 441 --- 857 - 858 <--x 441 + 441 --- 858 + 859 <--x 441 442 --- 570 - 851 <--x 442 - 442 --- 1130 + 442 --- 851 + 852 <--x 442 443 --- 612 - 443 --- 892 - 893 <--x 443 + 443 --- 893 + 894 <--x 443 444 --- 720 - 444 --- 1000 - 1001 <--x 444 + 444 --- 1001 + 1002 <--x 444 445 --- 750 - 1029 <--x 445 445 --- 1030 + 1031 <--x 445 446 --- 739 - 1018 <--x 446 446 --- 1019 + 1020 <--x 446 447 --- 718 - 447 --- 998 - 999 <--x 447 + 447 --- 999 + 1000 <--x 447 448 --- 691 - 448 --- 971 - 972 <--x 448 + 448 --- 972 + 973 <--x 448 449 --- 637 - 449 --- 917 - 918 <--x 449 + 449 --- 918 + 919 <--x 449 450 --- 733 - 450 --- 1013 - 1014 <--x 450 + 450 --- 1014 + 1015 <--x 450 451 --- 605 - 451 --- 885 - 886 <--x 451 + 451 --- 886 + 887 <--x 451 452 --- 619 - 452 --- 899 - 900 <--x 452 + 452 --- 900 + 901 <--x 452 453 --- 657 - 453 --- 937 - 938 <--x 453 + 453 --- 938 + 939 <--x 453 454 --- 576 - 454 --- 856 - 857 <--x 454 + 454 --- 857 + 858 <--x 454 455 --- 634 - 455 --- 914 - 915 <--x 455 + 455 --- 915 + 916 <--x 455 456 --- 737 - 1016 <--x 456 456 --- 1017 + 1018 <--x 456 457 --- 645 - 457 --- 925 - 926 <--x 457 + 457 --- 926 + 927 <--x 457 458 --- 717 - 458 --- 997 - 998 <--x 458 + 458 --- 998 + 999 <--x 458 459 --- 706 - 459 --- 986 - 987 <--x 459 + 459 --- 987 + 988 <--x 459 460 --- 622 - 460 --- 902 - 903 <--x 460 + 460 --- 903 + 904 <--x 460 461 --- 742 - 1021 <--x 461 461 --- 1022 + 1023 <--x 461 462 --- 651 - 462 --- 931 - 932 <--x 462 + 462 --- 932 + 933 <--x 462 463 --- 795 - 1074 <--x 463 463 --- 1075 + 1076 <--x 463 464 --- 611 - 464 --- 891 - 892 <--x 464 + 464 --- 892 + 893 <--x 464 465 --- 614 - 465 --- 894 - 895 <--x 465 + 465 --- 895 + 896 <--x 465 466 --- 732 - 466 --- 1012 - 1013 <--x 466 + 466 --- 1013 + 1014 <--x 466 467 --- 610 - 467 --- 890 - 891 <--x 467 + 467 --- 891 + 892 <--x 467 468 --- 708 - 468 --- 988 - 989 <--x 468 + 468 --- 989 + 990 <--x 468 469 --- 743 - 1022 <--x 469 469 --- 1023 + 1024 <--x 469 470 --- 597 - 470 --- 877 - 878 <--x 470 + 470 --- 878 + 879 <--x 470 471 --- 723 - 471 --- 1003 - 1004 <--x 471 + 471 --- 1004 + 1005 <--x 471 472 --- 642 - 472 --- 922 - 923 <--x 472 + 472 --- 923 + 924 <--x 472 473 --- 818 - 1097 <--x 473 473 --- 1098 + 1099 <--x 473 474 --- 603 - 474 --- 883 - 884 <--x 474 + 474 --- 884 + 885 <--x 474 475 --- 623 - 475 --- 903 - 904 <--x 475 + 475 --- 904 + 905 <--x 475 476 --- 641 - 476 --- 921 - 922 <--x 476 + 476 --- 922 + 923 <--x 476 477 --- 713 - 477 --- 993 - 994 <--x 477 + 477 --- 994 + 995 <--x 477 478 --- 667 - 478 --- 947 - 948 <--x 478 + 478 --- 948 + 949 <--x 478 479 --- 579 - 479 --- 859 - 860 <--x 479 + 479 --- 860 + 861 <--x 479 480 --- 687 - 480 --- 967 - 968 <--x 480 + 480 --- 968 + 969 <--x 480 481 --- 793 - 1072 <--x 481 481 --- 1073 + 1074 <--x 481 482 --- 621 - 482 --- 901 - 902 <--x 482 + 482 --- 902 + 903 <--x 482 483 --- 781 - 1060 <--x 483 483 --- 1061 + 1062 <--x 483 484 --- 801 - 1080 <--x 484 484 --- 1081 + 1082 <--x 484 485 --- 588 - 485 --- 868 - 869 <--x 485 + 485 --- 869 + 870 <--x 485 486 --- 601 - 486 --- 881 - 882 <--x 486 + 486 --- 882 + 883 <--x 486 487 --- 679 - 487 --- 959 - 960 <--x 487 + 487 --- 960 + 961 <--x 487 488 --- 789 - 1068 <--x 488 488 --- 1069 + 1070 <--x 488 489 --- 696 - 489 --- 976 - 977 <--x 489 + 489 --- 977 + 978 <--x 489 490 --- 664 - 490 --- 944 - 945 <--x 490 + 490 --- 945 + 946 <--x 490 491 --- 791 - 1070 <--x 491 491 --- 1071 + 1072 <--x 491 492 --- 721 - 492 --- 1001 - 1002 <--x 492 + 492 --- 1002 + 1003 <--x 492 493 --- 711 - 493 --- 991 - 992 <--x 493 + 493 --- 992 + 993 <--x 493 494 --- 653 - 494 --- 933 - 934 <--x 494 + 494 --- 934 + 935 <--x 494 495 --- 726 - 495 --- 1006 - 1007 <--x 495 + 495 --- 1007 + 1008 <--x 495 496 --- 804 - 1083 <--x 496 496 --- 1084 + 1085 <--x 496 497 --- 780 - 1059 <--x 497 497 --- 1060 + 1061 <--x 497 498 --- 830 - 1109 <--x 498 498 --- 1110 + 1111 <--x 498 499 --- 624 - 499 --- 904 - 905 <--x 499 + 499 --- 905 + 906 <--x 499 500 --- 740 - 1019 <--x 500 500 --- 1020 + 1021 <--x 500 501 --- 699 - 501 --- 979 - 980 <--x 501 + 501 --- 980 + 981 <--x 501 502 --- 735 - 502 --- 1015 + 502 --- 1016 503 --- 648 - 503 --- 928 - 929 <--x 503 + 503 --- 929 + 930 <--x 503 504 --- 682 - 504 --- 962 - 963 <--x 504 + 504 --- 963 + 964 <--x 504 505 --- 709 - 505 --- 989 - 990 <--x 505 + 505 --- 990 + 991 <--x 505 506 --- 821 - 1100 <--x 506 506 --- 1101 + 1102 <--x 506 507 --- 792 - 1071 <--x 507 507 --- 1072 + 1073 <--x 507 508 --- 788 - 1067 <--x 508 508 --- 1068 + 1069 <--x 508 509 --- 816 - 1095 <--x 509 509 --- 1096 + 1097 <--x 509 510 --- 798 - 1077 <--x 510 510 --- 1078 + 1079 <--x 510 511 --- 755 - 1034 <--x 511 511 --- 1035 + 1036 <--x 511 512 --- 615 - 512 --- 895 - 896 <--x 512 + 512 --- 896 + 897 <--x 512 513 --- 584 - 513 --- 864 - 865 <--x 513 + 513 --- 865 + 866 <--x 513 514 --- 638 - 514 --- 918 - 919 <--x 514 + 514 --- 919 + 920 <--x 514 515 --- 757 - 1036 <--x 515 515 --- 1037 + 1038 <--x 515 516 --- 690 - 516 --- 970 - 971 <--x 516 + 516 --- 971 + 972 <--x 516 517 --- 701 - 517 --- 981 - 982 <--x 517 + 517 --- 982 + 983 <--x 517 518 --- 666 - 518 --- 946 - 947 <--x 518 + 518 --- 947 + 948 <--x 518 519 --- 671 - 519 --- 951 - 952 <--x 519 + 519 --- 952 + 953 <--x 519 520 --- 662 - 520 --- 942 - 943 <--x 520 + 520 --- 943 + 944 <--x 520 521 --- 698 - 521 --- 978 - 979 <--x 521 + 521 --- 979 + 980 <--x 521 522 --- 779 - 1058 <--x 522 522 --- 1059 + 1060 <--x 522 523 --- 847 - 1126 <--x 523 523 --- 1127 + 1128 <--x 523 524 --- 677 - 524 --- 957 - 958 <--x 524 + 524 --- 958 + 959 <--x 524 525 --- 838 - 1117 <--x 525 525 --- 1118 + 1119 <--x 525 526 --- 703 - 526 --- 983 - 984 <--x 526 + 526 --- 984 + 985 <--x 526 527 --- 815 - 1094 <--x 527 527 --- 1095 + 1096 <--x 527 528 --- 835 - 1114 <--x 528 528 --- 1115 + 1116 <--x 528 529 --- 685 - 529 --- 965 - 966 <--x 529 + 529 --- 966 + 967 <--x 529 530 --- 594 - 530 --- 874 - 875 <--x 530 + 530 --- 875 + 876 <--x 530 531 --- 811 - 1090 <--x 531 531 --- 1091 + 1092 <--x 531 532 --- 627 - 532 --- 907 - 908 <--x 532 + 532 --- 908 + 909 <--x 532 533 --- 808 - 1087 <--x 533 533 --- 1088 + 1089 <--x 533 534 --- 609 - 534 --- 889 - 890 <--x 534 + 534 --- 890 + 891 <--x 534 535 --- 744 - 1023 <--x 535 535 --- 1024 + 1025 <--x 535 536 --- 790 - 1069 <--x 536 536 --- 1070 + 1071 <--x 536 537 --- 604 - 537 --- 884 - 885 <--x 537 + 537 --- 885 + 886 <--x 537 538 --- 754 - 1033 <--x 538 538 --- 1034 + 1035 <--x 538 539 --- 658 - 539 --- 938 - 939 <--x 539 + 539 --- 939 + 940 <--x 539 540 --- 746 - 1025 <--x 540 540 --- 1026 + 1027 <--x 540 541 --- 823 - 1102 <--x 541 541 --- 1103 + 1104 <--x 541 542 --- 668 - 542 --- 948 - 949 <--x 542 + 542 --- 949 + 950 <--x 542 543 --- 764 - 1043 <--x 543 543 --- 1044 + 1045 <--x 543 544 --- 643 - 544 --- 923 - 924 <--x 544 + 544 --- 924 + 925 <--x 544 545 --- 635 - 545 --- 915 - 916 <--x 545 + 545 --- 916 + 917 <--x 545 546 --- 805 - 1084 <--x 546 546 --- 1085 + 1086 <--x 546 547 --- 844 - 1123 <--x 547 547 --- 1124 + 1125 <--x 547 548 --- 850 - 1129 <--x 548 + 851 <--x 548 548 --- 1130 549 --- 833 - 1112 <--x 549 549 --- 1113 + 1114 <--x 549 550 --- 672 - 550 --- 952 - 953 <--x 550 + 550 --- 953 + 954 <--x 550 551 --- 797 - 1076 <--x 551 551 --- 1077 + 1078 <--x 551 552 --- 646 - 552 --- 926 - 927 <--x 552 + 552 --- 927 + 928 <--x 552 553 --- 702 - 553 --- 982 - 983 <--x 553 + 553 --- 983 + 984 <--x 553 554 --- 665 - 554 --- 945 - 946 <--x 554 + 554 --- 946 + 947 <--x 554 555 --- 842 - 1121 <--x 555 555 --- 1122 + 1123 <--x 555 556 --- 715 - 556 --- 995 - 996 <--x 556 + 556 --- 996 + 997 <--x 556 557 --- 747 - 1026 <--x 557 557 --- 1027 + 1028 <--x 557 558 --- 712 - 558 --- 992 - 993 <--x 558 + 558 --- 993 + 994 <--x 558 559 --- 670 - 559 --- 950 - 951 <--x 559 + 559 --- 951 + 952 <--x 559 560 --- 810 - 1089 <--x 560 560 --- 1090 + 1091 <--x 560 561 --- 639 - 561 --- 919 - 920 <--x 561 + 561 --- 920 + 921 <--x 561 562 --- 843 - 1122 <--x 562 562 --- 1123 + 1124 <--x 562 563 --- 599 - 563 --- 879 - 880 <--x 563 + 563 --- 880 + 881 <--x 563 564 --- 778 - 1057 <--x 564 564 --- 1058 + 1059 <--x 564 565 --- 589 - 565 --- 869 - 870 <--x 565 + 565 --- 870 + 871 <--x 565 566 --- 839 - 1118 <--x 566 566 --- 1119 + 1120 <--x 566 567 --- 592 - 567 --- 872 - 873 <--x 567 + 567 --- 873 + 874 <--x 567 570 <--x 569 571 <--x 569 572 <--x 569 diff --git a/rust/kcl-lib/tests/module_return_using_var/ops.snap b/rust/kcl-lib/tests/module_return_using_var/ops.snap index fb960a8db..2a899dad8 100644 --- a/rust/kcl-lib/tests/module_return_using_var/ops.snap +++ b/rust/kcl-lib/tests/module_return_using_var/ops.snap @@ -12,6 +12,38 @@ description: Operations executed module_return_using_var.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 5.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/multiple-foreign-imports-all-render/ops.snap b/rust/kcl-lib/tests/multiple-foreign-imports-all-render/ops.snap index 2abcd8719..5dbb0e1f4 100644 --- a/rust/kcl-lib/tests/multiple-foreign-imports-all-render/ops.snap +++ b/rust/kcl-lib/tests/multiple-foreign-imports-all-render/ops.snap @@ -30,6 +30,66 @@ description: Operations executed multiple-foreign-imports-all-render.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 1020.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "ImportedGeometry", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": -1020.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" }, diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_assert_is0.png b/rust/kcl-lib/tests/outputs/serial_test_example_assert_is0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_assert_is0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-angledLine0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_angled_line0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-angledLine0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_angled_line_that_intersects0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-angledLineThatIntersects0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_angled_line_that_intersects0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-angledLineThatIntersects0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_arc0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-arc0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_arc0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-arc0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_arc1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-arc1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_arc1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-arc1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_bezier_curve0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-bezierCurve0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_bezier_curve0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-bezierCurve0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_bezier_curve1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-bezierCurve1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_bezier_curve1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-bezierCurve1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_circle_three_point0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-circleThreePoint0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_circle_three_point0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-circleThreePoint0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_close0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-close0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_close0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-close0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_close1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-close1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_close1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-close1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_extrude0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_extrude0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_extrude1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_extrude1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_extrude2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_extrude2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_extrude3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_extrude3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-extrude3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_get_common_edge0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getCommonEdge0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_get_common_edge0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getCommonEdge0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_get_next_adjacent_edge0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getNextAdjacentEdge0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_get_next_adjacent_edge0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getNextAdjacentEdge0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_get_opposite_edge0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getOppositeEdge0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_get_opposite_edge0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getOppositeEdge0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_get_previous_adjacent_edge0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getPreviousAdjacentEdge0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_get_previous_adjacent_edge0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-getPreviousAdjacentEdge0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_involute_circular0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-involuteCircular0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_involute_circular0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-involuteCircular0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_last_segment_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-lastSegX0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_last_segment_x0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-lastSegX0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_last_segment_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-lastSegY0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_last_segment_y0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-lastSegY0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_line0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-line0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_line0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-line0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_loft0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-loft0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_loft0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-loft0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_loft1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-loft1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_loft1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-loft1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_loft2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-loft2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_loft2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-loft2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_pattern_circular_2d0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-patternCircular2d0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_pattern_circular_2d0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-patternCircular2d0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_pattern_linear_2d0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-patternLinear2d0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_pattern_linear_2d0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-patternLinear2d0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_pattern_linear_2d1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-patternLinear2d1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_pattern_linear_2d1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-patternLinear2d1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_polygon0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-polygon0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_polygon0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-polygon0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_polygon1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-polygon1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_polygon1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-polygon1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_profile_start0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-profileStart0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_profile_start0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-profileStart0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_profile_start_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-profileStartX0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_profile_start_x0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-profileStartX0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_profile_start_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-profileStartY0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_profile_start_y0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-profileStartY0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_angle0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segAng0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_angle0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segAng0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_end0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segEnd0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_end0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segEnd0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_end_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segEndX0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_end_x0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segEndX0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_end_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segEndY0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_end_y0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segEndY0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_length0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segLen0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_length0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segLen0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_start0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segStart0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_start0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segStart0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_start_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segStartX0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_start_x0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segStartX0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_segment_start_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segStartY0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_segment_start_y0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-segStartY0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startProfile0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_profile0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startProfile0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startProfile1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_profile1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startProfile1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_profile2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startProfile2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_profile2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startProfile2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on5.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn5.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_start_sketch_on5.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-startSketchOn5.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-subtract2d0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-subtract2d0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-subtract2d1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_subtract_2d1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-subtract2d1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_sweep0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_sweep0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_sweep1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_sweep1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_sweep2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_sweep2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_sweep3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_sweep3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-sweep3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangent_to_end4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentToEnd4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentialArc0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentialArc0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentialArc1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentialArc1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentialArc2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_tangential_arc2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-tangentialArc2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_x_line0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-xLine0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_x_line0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-xLine0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_y_line0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-yLine0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_y_line0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-sketch-yLine0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate5.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate5.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate5.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate5.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_rotate6.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate6.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_rotate6.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-rotate6.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_scale0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-scale0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_scale0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-scale0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_scale1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-scale1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_scale1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-scale1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_scale2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-scale2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_scale2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-scale2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_translate0.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate0.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_translate0.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate0.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_translate1.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate1.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_translate1.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate1.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_translate2.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate2.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_translate2.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate2.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_translate3.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate3.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_translate3.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate3.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_translate4.png b/rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate4.png similarity index 100% rename from rust/kcl-lib/tests/outputs/serial_test_example_translate4.png rename to rust/kcl-lib/tests/outputs/serial_test_example_fn_std-transform-translate4.png diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_leg_angle_x0.png b/rust/kcl-lib/tests/outputs/serial_test_example_leg_angle_x0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_leg_angle_x0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_leg_angle_y0.png b/rust/kcl-lib/tests/outputs/serial_test_example_leg_angle_y0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_leg_angle_y0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/outputs/serial_test_example_leg_length0.png b/rust/kcl-lib/tests/outputs/serial_test_example_leg_length0.png deleted file mode 100644 index 6148ae432..000000000 Binary files a/rust/kcl-lib/tests/outputs/serial_test_example_leg_length0.png and /dev/null differ diff --git a/rust/kcl-lib/tests/panic_repro_cube/execution_error.snap b/rust/kcl-lib/tests/panic_repro_cube/execution_error.snap index 6ac890f7e..64f15d59f 100644 --- a/rust/kcl-lib/tests/panic_repro_cube/execution_error.snap +++ b/rust/kcl-lib/tests/panic_repro_cube/execution_error.snap @@ -6,10 +6,23 @@ KCL Semantic error × semantic: This function expected the input argument to be tag identifier │ but it's actually of type tag - ╭─[43:25] + ╭─[43:5] 42 │ // these double wrapped functions are the point of this test 43 │ getNextAdjacentEdge(getNextAdjacentEdge(seg01)), - · ─────────────┬──────────── - · ╰── tests/panic_repro_cube/input.kcl + · ───────────────────────┬───────────────────────┬ + · │ ╰── tests/panic_repro_cube/input.kcl + · ╰── tests/panic_repro_cube/input.kcl 44 │ getNextAdjacentEdge(getNextAdjacentEdge(seg02)) ╰──── + ╰─▶ KCL Semantic error + + × semantic: This function expected the input argument to be tag + │ identifier but it's actually of type tag + ╭─[43:25] + 42 │ // these double wrapped functions are the point of this test + 43 │ getNextAdjacentEdge(getNextAdjacentEdge(seg01)), + · ─────────────┬──────────── + · ╰── tests/panic_repro_cube/ + input.kcl + 44 │ getNextAdjacentEdge(getNextAdjacentEdge(seg02)) + ╰──── diff --git a/rust/kcl-lib/tests/pattern_into_union/execution_error.snap b/rust/kcl-lib/tests/pattern_into_union/execution_error.snap index 9e762e28e..30142ff02 100644 --- a/rust/kcl-lib/tests/pattern_into_union/execution_error.snap +++ b/rust/kcl-lib/tests/pattern_into_union/execution_error.snap @@ -4,7 +4,8 @@ description: Error from executing pattern_into_union.kcl --- KCL Engine error - × engine: More than 2 solids were passed to the low-level CSG method + × engine: The Zoo engine cannot handle this 3D union yet. Please report + │ this as an issue ╭─[67:1] 66 │ 67 │ union([base,endTabs]) @@ -14,7 +15,8 @@ KCL Engine error ╰──── ╰─▶ KCL Engine error - × engine: More than 2 solids were passed to the low-level CSG method + × engine: The Zoo engine cannot handle this 3D union yet. Please + │ report this as an issue ╭─[67:1] 66 │ 67 │ union([base,endTabs]) diff --git a/rust/kcl-lib/tests/rotate_after_fillet/ops.snap b/rust/kcl-lib/tests/rotate_after_fillet/ops.snap index 7f21577f7..cea66d6ac 100644 --- a/rust/kcl-lib/tests/rotate_after_fillet/ops.snap +++ b/rust/kcl-lib/tests/rotate_after_fillet/ops.snap @@ -262,6 +262,70 @@ description: Operations executed rotate_after_fillet.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "pitch": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "roll": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "yaw": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/scale_after_fillet/ops.snap b/rust/kcl-lib/tests/scale_after_fillet/ops.snap index a1b416093..fb7681e11 100644 --- a/rust/kcl-lib/tests/scale_after_fillet/ops.snap +++ b/rust/kcl-lib/tests/scale_after_fillet/ops.snap @@ -262,6 +262,55 @@ description: Operations executed scale_after_fillet.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "scale", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/sketch_on_face_union/ops.snap b/rust/kcl-lib/tests/sketch_on_face_union/ops.snap index 4f73a03ae..add8db387 100644 --- a/rust/kcl-lib/tests/sketch_on_face_union/ops.snap +++ b/rust/kcl-lib/tests/sketch_on_face_union/ops.snap @@ -260,5 +260,84 @@ description: Operations executed sketch_on_face_union.kcl } }, "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": -90.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Inches" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] } ] diff --git a/rust/kcl-lib/tests/spheres/ops.snap b/rust/kcl-lib/tests/spheres/ops.snap index 23ff951f8..cd8e07a63 100644 --- a/rust/kcl-lib/tests/spheres/ops.snap +++ b/rust/kcl-lib/tests/spheres/ops.snap @@ -200,5 +200,37 @@ description: Operations executed spheres.kcl } }, "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 15.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] } ] diff --git a/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap b/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap index 5ef9d57b6..abf999432 100644 --- a/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap +++ b/rust/kcl-lib/tests/subtract_cylinder_from_cube/ops.snap @@ -139,6 +139,38 @@ description: Operations executed subtract_cylinder_from_cube.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 3.14, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "subtract", diff --git a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap index 6a5a65a5a..24b1b8868 100644 --- a/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap +++ b/rust/kcl-lib/tests/subtract_doesnt_need_brackets/ops.snap @@ -217,6 +217,38 @@ description: Operations executed subtract_doesnt_need_brackets.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "subtract", diff --git a/rust/kcl-lib/tests/subtract_regression03/ops.snap b/rust/kcl-lib/tests/subtract_regression03/ops.snap index afb2396d7..9ba2fa0df 100644 --- a/rust/kcl-lib/tests/subtract_regression03/ops.snap +++ b/rust/kcl-lib/tests/subtract_regression03/ops.snap @@ -16,190 +16,51 @@ description: Operations executed subtract_regression03.kcl "labeledArgs": {}, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "scale", + "unlabeledArg": { + "value": { + "type": "Sketch", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 0.958, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.958, + "ty": { + "type": "Known", + "type": "Count" + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.503704, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.264924, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.191884, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.172584, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.191884, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.172584, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -236,185 +97,8 @@ description: Operations executed subtract_regression03.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.503704, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.28, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.191884, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.172584, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.191884, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.172584, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -488,185 +172,8 @@ description: Operations executed subtract_regression03.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.42, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.28, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.200323, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.265308, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.200323, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.265308, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/subtract_regression04/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/subtract_regression04/artifact_graph_flowchart.snap.md index cf1b6c292..36591e754 100644 --- a/rust/kcl-lib/tests/subtract_regression04/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/subtract_regression04/artifact_graph_flowchart.snap.md @@ -61,6 +61,7 @@ flowchart LR 31["SweepEdge Adjacent"] 32["SweepEdge Adjacent"] 33["SweepEdge Adjacent"] + 34["SweepEdge Adjacent"] 1 --- 3 2 --- 4 3 --- 5 @@ -79,22 +80,22 @@ flowchart LR 4 --- 17 15 <--x 5 5 --- 24 - 5 x--> 29 + 5 --- 29 15 <--x 6 6 --- 22 - 6 --- 29 + 6 --- 30 15 <--x 7 7 --- 21 - 7 --- 30 + 7 --- 31 15 <--x 8 8 --- 23 - 8 --- 31 + 8 --- 32 15 <--x 9 9 --- 20 - 9 --- 32 + 9 --- 33 15 <--x 10 10 --- 19 - 10 --- 33 + 10 --- 34 12 --- 18 12 x--> 25 12 --- 27 @@ -110,6 +111,7 @@ flowchart LR 15 --- 31 15 --- 32 15 --- 33 + 15 --- 34 16 --- 18 16 --- 25 16 --- 26 @@ -117,15 +119,17 @@ flowchart LR 16 --- 28 18 --- 27 18 --- 28 - 32 <--x 19 - 19 --- 33 - 31 <--x 20 - 20 --- 32 - 21 --- 30 - 22 --- 29 - 30 <--x 23 - 23 --- 31 + 33 <--x 19 + 19 --- 34 + 32 <--x 20 + 20 --- 33 + 30 <--x 21 + 21 --- 31 + 29 <--x 22 + 22 --- 30 + 31 <--x 23 + 23 --- 32 24 --- 29 - 33 <--x 24 + 34 <--x 24 27 <--x 26 ``` diff --git a/rust/kcl-lib/tests/subtract_regression05/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/subtract_regression05/artifact_graph_flowchart.snap.md index 1eafa1a29..8def2ff5f 100644 --- a/rust/kcl-lib/tests/subtract_regression05/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/subtract_regression05/artifact_graph_flowchart.snap.md @@ -70,6 +70,7 @@ flowchart LR 33["SweepEdge Adjacent"] 34["SweepEdge Adjacent"] 35["SweepEdge Adjacent"] + 36["SweepEdge Adjacent"] 1 --- 4 2 --- 5 2 --- 6 @@ -97,16 +98,16 @@ flowchart LR 11 --- 32 22 <--x 13 13 --- 25 - 13 x--> 33 + 13 --- 33 22 <--x 14 14 --- 28 - 14 --- 33 + 14 --- 34 22 <--x 15 15 --- 26 - 15 --- 34 + 15 --- 35 22 <--x 16 16 --- 27 - 16 --- 35 + 16 --- 36 21 --- 24 21 --- 29 21 --- 30 @@ -119,13 +120,16 @@ flowchart LR 22 --- 33 22 --- 34 22 --- 35 + 22 --- 36 24 --- 31 24 --- 32 25 --- 33 - 35 <--x 25 - 26 --- 34 - 34 <--x 27 - 27 --- 35 - 28 --- 33 + 36 <--x 25 + 34 <--x 26 + 26 --- 35 + 35 <--x 27 + 27 --- 36 + 33 <--x 28 + 28 --- 34 31 <--x 30 ``` diff --git a/rust/kcl-lib/tests/subtract_regression06/ops.snap b/rust/kcl-lib/tests/subtract_regression06/ops.snap index 9f9f3f33a..92aa69584 100644 --- a/rust/kcl-lib/tests/subtract_regression06/ops.snap +++ b/rust/kcl-lib/tests/subtract_regression06/ops.snap @@ -69,185 +69,8 @@ description: Operations executed subtract_regression06.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "zAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Inches" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/subtract_regression09/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/subtract_regression09/artifact_graph_flowchart.snap.md index 8d5d4b23a..7b447c09c 100644 --- a/rust/kcl-lib/tests/subtract_regression09/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/subtract_regression09/artifact_graph_flowchart.snap.md @@ -95,6 +95,7 @@ flowchart LR 54["SweepEdge Adjacent"] 55["SweepEdge Adjacent"] 56["SweepEdge Adjacent"] + 57["SweepEdge Adjacent"] 1 --- 3 2 --- 4 3 --- 5 @@ -119,48 +120,48 @@ flowchart LR 4 --- 23 21 <--x 5 5 --- 27 - 5 x--> 46 + 5 --- 46 21 <--x 6 6 --- 25 - 6 --- 46 + 6 --- 47 21 <--x 7 7 --- 24 - 7 --- 47 + 7 --- 48 21 <--x 8 8 --- 26 - 8 --- 48 + 8 --- 49 10 --- 29 10 x--> 36 10 --- 45 - 10 --- 56 + 10 --- 57 11 --- 34 11 x--> 36 11 --- 44 - 11 --- 55 + 11 --- 56 12 --- 30 12 x--> 36 12 --- 43 - 12 --- 54 + 12 --- 55 13 --- 35 13 x--> 36 13 --- 42 - 13 --- 53 + 13 --- 54 14 --- 28 14 x--> 36 14 --- 41 - 14 --- 52 + 14 --- 53 15 --- 32 15 x--> 36 15 --- 40 - 15 --- 51 + 15 --- 52 16 --- 33 16 x--> 36 16 --- 39 - 16 --- 50 + 16 --- 51 17 --- 31 17 x--> 36 17 --- 38 - 17 --- 49 + 17 --- 50 21 --- 24 21 --- 25 21 --- 26 @@ -168,6 +169,7 @@ flowchart LR 21 --- 46 21 --- 47 21 --- 48 + 21 --- 49 22 --- 28 22 --- 29 22 --- 30 @@ -186,7 +188,6 @@ flowchart LR 22 --- 43 22 --- 44 22 --- 45 - 22 --- 49 22 --- 50 22 --- 51 22 --- 52 @@ -194,36 +195,39 @@ flowchart LR 22 --- 54 22 --- 55 22 --- 56 - 24 --- 47 - 25 --- 46 - 47 <--x 26 - 26 --- 48 + 22 --- 57 + 47 <--x 24 + 24 --- 48 + 46 <--x 25 + 25 --- 47 + 48 <--x 26 + 26 --- 49 27 --- 46 - 48 <--x 27 + 49 <--x 27 28 --- 41 - 51 <--x 28 - 28 --- 52 + 28 --- 53 + 54 <--x 28 29 --- 45 - 55 <--x 29 - 29 --- 56 + 50 <--x 29 + 29 --- 57 30 --- 43 - 53 <--x 30 - 30 --- 54 + 30 --- 55 + 56 <--x 30 31 --- 38 - 31 --- 49 - 56 <--x 31 + 31 --- 50 + 51 <--x 31 32 --- 40 - 50 <--x 32 - 32 --- 51 + 32 --- 52 + 53 <--x 32 33 --- 39 - 49 <--x 33 - 33 --- 50 + 33 --- 51 + 52 <--x 33 34 --- 44 - 54 <--x 34 - 34 --- 55 + 34 --- 56 + 57 <--x 34 35 --- 42 - 52 <--x 35 - 35 --- 53 + 35 --- 54 + 55 <--x 35 38 <--x 37 39 <--x 37 40 <--x 37 diff --git a/rust/kcl-lib/tests/subtract_regression10/ops.snap b/rust/kcl-lib/tests/subtract_regression10/ops.snap index ba9822fa1..382662ce8 100644 --- a/rust/kcl-lib/tests/subtract_regression10/ops.snap +++ b/rust/kcl-lib/tests/subtract_regression10/ops.snap @@ -624,141 +624,8 @@ description: Operations executed subtract_regression10.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 232.09247866942073, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.9778288277170034, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.2094057871349092, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, @@ -1022,141 +889,8 @@ description: Operations executed subtract_regression10.kcl "name": "startSketchOn", "unlabeledArg": { "value": { - "type": "Object", - "value": { - "origin": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 232.09247866942073, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "xAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": -0.9778288277170034, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": -0.2094057871349092, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - }, - "yAxis": { - "type": "Array", - "value": [ - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 1.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - }, - { - "type": "Number", - "value": 0.0, - "ty": { - "type": "Default", - "len": { - "type": "Mm" - }, - "angle": { - "type": "Degrees" - } - } - } - ] - } - } + "type": "Plane", + "artifact_id": "[uuid]" }, "sourceRange": [] }, diff --git a/rust/kcl-lib/tests/subtract_regression11/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/subtract_regression11/artifact_graph_flowchart.snap.md index 4d66446cb..8db822129 100644 --- a/rust/kcl-lib/tests/subtract_regression11/artifact_graph_flowchart.snap.md +++ b/rust/kcl-lib/tests/subtract_regression11/artifact_graph_flowchart.snap.md @@ -152,17 +152,17 @@ flowchart LR 20 --- 39 20 --- 40 22 --- 34 - 37 <--x 22 22 --- 38 + 39 <--x 22 23 --- 36 - 39 <--x 23 + 37 <--x 23 23 --- 40 24 --- 33 24 --- 37 - 40 <--x 24 + 38 <--x 24 25 --- 35 - 38 <--x 25 25 --- 39 + 40 <--x 25 44 <--x 26 42 <--x 27 27 --- 43 diff --git a/rust/kcl-lib/tests/subtract_with_pattern/ops.snap b/rust/kcl-lib/tests/subtract_with_pattern/ops.snap index 8cba14661..f002067c7 100644 --- a/rust/kcl-lib/tests/subtract_with_pattern/ops.snap +++ b/rust/kcl-lib/tests/subtract_with_pattern/ops.snap @@ -271,5 +271,84 @@ description: Operations executed subtract_with_pattern.kcl } }, "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 90.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] } ] diff --git a/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/ops.snap b/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/ops.snap index a6c415e2b..595333f93 100644 --- a/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/ops.snap +++ b/rust/kcl-lib/tests/subtract_with_pattern_cut_thru/ops.snap @@ -93,6 +93,38 @@ description: Operations executed subtract_with_pattern_cut_thru.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "y": { + "value": { + "type": "Number", + "value": 30.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "patternLinear3d", @@ -241,5 +273,84 @@ description: Operations executed subtract_with_pattern_cut_thru.kcl } }, "sourceRange": [] + }, + { + "type": "StdLibCall", + "name": "rotate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "angle": { + "value": { + "type": "Number", + "value": 90.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "axis": { + "value": { + "type": "Array", + "value": [ + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + } + ] + }, + "sourceRange": [] + } + }, + "sourceRange": [] } ] diff --git a/rust/kcl-lib/tests/translate_after_fillet/ops.snap b/rust/kcl-lib/tests/translate_after_fillet/ops.snap index 3fb2a2dac..f655137fa 100644 --- a/rust/kcl-lib/tests/translate_after_fillet/ops.snap +++ b/rust/kcl-lib/tests/translate_after_fillet/ops.snap @@ -262,6 +262,70 @@ description: Operations executed translate_after_fillet.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "x": { + "value": { + "type": "Number", + "value": 10.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "y": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + }, + "z": { + "value": { + "type": "Number", + "value": 0.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "GroupEnd" } diff --git a/rust/kcl-lib/tests/union_cubes/ops.snap b/rust/kcl-lib/tests/union_cubes/ops.snap index 301dff2b2..e7fcd9eb0 100644 --- a/rust/kcl-lib/tests/union_cubes/ops.snap +++ b/rust/kcl-lib/tests/union_cubes/ops.snap @@ -217,6 +217,38 @@ description: Operations executed union_cubes.kcl }, "sourceRange": [] }, + { + "type": "StdLibCall", + "name": "translate", + "unlabeledArg": { + "value": { + "type": "Solid", + "value": { + "artifactId": "[uuid]" + } + }, + "sourceRange": [] + }, + "labeledArgs": { + "z": { + "value": { + "type": "Number", + "value": 1.0, + "ty": { + "type": "Default", + "len": { + "type": "Mm" + }, + "angle": { + "type": "Degrees" + } + } + }, + "sourceRange": [] + } + }, + "sourceRange": [] + }, { "type": "StdLibCall", "name": "union", diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/artifact_commands.snap b/rust/kcl-lib/tests/var_ref_in_own_def/artifact_commands.snap new file mode 100644 index 000000000..8343a2d43 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/artifact_commands.snap @@ -0,0 +1,57 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands var_ref_in_own_def.kcl +--- +[ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "make_plane", + "origin": { + "x": 0.0, + "y": 0.0, + "z": 0.0 + }, + "x_axis": { + "x": 1.0, + "y": 0.0, + "z": 0.0 + }, + "y_axis": { + "x": 0.0, + "y": 1.0, + "z": 0.0 + }, + "size": 60.0, + "clobber": false, + "hide": true + } + } +] diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/var_ref_in_own_def/artifact_graph_flowchart.snap new file mode 100644 index 000000000..cdb15ba8c --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart var_ref_in_own_def.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/var_ref_in_own_def/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..01d8d3419 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/artifact_graph_flowchart.snap.md @@ -0,0 +1,5 @@ +```mermaid +flowchart LR + 1["Plane
[95, 112, 0]"] + %% [ProgramBodyItem { index: 0 }, VariableDeclarationDeclaration, VariableDeclarationInit, PipeBodyItem { index: 0 }] +``` diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/ast.snap b/rust/kcl-lib/tests/var_ref_in_own_def/ast.snap new file mode 100644 index 000000000..eb3b2ced8 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/ast.snap @@ -0,0 +1,169 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing var_ref_in_own_def.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": [ + { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startSketchOn", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "XY", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + }, + { + "arguments": [ + { + "type": "LabeledArg", + "label": null, + "arg": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "sketch001", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + } + } + ], + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "startProfileAt", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": { + "commentStart": 0, + "elements": [ + { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } + }, + { + "argument": { + "commentStart": 0, + "end": 0, + "raw": "20", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 20.0, + "suffix": "None" + } + }, + "commentStart": 0, + "end": 0, + "operator": "-", + "start": 0, + "type": "UnaryExpression", + "type": "UnaryExpression" + } + ], + "end": 0, + "start": 0, + "type": "ArrayExpression", + "type": "ArrayExpression" + } + } + ], + "commentStart": 0, + "end": 0, + "start": 0, + "type": "PipeExpression", + "type": "PipeExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "preComments": [ + "// This won't work, because `sketch001` is being referenced in its own definition." + ], + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "commentStart": 0, + "end": 0, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/execution_error.snap b/rust/kcl-lib/tests/var_ref_in_own_def/execution_error.snap new file mode 100644 index 000000000..1044eb112 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/execution_error.snap @@ -0,0 +1,14 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Error from executing var_ref_in_own_def.kcl +--- +KCL UndefinedValue error + + × undefined value: You can't use `sketch001` because you're currently trying + │ to define it. Use a different variable here instead. + ╭─[3:32] + 2 │ sketch001 = startSketchOn(XY) + 3 │ |> startProfileAt([20, -20], sketch001) + · ────┬──── + · ╰── tests/var_ref_in_own_def/input.kcl + ╰──── diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/input.kcl b/rust/kcl-lib/tests/var_ref_in_own_def/input.kcl new file mode 100644 index 000000000..b97b46bc9 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/input.kcl @@ -0,0 +1,3 @@ +// This won't work, because `sketch001` is being referenced in its own definition. +sketch001 = startSketchOn(XY) + |> startProfileAt([20, -20], sketch001) diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/ops.snap b/rust/kcl-lib/tests/var_ref_in_own_def/ops.snap new file mode 100644 index 000000000..90a1f8242 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/ops.snap @@ -0,0 +1,19 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed var_ref_in_own_def.kcl +--- +[ + { + "type": "StdLibCall", + "name": "startSketchOn", + "unlabeledArg": { + "value": { + "type": "Plane", + "artifact_id": "[uuid]" + }, + "sourceRange": [] + }, + "labeledArgs": {}, + "sourceRange": [] + } +] diff --git a/rust/kcl-lib/tests/var_ref_in_own_def/unparsed.snap b/rust/kcl-lib/tests/var_ref_in_own_def/unparsed.snap new file mode 100644 index 000000000..c3bc36200 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def/unparsed.snap @@ -0,0 +1,7 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of unparsing var_ref_in_own_def.kcl +--- +// This won't work, because `sketch001` is being referenced in its own definition. +sketch001 = startSketchOn(XY) + |> startProfileAt([20, -20], sketch001) diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_commands.snap b/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_commands.snap new file mode 100644 index 000000000..5756d1352 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_commands.snap @@ -0,0 +1,32 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact commands var_ref_in_own_def_decl.kcl +--- +[ + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "edge_lines_visible", + "hidden": false + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + }, + { + "cmdId": "[uuid]", + "range": [], + "command": { + "type": "object_visible", + "object_id": "[uuid]", + "hidden": true + } + } +] diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_graph_flowchart.snap b/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_graph_flowchart.snap new file mode 100644 index 000000000..0156e40b2 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_graph_flowchart.snap @@ -0,0 +1,6 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Artifact graph flowchart var_ref_in_own_def_decl.kcl +extension: md +snapshot_kind: binary +--- diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_graph_flowchart.snap.md b/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_graph_flowchart.snap.md new file mode 100644 index 000000000..13e533509 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/artifact_graph_flowchart.snap.md @@ -0,0 +1,3 @@ +```mermaid +flowchart LR +``` diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/ast.snap b/rust/kcl-lib/tests/var_ref_in_own_def_decl/ast.snap new file mode 100644 index 000000000..f39f611aa --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/ast.snap @@ -0,0 +1,189 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of parsing var_ref_in_own_def_decl.kcl +--- +{ + "Ok": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "declare", + "start": 0, + "type": "Identifier" + }, + "init": { + "body": { + "body": [ + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "raw": "0", + "start": 0, + "type": "Literal", + "type": "Literal", + "value": { + "value": 0.0, + "suffix": "None" + } + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "argument": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "ReturnStatement", + "type": "ReturnStatement" + } + ], + "commentStart": 0, + "end": 0, + "start": 0 + }, + "commentStart": 0, + "end": 0, + "params": [], + "start": 0, + "type": "FunctionExpression", + "type": "FunctionExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "fn", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + }, + { + "commentStart": 0, + "declaration": { + "commentStart": 0, + "end": 0, + "id": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "init": { + "commentStart": 0, + "end": 0, + "left": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "x", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name", + "type": "Name" + }, + "operator": "+", + "right": { + "callee": { + "abs_path": false, + "commentStart": 0, + "end": 0, + "name": { + "commentStart": 0, + "end": 0, + "name": "declare", + "start": 0, + "type": "Identifier" + }, + "path": [], + "start": 0, + "type": "Name" + }, + "commentStart": 0, + "end": 0, + "start": 0, + "type": "CallExpressionKw", + "type": "CallExpressionKw", + "unlabeled": null + }, + "start": 0, + "type": "BinaryExpression", + "type": "BinaryExpression" + }, + "start": 0, + "type": "VariableDeclarator" + }, + "end": 0, + "kind": "const", + "start": 0, + "type": "VariableDeclaration", + "type": "VariableDeclaration" + } + ], + "commentStart": 0, + "end": 0, + "nonCodeMeta": { + "nonCodeNodes": { + "0": [ + { + "commentStart": 0, + "end": 0, + "start": 0, + "type": "NonCodeNode", + "value": { + "type": "newLine" + } + } + ] + }, + "startNodes": [] + }, + "start": 0 + } +} diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/execution_error.snap b/rust/kcl-lib/tests/var_ref_in_own_def_decl/execution_error.snap new file mode 100644 index 000000000..ff5d9c375 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/execution_error.snap @@ -0,0 +1,14 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Error from executing var_ref_in_own_def_decl.kcl +--- +KCL UndefinedValue error + + × undefined value: You can't use `x` because you're currently trying to + │ define it. Use a different variable here instead. + ╭─[6:5] + 5 │ + 6 │ x = x + declare() + · ┬ + · ╰── tests/var_ref_in_own_def_decl/input.kcl + ╰──── diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/input.kcl b/rust/kcl-lib/tests/var_ref_in_own_def_decl/input.kcl new file mode 100644 index 000000000..16c8a6941 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/input.kcl @@ -0,0 +1,6 @@ +fn declare() { + x = 0 + return x +} + +x = x + declare() diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/ops.snap b/rust/kcl-lib/tests/var_ref_in_own_def_decl/ops.snap new file mode 100644 index 000000000..3c633d243 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/ops.snap @@ -0,0 +1,5 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Operations executed var_ref_in_own_def_decl.kcl +--- +[] diff --git a/rust/kcl-lib/tests/var_ref_in_own_def_decl/unparsed.snap b/rust/kcl-lib/tests/var_ref_in_own_def_decl/unparsed.snap new file mode 100644 index 000000000..f9efa0351 --- /dev/null +++ b/rust/kcl-lib/tests/var_ref_in_own_def_decl/unparsed.snap @@ -0,0 +1,10 @@ +--- +source: kcl-lib/src/simulation_tests.rs +description: Result of unparsing var_ref_in_own_def_decl.kcl +--- +fn declare() { + x = 0 + return x +} + +x = x + declare() diff --git a/rust/kcl-python-bindings/Cargo.toml b/rust/kcl-python-bindings/Cargo.toml index 3f160e2a2..99f7e270d 100644 --- a/rust/kcl-python-bindings/Cargo.toml +++ b/rust/kcl-python-bindings/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kcl-python-bindings" -version = "0.3.77" +version = "0.3.79" edition = "2021" repository = "https://github.com/kittycad/modeling-app" exclude = ["tests/*", "files/*", "venv/*"] diff --git a/rust/kcl-test-server/Cargo.toml b/rust/kcl-test-server/Cargo.toml index 61d99cc8d..b840cf7bd 100644 --- a/rust/kcl-test-server/Cargo.toml +++ b/rust/kcl-test-server/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-test-server" description = "A test server for KCL" -version = "0.1.77" +version = "0.1.79" edition = "2021" license = "MIT" diff --git a/rust/kcl-to-core/Cargo.toml b/rust/kcl-to-core/Cargo.toml index 5c06133bd..b6e1192a0 100644 --- a/rust/kcl-to-core/Cargo.toml +++ b/rust/kcl-to-core/Cargo.toml @@ -1,7 +1,7 @@ [package] name = "kcl-to-core" description = "Utility methods to convert kcl to engine core executable tests" -version = "0.1.77" +version = "0.1.79" edition = "2021" license = "MIT" repository = "https://github.com/KittyCAD/modeling-app" diff --git a/rust/kcl-wasm-lib/Cargo.toml b/rust/kcl-wasm-lib/Cargo.toml index 181a935da..c1491059f 100644 --- a/rust/kcl-wasm-lib/Cargo.toml +++ b/rust/kcl-wasm-lib/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "kcl-wasm-lib" -version = "0.1.77" +version = "0.1.79" edition = "2021" repository = "https://github.com/KittyCAD/modeling-app" rust-version = "1.83" diff --git a/rust/kcl-wasm-lib/src/context.rs b/rust/kcl-wasm-lib/src/context.rs index be1ad8a76..4b5eca860 100644 --- a/rust/kcl-wasm-lib/src/context.rs +++ b/rust/kcl-wasm-lib/src/context.rs @@ -3,9 +3,11 @@ use std::sync::Arc; use gloo_utils::format::JsValueSerdeExt; -use kcl_lib::{wasm_engine::FileManager, EngineManager, Program}; +use kcl_lib::{wasm_engine::FileManager, EngineManager, ExecOutcome, KclError, KclErrorWithOutputs, Program}; use wasm_bindgen::prelude::*; +const TRUE_BUG: &str = "This is a bug in KCL and not in your code, please report this to Zoo."; + #[wasm_bindgen] pub struct Context { engine: Arc>, @@ -56,7 +58,7 @@ impl Context { return Ok(kcl_lib::ExecutorContext::new_mock( self.mock_engine.clone(), self.fs.clone(), - settings.into(), + settings, )); } @@ -74,18 +76,39 @@ impl Context { program_ast_json: &str, path: Option, settings: &str, - ) -> Result { + ) -> Result { console_error_panic_hook::set_once(); - let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?; + self.execute_typed(program_ast_json, path, settings) + .await + .and_then(|outcome| { + JsValue::from_serde(&outcome).map_err(|e| { + // The serde-wasm-bindgen does not work here because of weird HashMap issues. + // DO NOT USE serde_wasm_bindgen::to_value it will break the frontend. + KclErrorWithOutputs::no_outputs(KclError::internal(format!( + "Could not serialize successful KCL result. {TRUE_BUG} Details: {e}" + ))) + }) + }) + .map_err(|e: KclErrorWithOutputs| JsValue::from_serde(&e).unwrap()) + } - let ctx = self.create_executor_ctx(settings, path, false)?; - match ctx.run_with_caching(program).await { - // The serde-wasm-bindgen does not work here because of weird HashMap issues. - // DO NOT USE serde_wasm_bindgen::to_value it will break the frontend. - Ok(outcome) => JsValue::from_serde(&outcome).map_err(|e| e.to_string()), - Err(err) => Err(serde_json::to_string(&err).map_err(|serde_err| serde_err.to_string())?), - } + async fn execute_typed( + &self, + program_ast_json: &str, + path: Option, + settings: &str, + ) -> Result { + let program: Program = serde_json::from_str(program_ast_json).map_err(|e| { + let err = KclError::internal(format!("Could not deserialize KCL AST. {TRUE_BUG} Details: {e}")); + KclErrorWithOutputs::no_outputs(err) + })?; + let ctx = self.create_executor_ctx(settings, path, false).map_err(|e| { + KclErrorWithOutputs::no_outputs(KclError::internal(format!( + "Could not create KCL executor context. {TRUE_BUG} Details: {e}" + ))) + })?; + ctx.run_with_caching(program).await } /// Reset the scene and bust the cache. @@ -105,7 +128,7 @@ impl Context { /// Send a response to kcl lib's engine. #[wasm_bindgen(js_name = sendResponse)] - pub async fn send_response(&self, data: js_sys::Uint8Array) -> Result<(), JsValue> { + pub async fn send_response(&self, data: js_sys::Uint8Array) { self.response_context.send_response(data).await } @@ -117,18 +140,40 @@ impl Context { path: Option, settings: &str, use_prev_memory: bool, - ) -> Result { + ) -> Result { console_error_panic_hook::set_once(); - let program: Program = serde_json::from_str(program_ast_json).map_err(|e| e.to_string())?; + self.execute_mock_typed(program_ast_json, path, settings, use_prev_memory) + .await + .and_then(|outcome| { + JsValue::from_serde(&outcome).map_err(|e| { + // The serde-wasm-bindgen does not work here because of weird HashMap issues. + // DO NOT USE serde_wasm_bindgen::to_value it will break the frontend. + KclErrorWithOutputs::no_outputs(KclError::internal(format!( + "Could not serialize successful KCL result. {TRUE_BUG} Details: {e}" + ))) + }) + }) + .map_err(|e: KclErrorWithOutputs| JsValue::from_serde(&e).unwrap()) + } - let ctx = self.create_executor_ctx(settings, path, true)?; - match ctx.run_mock(program, use_prev_memory).await { - // The serde-wasm-bindgen does not work here because of weird HashMap issues. - // DO NOT USE serde_wasm_bindgen::to_value it will break the frontend. - Ok(outcome) => JsValue::from_serde(&outcome).map_err(|e| e.to_string()), - Err(err) => Err(serde_json::to_string(&err).map_err(|serde_err| serde_err.to_string())?), - } + async fn execute_mock_typed( + &self, + program_ast_json: &str, + path: Option, + settings: &str, + use_prev_memory: bool, + ) -> Result { + let program: Program = serde_json::from_str(program_ast_json).map_err(|e| { + let err = KclError::internal(format!("Could not deserialize KCL AST. {TRUE_BUG} Details: {e}")); + KclErrorWithOutputs::no_outputs(err) + })?; + let ctx = self.create_executor_ctx(settings, path, true).map_err(|e| { + KclErrorWithOutputs::no_outputs(KclError::internal(format!( + "Could not create KCL executor context. {TRUE_BUG} Details: {e}" + ))) + })?; + ctx.run_mock(program, use_prev_memory).await } /// Export a scene to a file. diff --git a/rust/rust-toolchain.toml b/rust/rust-toolchain.toml index c05dd6996..a84e0ac6a 100644 --- a/rust/rust-toolchain.toml +++ b/rust/rust-toolchain.toml @@ -1,3 +1,3 @@ [toolchain] -channel = "1.86" +channel = "1.87" components = ["clippy", "rustfmt"] diff --git a/src/App.tsx b/src/App.tsx index e853746d0..710cd213a 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -114,6 +114,9 @@ export function App() { // by the Projects view. billingActor.send({ type: BillingTransition.Update, apiToken: authToken }) + // Tell engineStream to wait for dependencies to start streaming. + engineStreamActor.send({ type: EngineStreamTransition.WaitForDependencies }) + // When leaving the modeling scene, cut the engine stream. return () => { // When leaving the modeling scene, cut the engine stream. diff --git a/src/clientSideScene/CameraControls.ts b/src/clientSideScene/CameraControls.ts index 715a7c268..add8cec63 100644 --- a/src/clientSideScene/CameraControls.ts +++ b/src/clientSideScene/CameraControls.ts @@ -1315,7 +1315,7 @@ export class CameraControls { ) if ( initialInteractionType === 'rotate' && - this.engineCommandManager.settings.cameraOrbit === 'trackball' + this.getSettings?.().modeling.cameraOrbit.current === 'trackball' ) { return 'rotatetrackball' } diff --git a/src/clientSideScene/sceneEntities.ts b/src/clientSideScene/sceneEntities.ts index c288761b3..4413ae47d 100644 --- a/src/clientSideScene/sceneEntities.ts +++ b/src/clientSideScene/sceneEntities.ts @@ -1107,7 +1107,11 @@ export class SceneEntities { (lastSegment.type === 'TangentialArc' && segmentName !== 'line') || segmentName === 'tangentialArc' ) { - resolvedFunctionName = 'tangentialArc' + if (snappedPoint[0] === 0 || snappedPoint[1] === 0) { + resolvedFunctionName = 'tangentialArcTo' + } else { + resolvedFunctionName = 'tangentialArc' + } } else if (snappedToTangent) { // Generate tag for previous arc segment and use it for the angle of angledLine: // |> tangentialArc(endAbsolute = [5, -10], tag = $arc001) @@ -2500,8 +2504,8 @@ export class SceneEntities { forward, position, }) - await this.codeManager.writeToFile() } + await this.codeManager.writeToFile() }, onDrag: async ({ selected, @@ -3584,7 +3588,8 @@ export class SceneEntities { }) if (!resp) { - return Promise.reject('no response') + console.warn('No response') + return {} as Models['GetSketchModePlane_type'] } if (isArray(resp)) { diff --git a/src/components/BillingDialog.tsx b/src/components/BillingDialog.tsx index 7a0bf89b3..860ea4966 100644 --- a/src/components/BillingDialog.tsx +++ b/src/components/BillingDialog.tsx @@ -41,7 +41,7 @@ export const BillingDialog = (props: { billingActor: BillingActor }) => { /> , 'children'> { @@ -116,7 +118,7 @@ export function ContextMenu({ {icon && }
{children}
- {hotkey && {hotkey}} + {hotkey && ( + {hotkeyDisplay(hotkey, platform)} + )} ) } @@ -172,6 +177,7 @@ export function ContextMenuItemRefresh() { globalThis?.window?.location.reload()} + hotkey="mod+r" > Refresh diff --git a/src/components/CustomIcon.tsx b/src/components/CustomIcon.tsx index ef2e1e410..59ce40897 100644 --- a/src/components/CustomIcon.tsx +++ b/src/components/CustomIcon.tsx @@ -1147,6 +1147,19 @@ const CustomIconMap = { /> ), + scale: ( + + + + ), search: ( (Date.now()) const [firstPlay, setFirstPlay] = useState(true) - const [isRestartRequestStarting, setIsRestartRequestStarting] = - useState(false) + const [goRestart, setGoRestart] = useState(false) + const [timeoutId, setTimeoutId] = useState< + ReturnType | undefined + >(undefined) const [attemptTimes, setAttemptTimes] = useState<[number, number]>([ 0, TIME_1_SECOND, @@ -85,18 +86,21 @@ export const EngineStream = (props: { const streamIdleMode = settings.app.streamIdleMode.current useEffect(() => { + // Will cause a useEffect loop if not checked for. + if (engineStreamState.context.videoRef.current !== null) return engineStreamActor.send({ type: EngineStreamTransition.SetVideoRef, videoRef: { current: videoRef.current }, }) - }, [videoRef.current]) + }, [videoRef.current, engineStreamState]) useEffect(() => { + if (engineStreamState.context.canvasRef.current !== null) return engineStreamActor.send({ type: EngineStreamTransition.SetCanvasRef, canvasRef: { current: canvasRef.current }, }) - }, [canvasRef.current]) + }, [canvasRef.current, engineStreamState]) useEffect(() => { engineStreamActor.send({ @@ -131,24 +135,6 @@ export const EngineStream = (props: { }) } - useEffect(() => { - // Only try to start the stream if we're stopped or think we're done - // waiting for dependencies. - if ( - !( - engineStreamState.value === EngineStreamState.WaitingForDependencies || - engineStreamState.value === EngineStreamState.Stopped - ) - ) - return - - // Don't bother trying to connect if the auth token is empty. - // We have the checks in the machine but this can cause a hot loop. - if (!engineStreamState.context.authToken) return - - startOrReconfigureEngine() - }, [engineStreamState, setAppState]) - // I would inline this but it needs to be a function for removeEventListener. const play = () => { engineStreamActor.send({ @@ -174,12 +160,13 @@ export const EngineStream = (props: { console.log('scene is ready, execute kcl') const kmp = kclManager.executeCode().catch(trap) - if (!firstPlay) return - - setFirstPlay(false) // Reset the restart timeouts setAttemptTimes([0, TIME_1_SECOND]) + console.log(firstPlay) + if (!firstPlay) return + + setFirstPlay(false) console.log('firstPlay true, zoom to fit') kmp .then(async () => { @@ -211,51 +198,76 @@ export const EngineStream = (props: { // We do a back-off restart, using a fibonacci sequence, since it // has a nice retry time curve (somewhat quick then exponential) const attemptRestartIfNecessary = () => { - if (isRestartRequestStarting) return - setIsRestartRequestStarting(true) - setTimeout(() => { - engineStreamState.context.videoRef.current?.pause() - engineCommandManager.tearDown() - startOrReconfigureEngine() - setFirstPlay(false) - setIsRestartRequestStarting(false) - }, attemptTimes[0] + attemptTimes[1]) + // Timeout already set. + if (timeoutId) return + + setTimeoutId( + setTimeout(() => { + engineStreamState.context.videoRef.current?.pause() + engineCommandManager.tearDown() + startOrReconfigureEngine() + setFirstPlay(true) + + setTimeoutId(undefined) + setGoRestart(false) + }, attemptTimes[0] + attemptTimes[1]) + ) setAttemptTimes([attemptTimes[1], attemptTimes[0] + attemptTimes[1]]) } - // Poll that we're connected. If not, send a reset signal. - // Do not restart if we're in idle mode. - const connectionCheckIntervalId = setInterval(() => { - // SKIP DURING TESTS BECAUSE IT WILL MESS WITH REUSING THE - // ELECTRON INSTANCE. - if (isPlaywright()) { + const onOffline = () => { + if ( + !( + EngineConnectionStateType.Disconnected === + engineCommandManager.engineConnection?.state.type || + EngineConnectionStateType.Disconnecting === + engineCommandManager.engineConnection?.state.type + ) + ) { return } - - // Don't try try to restart if we're already connected! - const hasEngineConnectionInst = engineCommandManager.engineConnection - const isDisconnected = - engineCommandManager.engineConnection?.state.type === - EngineConnectionStateType.Disconnected - const inIdleMode = engineStreamState.value === EngineStreamState.Paused - if ((hasEngineConnectionInst && !isDisconnected) || inIdleMode) return - + engineStreamActor.send({ type: EngineStreamTransition.Stop }) attemptRestartIfNecessary() - }, TIME_1_SECOND) + } + + if ( + !goRestart && + engineStreamState.value === EngineStreamState.WaitingForDependencies + ) { + setGoRestart(true) + } + + if (goRestart && !timeoutId) { + attemptRestartIfNecessary() + } engineCommandManager.addEventListener( EngineCommandManagerEvents.EngineRestartRequest, attemptRestartIfNecessary ) - return () => { - clearInterval(connectionCheckIntervalId) + engineCommandManager.addEventListener( + EngineCommandManagerEvents.Offline, + onOffline + ) + + return () => { engineCommandManager.removeEventListener( EngineCommandManagerEvents.EngineRestartRequest, attemptRestartIfNecessary ) + engineCommandManager.removeEventListener( + EngineCommandManagerEvents.Offline, + onOffline + ) } - }, [engineStreamState, attemptTimes, isRestartRequestStarting]) + }, [ + engineStreamState, + attemptTimes, + goRestart, + timeoutId, + engineCommandManager.engineConnection?.state.type, + ]) useEffect(() => { // If engineStreamMachine is already reconfiguring, bail. @@ -269,7 +281,7 @@ export const EngineStream = (props: { const canvas = engineStreamState.context.canvasRef?.current if (!canvas) return - new ResizeObserver(() => { + const observer = new ResizeObserver(() => { // Prevents: // `Uncaught ResizeObserver loop completed with undelivered notifications` window.requestAnimationFrame(() => { @@ -280,13 +292,19 @@ export const EngineStream = (props: { if ( (Math.abs(video.width - window.innerWidth) > 4 || Math.abs(video.height - window.innerHeight) > 4) && - !engineStreamState.matches(EngineStreamState.WaitingToPlay) + engineStreamState.matches(EngineStreamState.Playing) ) { timeoutStart.current = Date.now() startOrReconfigureEngine() } }) - }).observe(document.body) + }) + + observer.observe(document.body) + + return () => { + observer.disconnect() + } }, [engineStreamState.value]) /** @@ -345,8 +363,21 @@ export const EngineStream = (props: { timeoutStart.current = null } else if (timeoutStart.current) { const elapsed = Date.now() - timeoutStart.current - if (elapsed >= IDLE_TIME_MS) { + // Don't pause if we're already disconnected. + if ( + // It's unnecessary to once again setup an event listener for + // offline/online to capture this state, when this state already + // exists on the window.navigator object. In hindsight it makes + // me (lee) regret we set React state variables such as + // isInternetConnected in other files when we could check this + // object instead. + engineCommandManager.engineConnection?.state.type === + EngineConnectionStateType.ConnectionEstablished && + elapsed >= IDLE_TIME_MS && + engineStreamState.value === EngineStreamState.Playing + ) { timeoutStart.current = null + console.log('PAUSING') engineStreamActor.send({ type: EngineStreamTransition.Pause }) } } @@ -357,7 +388,7 @@ export const EngineStream = (props: { return () => { window.cancelAnimationFrame(frameId) } - }, [modelingMachineState]) + }, [modelingMachineState, engineStreamState.value]) useEffect(() => { if (!streamIdleMode) return @@ -370,9 +401,18 @@ export const EngineStream = (props: { return } - if (engineStreamState.value === EngineStreamState.Paused) { - startOrReconfigureEngine() - } + engineStreamActor.send({ + type: EngineStreamTransition.Resume, + modelingMachineActorSend, + settings: settingsEngine, + setAppState, + onMediaStream(mediaStream: MediaStream) { + engineStreamActor.send({ + type: EngineStreamTransition.SetMediaStream, + mediaStream, + }) + }, + }) timeoutStart.current = Date.now() } @@ -471,7 +511,11 @@ export const EngineStream = (props: { } sendSelectEventToEngine(e) - .then(({ entity_id }) => { + .then((result) => { + if (!result) { + return + } + const { entity_id } = result if (!entity_id) { // No entity selected. This is benign return @@ -535,7 +579,7 @@ export const EngineStream = (props: { EngineStreamState.Resuming, ].some((s) => s === engineStreamState.value) && ( - Connecting to engine + Connecting to engine... )} diff --git a/src/components/Loading.tsx b/src/components/Loading.tsx index de10e6178..152a4b5ca 100644 --- a/src/components/Loading.tsx +++ b/src/components/Loading.tsx @@ -1,6 +1,7 @@ import type { MarkedOptions } from '@ts-stack/markdown' import { Marked, escape, unescape } from '@ts-stack/markdown' import { useEffect, useState } from 'react' +import type { ReactNode } from 'react' import { CustomIcon } from '@src/components/CustomIcon' import { Spinner } from '@src/components/Spinner' @@ -17,6 +18,7 @@ import { SafeRenderer } from '@src/lib/markdown' import { engineCommandManager } from '@src/lib/singletons' interface LoadingProps extends React.PropsWithChildren { + isDummy?: boolean className?: string dataTestId?: string } @@ -29,7 +31,49 @@ const markedOptions: MarkedOptions = { escape, } -const Loading = ({ children, className, dataTestId }: LoadingProps) => { +// This exists here and not in engineConnection because we want some styling +// available to us. +export const CONNECTION_ERROR_CALL_TO_ACTION_TEXT: Record< + ConnectionError, + ReactNode +> = { + [ConnectionError.Unset]: '', + [ConnectionError.LongLoadingTime]: + 'Loading is taking longer than expected, check your network connection.', + [ConnectionError.VeryLongLoadingTime]: + 'Check the connection is being blocked by a firewall, or if your internet is disconnected.', + [ConnectionError.ICENegotiate]: + 'The modeling session was created, but there is an issue connecting to the stream.', + [ConnectionError.DataChannelError]: + 'A modeling session was created, but there was an issue creating a modeling commands channel.', + [ConnectionError.WebSocketError]: + "An unexpected issue regarding the connection to Zoo's KittyCAD API happened. We suggest re-opening Zoo Design Studio to try again.", + [ConnectionError.LocalDescriptionInvalid]: + 'The modeling session was created, but there is an issue connecting to the stream.', + [ConnectionError.MissingAuthToken]: + 'Your authorization token is missing; please login again.', + [ConnectionError.BadAuthToken]: + 'Your authorization token is invalid; please login again.', + [ConnectionError.TooManyConnections]: + 'There are too many open engine connections associated with your account. Please close web browser windows and tabs with app.zoo.dev open, and close multiple Zoo Design Studio windows.', + [ConnectionError.Outage]: ( + <> + We seem to be experiencing an outage. Please visit{' '} + status.zoo.dev for updates. + + ), + [ConnectionError.PeerConnectionRemoteDisconnected]: + 'The remote end has disconnected. Zoo Design Studio will reconnect you.', + [ConnectionError.Unknown]: + 'An unexpected error occurred. Please report this to us.', +} + +const Loading = ({ + isDummy, + children, + className, + dataTestId, +}: LoadingProps) => { const [error, setError] = useState({ error: ConnectionError.Unset, }) @@ -109,6 +153,20 @@ const Loading = ({ children, className, dataTestId }: LoadingProps) => { } }, [error, setError, isUnrecoverableError]) + // Useful for particular cases where we want a loading spinner but no other + // logic, such as when the feature tree is being built. + if (isDummy) { + return ( +
+ +

{children}

+
+ ) + } + return (
) diff --git a/src/components/ModelingMachineProvider.tsx b/src/components/ModelingMachineProvider.tsx index 8692e7167..41a1a377d 100644 --- a/src/components/ModelingMachineProvider.tsx +++ b/src/components/ModelingMachineProvider.tsx @@ -104,6 +104,7 @@ import { applyConstraintIntersect } from '@src/components/Toolbar/Intersect' import { applyConstraintAbsDistance } from '@src/components/Toolbar/SetAbsDistance' import type { SidebarType } from '@src/components/ModelingSidebar/ModelingPanes' import { useNetworkContext } from '@src/hooks/useNetworkContext' +import { resetCameraPosition } from '@src/lib/resetCameraPosition' export const ModelingMachineContext = createContext( {} as { @@ -1517,6 +1518,9 @@ export const ModelingMachineProvider = ({ useHotkeys(['mod + alt + c'], () => { modelingSend({ type: 'Center camera on selection' }) }) + useHotkeys(['mod + alt + x'], () => { + resetCameraPosition().catch(reportRejection) + }) useModelingMachineCommands({ machineId: 'modeling', diff --git a/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx b/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx index e5fe8abb8..bb64449f4 100644 --- a/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx +++ b/src/components/ModelingSidebar/ModelingPanes/FeatureTreePane.tsx @@ -21,6 +21,7 @@ import { filterOperations, getOperationIcon, getOperationLabel, + getOperationVariableName, stdLibMap, } from '@src/lib/operations' import { editorManager, kclManager, rustContext } from '@src/lib/singletons' @@ -154,7 +155,9 @@ export const FeatureTreePane = () => { className="absolute inset-0 p-1 box-border overflow-auto" > {kclManager.isExecuting ? ( - Building feature tree... + + Building feature tree... + ) : ( <> {!modelingState.matches('Sketch') && } @@ -236,6 +239,7 @@ const VisibilityToggle = (props: VisibilityToggleProps) => { const OperationItemWrapper = ({ icon, name, + variableName, visibilityToggle, menuItems, errors, @@ -246,6 +250,7 @@ const OperationItemWrapper = ({ }: React.HTMLAttributes & { icon: CustomIconName name: string + variableName?: string visibilityToggle?: VisibilityToggleProps customSuffix?: JSX.Element menuItems?: ComponentProps['items'] @@ -264,8 +269,15 @@ const OperationItemWrapper = ({ className={`reset flex-1 flex items-center gap-2 text-left text-base ${selectable ? 'border-transparent dark:border-transparent' : 'border-none cursor-default'} ${className}`} > -
-
{name}
+
+
+ {name} + {variableName && ( + + {variableName} + + )} +
{customSuffix && customSuffix}
@@ -290,6 +302,11 @@ const OperationItem = (props: { }) => { const kclContext = useKclContext() const name = getOperationLabel(props.item) + + const variableName = useMemo(() => { + return getOperationVariableName(props.item, kclContext.ast) + }, [props.item, kclContext.ast]) + const errors = useMemo(() => { return kclContext.diagnostics.filter( (diag) => @@ -499,6 +516,7 @@ const OperationItem = (props: { = { - [NetworkHealthState.Ok]: 'Connected', - [NetworkHealthState.Weak]: 'Weak', + [NetworkHealthState.Ok]: 'Strong', + [NetworkHealthState.Weak]: 'Ok', [NetworkHealthState.Issue]: 'Problem', [NetworkHealthState.Disconnected]: 'Offline', } @@ -53,8 +53,8 @@ const overallConnectionStateColor: Record = bg: 'bg-succeed-10/30 dark:bg-succeed-80/50', }, [NetworkHealthState.Weak]: { - icon: 'text-warn-80 dark:text-warn-10', - bg: 'bg-warn-10 dark:bg-warn-80/80', + icon: 'text-succeed-50 dark:text-succeed-30', + bg: 'bg-lime-300/70 dark:bg-lime-300/30', }, [NetworkHealthState.Issue]: { icon: 'text-destroy-80 dark:text-destroy-10', diff --git a/src/components/ToastUpdate.tsx b/src/components/ToastUpdate.tsx index 4160ec402..1660d0b52 100644 --- a/src/components/ToastUpdate.tsx +++ b/src/components/ToastUpdate.tsx @@ -44,6 +44,7 @@ export function ToastUpdate({ A new update is available. {!IS_NIGHTLY_OR_DEBUG && ( + {' '} You can view the release notes{' '} Reset view , @@ -50,6 +51,7 @@ export function useViewControlMenuItems() { modelingSend({ type: 'Center camera on selection' }) }} disabled={shouldLockView} + hotkey={`mod+alt+c`} > Center view on selection , diff --git a/src/hooks/useAuthNavigation.tsx b/src/hooks/useAuthNavigation.tsx index 91976081a..4704e124c 100644 --- a/src/hooks/useAuthNavigation.tsx +++ b/src/hooks/useAuthNavigation.tsx @@ -1,8 +1,11 @@ import { useEffect } from 'react' -import { useLocation, useNavigate } from 'react-router-dom' +import { useLocation, useNavigate, useSearchParams } from 'react-router-dom' +import { isDesktop } from '@src/lib/isDesktop' import { PATHS } from '@src/lib/paths' +import { IMMEDIATE_SIGN_IN_IF_NECESSARY_QUERY_PARAM } from '@src/lib/constants' import { useAuthState } from '@src/lib/singletons' +import { generateSignInUrl } from '@src/routes/utils' /** * A simple hook that listens to the auth state of the app and navigates @@ -12,6 +15,10 @@ export function useAuthNavigation() { const navigate = useNavigate() const location = useLocation() const authState = useAuthState() + const [searchParams] = useSearchParams() + const requestingImmediateSignInIfNecessary = searchParams.has( + IMMEDIATE_SIGN_IN_IF_NECESSARY_QUERY_PARAM + ) // Subscribe to the auth state of the app and navigate accordingly. useEffect(() => { @@ -24,6 +31,11 @@ export function useAuthNavigation() { authState.matches('loggedOut') && !location.pathname.includes(PATHS.SIGN_IN) ) { + if (requestingImmediateSignInIfNecessary && !isDesktop()) { + window.location.href = generateSignInUrl() + return + } + navigate(PATHS.SIGN_IN + (location.search || '')) } }, [authState, location.pathname]) diff --git a/src/hooks/useNetworkStatus.tsx b/src/hooks/useNetworkStatus.tsx index 581d3276e..3dcaef1fa 100644 --- a/src/hooks/useNetworkStatus.tsx +++ b/src/hooks/useNetworkStatus.tsx @@ -48,7 +48,8 @@ export function useNetworkStatus() { const [overallState, setOverallState] = useState( NetworkHealthState.Disconnected ) - const [ping, setPing] = useState(undefined) + const [pingRaw, setPingRaw] = useState(undefined) + const [pingEMA, setPingEMA] = useState(undefined) const [hasCopied, setHasCopied] = useState(false) const [error, setError] = useState(undefined) @@ -66,30 +67,69 @@ export function useNetworkStatus() { const [hasIssues, setHasIssues] = useState(undefined) useEffect(() => { - setOverallState( - !internetConnected - ? NetworkHealthState.Disconnected - : hasIssues || hasIssues === undefined - ? NetworkHealthState.Issue - : (ping ?? 0) > 16.6 * 3 // we consider ping longer than 3 frames as weak - ? NetworkHealthState.Weak - : NetworkHealthState.Ok - ) - }, [hasIssues, internetConnected, ping]) + if (immediateState.type === EngineConnectionStateType.Disconnecting) { + // Reset our running average. + setPingRaw(undefined) + setPingEMA(undefined) + } + }, [immediateState]) useEffect(() => { - const onlineCallback = () => { - setInternetConnected(true) + if (!pingRaw) return + + // We use an exponential running average to smooth out ping values. + const pingDataPointsToConsider = 10 + const multiplier = 2 / (pingDataPointsToConsider + 1) + let pingEMANext = ((pingEMA ?? 0) + pingRaw) / 2 + pingEMANext = pingEMANext * multiplier + (pingEMA ?? 0) * (1 - multiplier) + setPingEMA(pingEMANext) + }, [pingRaw]) + + useEffect(() => { + // We consider ping longer than 3 frames as weak + const WEAK_PING = 16.6 * 3 + const OK_PING = 16.6 * 2 + + // A is used in the literature to specify the "window" of switching + const A = 1.25 + + const CENTER = (WEAK_PING + OK_PING) / 2 + const THRESHOLD_GOOD = CENTER / A // Lower bound + const THRESHOLD_WEAK = CENTER * A // Upper bound + + let nextOverallState = overallState + + if (!internetConnected) { + nextOverallState = NetworkHealthState.Disconnected + } else if (hasIssues || hasIssues === undefined) { + nextOverallState = NetworkHealthState.Issue + } else if (pingEMA && pingEMA < THRESHOLD_GOOD) { + nextOverallState = NetworkHealthState.Ok + } else if (pingEMA && pingEMA > THRESHOLD_WEAK) { + nextOverallState = NetworkHealthState.Weak + } else { + nextOverallState = NetworkHealthState.Ok } + + if (nextOverallState === overallState) return + + setOverallState(nextOverallState) + }, [hasIssues, internetConnected, pingEMA, overallState]) + + useEffect(() => { const offlineCallback = () => { setInternetConnected(false) setSteps(structuredClone(initialConnectingTypeGroupState)) } - window.addEventListener('online', onlineCallback) - window.addEventListener('offline', offlineCallback) + engineCommandManager.addEventListener( + EngineCommandManagerEvents.Offline, + offlineCallback + ) return () => { - window.removeEventListener('online', onlineCallback) - window.removeEventListener('offline', offlineCallback) + engineCommandManager.removeEventListener( + EngineCommandManagerEvents.Offline, + offlineCallback + ) } }, []) @@ -126,7 +166,7 @@ export function useNetworkStatus() { useEffect(() => { const onPingPongChange = ({ detail: state }: CustomEvent) => { - setPing(state) + setPingRaw(state) } const onConnectionStateChange = ({ @@ -139,6 +179,8 @@ export function useNetworkStatus() { if ( engineConnectionState.type === EngineConnectionStateType.Connecting ) { + setInternetConnected(true) + const groups = Object.values(nextSteps) for (let group of groups) { for (let step of group) { @@ -168,6 +210,10 @@ export function useNetworkStatus() { if (engineConnectionState.value.type === DisconnectingType.Error) { setError(engineConnectionState.value.value) + } else if ( + engineConnectionState.value.type === DisconnectingType.Quit + ) { + return structuredClone(initialConnectingTypeGroupState) } } } @@ -231,6 +277,6 @@ export function useNetworkStatus() { error, setHasCopied, hasCopied, - ping, + ping: pingEMA !== undefined ? Math.trunc(pingEMA) : pingEMA, } } diff --git a/src/hooks/useQueryParamEffects.ts b/src/hooks/useQueryParamEffects.ts index 1f6d22a9b..5f9523b3f 100644 --- a/src/hooks/useQueryParamEffects.ts +++ b/src/hooks/useQueryParamEffects.ts @@ -4,6 +4,7 @@ import { useSearchParams } from 'react-router-dom' import { base64ToString } from '@src/lib/base64' import type { ProjectsCommandSchema } from '@src/lib/commandBarConfigs/projectsCommandConfig' import { + ASK_TO_OPEN_QUERY_PARAM, CMD_GROUP_QUERY_PARAM, CMD_NAME_QUERY_PARAM, CREATE_FILE_URL_PARAM, @@ -36,8 +37,15 @@ export type CreateFileSchemaMethodOptional = Omit< export function useQueryParamEffects() { const authState = useAuthState() const [searchParams, setSearchParams] = useSearchParams() - const shouldInvokeCreateFile = searchParams.has(CREATE_FILE_URL_PARAM) + const hasAskToOpen = !isDesktop() && searchParams.has(ASK_TO_OPEN_QUERY_PARAM) + // Let hasAskToOpen be handled by the OpenInDesktopAppHandler component first to avoid racing with it, + // only deal with other params after user decided to open in desktop or web. + // Without this the "Zoom to fit to shared model on web" test fails, although manually testing works due + // to different timings. + const shouldInvokeCreateFile = + !hasAskToOpen && searchParams.has(CREATE_FILE_URL_PARAM) const shouldInvokeGenericCmd = + !hasAskToOpen && searchParams.has(CMD_NAME_QUERY_PARAM) && searchParams.has(CMD_GROUP_QUERY_PARAM) diff --git a/src/lang/langHelpers.ts b/src/lang/langHelpers.ts index 8f844424a..06e1201d3 100644 --- a/src/lang/langHelpers.ts +++ b/src/lang/langHelpers.ts @@ -24,6 +24,7 @@ export type ToolTip = | 'yLineTo' | 'angledLineThatIntersects' | 'tangentialArc' + | 'tangentialArcTo' | 'circle' | 'circleThreePoint' | 'arcTo' @@ -44,6 +45,7 @@ export const toolTips: Array = [ 'yLineTo', 'angledLineThatIntersects', 'tangentialArc', + 'tangentialArcTo', 'circleThreePoint', 'arc', 'arcTo', diff --git a/src/lang/modifyAst.test.ts b/src/lang/modifyAst.test.ts index b0168ca82..f65d4c6ed 100644 --- a/src/lang/modifyAst.test.ts +++ b/src/lang/modifyAst.test.ts @@ -16,7 +16,6 @@ import { addSketchTo, deleteSegmentFromPipeExpression, moveValueIntoNewVariable, - removeSingleConstraintInfo, sketchOnExtrudedFace, splitPipedProfile, } from '@src/lang/modifyAst' @@ -24,11 +23,6 @@ import { findUsesOfTagInPipe } from '@src/lang/queryAst' import { getNodePathFromSourceRange } from '@src/lang/queryAstNodePathUtils' import type { Artifact } from '@src/lang/std/artifactGraph' import { codeRefFromRange } from '@src/lang/std/artifactGraph' -import type { - InputArg, - InputArgKeys, - SimplifiedArgDetails, -} from '@src/lang/std/stdTypes' import { topLevelRange } from '@src/lang/util' import type { Identifier, Literal, LiteralValue } from '@src/lang/wasm' import { assertParse, recast } from '@src/lang/wasm' @@ -666,189 +660,6 @@ ${!replace1 ? ` |> ${line}\n` : ''} |> angledLine(angle = -65, length = ${ }) }) -describe('Testing removeSingleConstraintInfo', () => { - describe('with mostly object notation', () => { - const code = `part001 = startSketchOn(-XZ) - |> startProfile(at = [0, 0]) - |> line(end = [3 + 0, 4 + 0]) - |> /*0*/ angledLine(angle = 3 + 0, length = 3.14 + 0) - |> line(endAbsolute = [6.14 + 0, 3.14 + 0]) - |> xLine(/*xAbs*/ endAbsolute = 8 + 0) - |> yLine(/*yAbs*/ endAbsolute = 5 + 0) - |> yLine(/*yRel*/ length = 3.14 + 0, tag = $a) - |> xLine(/*xRel*/ length = 3.14 + 0) - |> /*1*/ angledLine(angle = 3 + 0, lengthX = 3.14 + 0) - |> /*2*/ angledLine(angle = 30 + 0, lengthY = 3 + 0) - |> /*3*/ angledLine(angle = 12.14 + 0, endAbsoluteX = 12 + 0) - |> /*4*/ angledLine(angle = 30 + 0, endAbsoluteY = 10.14 + 0) - |> angledLineThatIntersects(angle = 3.14 + 0, intersectTag = a, offset = 0 + 0) - |> tangentialArc(endAbsolute = [3.14 + 0, 13.14 + 0])` - const cases: [string, InputArg['type'], number | string, string][] = [ - [' line(end = [3 + 0, 4])', 'arrayItem', 1, ''], - [ - '/*0*/ angledLine(angle = 3, length = 3.14 + 0)', - 'labeledArg', - 'angle', - '', - ], - ['line(endAbsolute = [6.14 + 0, 3.14 + 0])', 'arrayItem', 0, ''], - ['xLine(endAbsolute = 8)', 'singleValue', '', '/*xAbs*/'], - ['yLine(endAbsolute = 5)', 'singleValue', '', '/*yAbs*/'], - ['yLine(length = 3.14, tag = $a)', 'singleValue', '', '/*yRel*/'], - ['xLine(length = 3.14)', 'singleValue', '', '/*xRel*/'], - [ - '/*1*/ angledLine(angle = 3, lengthX = 3.14 + 0)', - 'labeledArg', - 'angle', - '', - ], - [ - '/*2*/ angledLine(angle = 30 + 0, lengthY = 3)', - 'labeledArg', - 'length', - '', - ], - [ - '/*3*/ angledLine(angle = 12.14 + 0, endAbsoluteX = 12)', - 'labeledArg', - 'endAbsoluteX', - '', - ], - [ - '/*4*/ angledLine(angle = 30, endAbsoluteY = 10.14 + 0)', - 'labeledArg', - 'angle', - '', - ], - [ - `angledLineThatIntersects(angle = 3.14 + 0, intersectTag = a, offset = 0)`, - 'labeledArg', - 'offset', - '', - ], - [ - 'tangentialArc(endAbsolute = [3.14 + 0, 13.14])', - 'labeledArgArrayItem', - 'endAbsolute', - '', - ], - ] - test.each(cases)( - 'stdlib fn: %s', - async (expectedFinish, key, value, commentLabel) => { - const ast = assertParse(code) - - const execState = await enginelessExecutor(ast) - const lineOfInterest = - commentLabel.length > 0 - ? expectedFinish.split(commentLabel)[0] - : expectedFinish.split('(')[0] + '(' - const start = code.indexOf(lineOfInterest) - const range = topLevelRange(start + 1, start + lineOfInterest.length) - const pathToNode = getNodePathFromSourceRange(ast, range) - let argPosition: SimplifiedArgDetails - if (key === 'arrayItem' && typeof value === 'number') { - argPosition = { - type: 'arrayItem', - index: value === 0 ? 0 : 1, - } - } else if (key === 'singleValue') { - argPosition = { - type: 'singleValue', - } - } else if (key === 'labeledArg' && typeof value === 'string') { - argPosition = { - type: 'labeledArg', - key: value as any, - } - } else if (key === 'labeledArgArrayItem') { - argPosition = { - type: 'labeledArgArrayItem', - key: value as any, - index: 1, - } - } else { - throw new Error('argPosition is undefined') - } - const mod = removeSingleConstraintInfo( - pathToNode, - argPosition, - ast, - execState.variables - ) - if (!mod) return new Error('mod is undefined') - const recastCode = recast(mod.modifiedAst) - expect(recastCode).toContain(expectedFinish) - } - ) - }) - describe('with array notation', () => { - const code = `part001 = startSketchOn(-XZ) - |> startProfile(at = [0, 0]) - |> /*0*/ angledLine(angle = 3.14 + 0, length = 3.14 + 0) - |> /*1*/ angledLine(angle = 3 + 0, lengthX = 3.14 + 0) - |> /*2*/ angledLine(angle = 30 + 0, lengthY = 3 + 0) - |> /*3*/ angledLine(angle = 12.14 + 0, endAbsoluteX = 12 + 0) - |> /*4*/ angledLine(angle = 30 + 0, endAbsoluteY = 10.14 + 0)` - const ang: InputArgKeys = 'angle' - test.each([ - ['/*0*/ angledLine(angle = 3, length = 3.14 + 0)', 'labeledArg', ang], - [ - '/*1*/ angledLine(angle = 3, lengthX = 3.14 + 0)', - 'labeledArg', - 'angle', - ], - [ - '/*2*/ angledLine(angle = 30 + 0, lengthY = 3)', - 'labeledArg', - 'lengthY', - ], - [ - '/*3*/ angledLine(angle = 12.14 + 0, endAbsoluteX = 12)', - 'labeledArg', - 'endAbsoluteX', - ], - [ - '/*4*/ angledLine(angle = 30, endAbsoluteY = 10.14 + 0)', - 'labeledArg', - 'angle', - ], - ])('stdlib fn: %s', async (expectedFinish, key, value) => { - const ast = assertParse(code) - - const execState = await enginelessExecutor(ast) - const lineOfInterest = expectedFinish.split('(')[0] + '(' - const start = code.indexOf(lineOfInterest) - expect(start).toBeGreaterThanOrEqual(0) - const range = topLevelRange(start + 1, start + lineOfInterest.length) - let argPosition: SimplifiedArgDetails - if (key === 'arrayIndex' && typeof value === 'number') { - argPosition = { - type: 'arrayItem', - index: value === 0 ? 0 : 1, - } - } else if (key === 'labeledArg') { - argPosition = { - type: 'labeledArg', - key: value as InputArgKeys, - } - } else { - throw new Error('argPosition is undefined') - } - const pathToNode = getNodePathFromSourceRange(ast, range) - const mod = removeSingleConstraintInfo( - pathToNode, - argPosition, - ast, - execState.variables - ) - if (!mod) return new Error('mod is undefined') - const recastCode = recast(mod.modifiedAst) - expect(recastCode).toContain(expectedFinish) - }) - }) -}) - describe('Testing deleteFromSelection', () => { const cases = [ [ diff --git a/src/lang/modifyAst/addSweep.ts b/src/lang/modifyAst/addSweep.ts index 9c19ac549..386d135a5 100644 --- a/src/lang/modifyAst/addSweep.ts +++ b/src/lang/modifyAst/addSweep.ts @@ -136,14 +136,10 @@ export function addSweep({ return sketchesExprList } - // Extra roundabout to find the trajectory (or path) declaration for the labeled argument - const pathNodePath = getNodePathFromSourceRange( - ast, - path.graphSelections[0].codeRef.range - ) + // Find the path declaration for the labeled argument const pathDeclaration = getNodeFromPath( ast, - pathNodePath, + path.graphSelections[0].codeRef.pathToNode, 'VariableDeclaration' ) if (err(pathDeclaration)) { diff --git a/src/lang/queryAst.ts b/src/lang/queryAst.ts index 3a2dea259..d89d7b1c8 100644 --- a/src/lang/queryAst.ts +++ b/src/lang/queryAst.ts @@ -1045,10 +1045,9 @@ export function getSketchExprsFromSelection( nodeToEdit?: PathToNode ): Error | Expr[] { const sketches: Expr[] = selection.graphSelections.flatMap((s) => { - const path = getNodePathFromSourceRange(ast, s?.codeRef.range) const sketchVariable = getNodeFromPath( ast, - path, + s?.codeRef.pathToNode, 'VariableDeclarator' ) if (err(sketchVariable)) { diff --git a/src/lang/std/engineConnection.ts b/src/lang/std/engineConnection.ts index df07c02aa..761a27c9d 100644 --- a/src/lang/std/engineConnection.ts +++ b/src/lang/std/engineConnection.ts @@ -1,4 +1,3 @@ -import { TEST } from '@src/env' import type { Models } from '@kittycad/lib' import { VITE_KC_API_WS_MODELING_URL, VITE_KC_DEV_TOKEN } from '@src/env' import { jsAppSettings } from '@src/lib/settings/settingsUtils' @@ -83,6 +82,9 @@ export enum ConnectionError { TooManyConnections, Outage, + // Observed to happen on a local network outage. + PeerConnectionRemoteDisconnected, + // An unknown error is the most severe because it has not been classified // or encountered before. Unknown, @@ -93,22 +95,18 @@ export const CONNECTION_ERROR_TEXT: Record = { [ConnectionError.LongLoadingTime]: 'Loading is taking longer than expected...', [ConnectionError.VeryLongLoadingTime]: - 'Loading seems stuck. Do you have a firewall turned on?', + "It's possible there's a connection issue.", [ConnectionError.ICENegotiate]: 'ICE negotiation failed.', - [ConnectionError.DataChannelError]: 'The data channel signaled an error.', - [ConnectionError.WebSocketError]: 'The websocket signaled an error.', - [ConnectionError.LocalDescriptionInvalid]: - 'The local description is invalid.', - [ConnectionError.MissingAuthToken]: - 'Your authorization token is missing; please login again.', - [ConnectionError.BadAuthToken]: - 'Your authorization token is invalid; please login again.', - [ConnectionError.TooManyConnections]: - 'There are too many open engine connections associated with your account.', - [ConnectionError.Outage]: - 'We seem to be experiencing an outage. Please visit [status.zoo.dev](https://status.zoo.dev) for updates.', - [ConnectionError.Unknown]: - 'An unexpected error occurred. Please report this to us.', + [ConnectionError.DataChannelError]: 'Data channel error.', + [ConnectionError.WebSocketError]: 'Websocket error.', + [ConnectionError.LocalDescriptionInvalid]: 'Local description invalid', + [ConnectionError.MissingAuthToken]: 'Missing authorization token', + [ConnectionError.BadAuthToken]: 'Bad authorization token', + [ConnectionError.TooManyConnections]: 'Too many connections', + [ConnectionError.Outage]: 'Outage', + [ConnectionError.PeerConnectionRemoteDisconnected]: + 'Peer connection disconnected', + [ConnectionError.Unknown]: 'Unknown', } export const WEBSOCKET_READYSTATE_TEXT: Record = { @@ -226,6 +224,9 @@ export enum EngineConnectionEvents { Opened = 'opened', // (engineConnection: EngineConnection) => void Closed = 'closed', // (engineConnection: EngineConnection) => void NewTrack = 'new-track', // (track: NewTrackArgs) => void + + // A general offline state. + Offline = 'offline', } function toRTCSessionDescriptionInit( @@ -669,14 +670,28 @@ class EngineConnection extends EventTarget { }, }, } + this.dispatchEvent( + new CustomEvent(EngineConnectionEvents.Offline, {}) + ) this.disconnectAll() break // The remote end broke up with us! :( case 'disconnected': + this.state = { + type: EngineConnectionStateType.Disconnecting, + value: { + type: DisconnectingType.Error, + value: { + error: ConnectionError.PeerConnectionRemoteDisconnected, + context: event, + }, + }, + } this.dispatchEvent( - new CustomEvent(EngineConnectionEvents.RestartRequest, {}) + new CustomEvent(EngineConnectionEvents.Offline, {}) ) + this.disconnectAll() break case 'closed': this.pc?.removeEventListener('icecandidate', this.onIceCandidate) @@ -847,7 +862,6 @@ class EngineConnection extends EventTarget { 'message', this.onDataChannelMessage ) - this.disconnectAll() } this.unreliableDataChannel?.addEventListener( @@ -866,7 +880,6 @@ class EngineConnection extends EventTarget { }, }, } - this.disconnectAll() } this.unreliableDataChannel?.addEventListener( 'error', @@ -956,6 +969,9 @@ class EngineConnection extends EventTarget { this.onNetworkStatusReady ) + this.dispatchEvent( + new CustomEvent(EngineConnectionEvents.Offline, {}) + ) this.disconnectAll() } this.websocket.addEventListener('close', this.onWebSocketClose) @@ -974,8 +990,6 @@ class EngineConnection extends EventTarget { }, } } - - this.disconnectAll() } this.websocket.addEventListener('error', this.onWebSocketError) @@ -1331,6 +1345,9 @@ export enum EngineCommandManagerEvents { // the whole scene is ready (settings loaded) SceneReady = 'scene-ready', + + // we're offline + Offline = 'offline', } /** @@ -1380,6 +1397,7 @@ export class EngineCommandManager extends EventTarget { * This is compared to the {@link outSequence} number to determine if we should ignore * any out-of-order late responses in the unreliable channel. */ + keepForcefulOffline = false inSequence = 1 engineConnection?: EngineConnection commandLogs: CommandLog[] = [] @@ -1453,13 +1471,8 @@ export class EngineCommandManager extends EventTarget { ) } - private onOffline = () => { - console.log('Browser reported network is offline') - if (TEST) { - console.warn('DURING TESTS ENGINECONNECTION.ONOFFLINE WILL DO NOTHING.') - return - } - this.onEngineConnectionRestartRequest() + private onEngineOffline = () => { + this.dispatchEvent(new CustomEvent(EngineCommandManagerEvents.Offline, {})) } idleMode: boolean = false @@ -1494,6 +1507,11 @@ export class EngineCommandManager extends EventTarget { if (settings) { this.settings = settings } + + if (this.keepForcefulOffline) { + return + } + if (width === 0 || height === 0) { return } @@ -1509,8 +1527,6 @@ export class EngineCommandManager extends EventTarget { return } - window.addEventListener('offline', this.onOffline) - let additionalSettings = this.settings.enableSSAO ? '&post_effect=ssao' : '' additionalSettings += '&show_grid=' + (this.settings.showScaleGrid ? 'true' : 'false') @@ -1537,6 +1553,11 @@ export class EngineCommandManager extends EventTarget { this.onEngineConnectionRestartRequest as EventListener ) + this.engineConnection.addEventListener( + EngineConnectionEvents.Offline, + this.onEngineOffline as EventListener + ) + // eslint-disable-next-line @typescript-eslint/no-misused-promises this.onEngineConnectionOpened = async () => { console.log('onEngineConnectionOpened') @@ -1548,13 +1569,8 @@ export class EngineCommandManager extends EventTarget { this.codeManager?.currentFilePath || undefined ) } catch (e) { - // If this happens shit's actually gone south aka the websocket closed. - // Let's restart. - console.warn("shit's gone south") - console.warn(e) - this.engineConnection?.dispatchEvent( - new CustomEvent(EngineConnectionEvents.RestartRequest, {}) - ) + // If this happens, the websocket may have closed and we need to restart + console.warn('unknown error:', e) return } @@ -1597,23 +1613,7 @@ export class EngineCommandManager extends EventTarget { console.log('camControlsCameraChange') this._camControlsCameraChange() - // We should eventually only have 1 restoral call. - if (this.idleMode) { - await this.sceneInfra?.camControls.restoreRemoteCameraStateAndTriggerSync() - } else { - // NOTE: This code is old. It uses the old hack to restore camera. - console.log('call default_camera_get_settings') - // eslint-disable-next-line @typescript-eslint/no-floating-promises - await this.sendSceneCommand({ - // CameraControls subscribes to default_camera_get_settings response events - // firing this at connection ensure the camera's are synced initially - type: 'modeling_cmd_req', - cmd_id: uuidv4(), - cmd: { - type: 'default_camera_get_settings', - }, - }) - } + await this.sceneInfra?.camControls.restoreRemoteCameraStateAndTriggerSync() setIsStreamReady(true) @@ -1877,8 +1877,6 @@ export class EngineCommandManager extends EventTarget { tearDown(opts?: { idleMode: boolean }) { this.idleMode = opts?.idleMode ?? false - window.removeEventListener('offline', this.onOffline) - if (this.engineConnection) { for (const [cmdId, pending] of Object.entries(this.pendingCommands)) { pending.reject([ @@ -1928,7 +1926,26 @@ export class EngineCommandManager extends EventTarget { this.engineCommandManager.engineConnection = null } this.engineConnection = undefined + + // It is possible all connections never even started, but we still want + // to signal to the whole application we are "offline". + this.dispatchEvent(new CustomEvent(EngineCommandManagerEvents.Offline, {})) } + + offline() { + this.keepForcefulOffline = true + this.tearDown() + console.log('offline') + } + + online() { + this.keepForcefulOffline = false + this.dispatchEvent( + new CustomEvent(EngineCommandManagerEvents.EngineRestartRequest, {}) + ) + console.log('online') + } + async startNewSession() { this.responseMap = {} } diff --git a/src/lang/std/sketch.test.ts b/src/lang/std/sketch.test.ts index 9ee5fe42c..41376af72 100644 --- a/src/lang/std/sketch.test.ts +++ b/src/lang/std/sketch.test.ts @@ -245,6 +245,38 @@ ${insertCode} }) describe('testing getConstraintInfo', () => { + describe('when user edits KCL to be invalid', () => { + const code = `part001 = startSketchOn(XZ) + |> startProfile(at = [0,]) // Missing y coordinate + |> line(end = [3, 4])` + test.each([ + [ + 'startProfile', + [ + // No constraints + ], + ], + ])('testing %s when inputs are unconstrained', (functionName, expected) => { + const ast = assertParse(code) + const match = new RegExp(functionName).exec(code) + expect(match).toBeTruthy() + if (match === null) { + return + } + const start = code.indexOf(match[0]) + expect(start).toBeGreaterThanOrEqual(0) + const sourceRange = topLevelRange(start, start + functionName.length) + if (err(ast)) return ast + const pathToNode = getNodePathFromSourceRange(ast, sourceRange) + const callExp = getNodeFromPath>(ast, pathToNode, [ + 'CallExpressionKw', + ]) + if (err(callExp)) return callExp + const result = getConstraintInfoKw(callExp.node, code, pathToNode) + expect(result).toEqual(expected) + }) + }) + describe('object notation', () => { const code = `part001 = startSketchOn(-XZ) |> startProfile(at = [0,0]) @@ -320,7 +352,11 @@ describe('testing getConstraintInfo', () => { isConstrained: false, value: '6.14', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'arrayItem', index: 0 }, + argPosition: { + type: 'labeledArgArrayItem', + key: 'endAbsolute', + index: 0, + }, pathToNode: expect.any(Array), stdLibFnName: 'line', }, @@ -329,7 +365,11 @@ describe('testing getConstraintInfo', () => { isConstrained: false, value: '3.14', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'arrayItem', index: 1 }, + argPosition: { + type: 'labeledArgArrayItem', + key: 'endAbsolute', + index: 1, + }, pathToNode: expect.any(Array), stdLibFnName: 'line', }, @@ -352,7 +392,7 @@ describe('testing getConstraintInfo', () => { isConstrained: false, value: '8', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'singleValue' }, + argPosition: { type: 'labeledArg', key: 'endAbsolute' }, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', }, @@ -375,7 +415,7 @@ describe('testing getConstraintInfo', () => { isConstrained: false, value: '5', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'singleValue' }, + argPosition: { type: 'labeledArg', key: 'endAbsolute' }, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', }, @@ -437,7 +477,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'labeledArg', key: 'angle' }, pathToNode: expect.any(Array), - stdLibFnName: 'angledLineOfXLength', + stdLibFnName: 'angledLine', }, { type: 'xRelative', @@ -446,7 +486,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'labeledArg', key: 'lengthX' }, pathToNode: expect.any(Array), - stdLibFnName: 'angledLineOfXLength', + stdLibFnName: 'angledLine', }, ], ], @@ -668,7 +708,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'labeledArg', key: 'angle' }, pathToNode: expect.any(Array), - stdLibFnName: 'angledLineOfXLength', + stdLibFnName: 'angledLine', }, { type: 'xRelative', @@ -677,7 +717,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'labeledArg', key: 'lengthX' }, pathToNode: expect.any(Array), - stdLibFnName: 'angledLineOfXLength', + stdLibFnName: 'angledLine', }, ], ], @@ -845,7 +885,11 @@ describe('testing getConstraintInfo', () => { isConstrained: true, value: '6.14 + 0', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'arrayItem', index: 0 }, + argPosition: { + type: 'labeledArgArrayItem', + key: 'endAbsolute', + index: 0, + }, pathToNode: expect.any(Array), stdLibFnName: 'line', }, @@ -854,7 +898,11 @@ describe('testing getConstraintInfo', () => { isConstrained: true, value: '3.14 + 0', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'arrayItem', index: 1 }, + argPosition: { + type: 'labeledArgArrayItem', + key: 'endAbsolute', + index: 1, + }, pathToNode: expect.any(Array), stdLibFnName: 'line', }, @@ -877,7 +925,7 @@ describe('testing getConstraintInfo', () => { isConstrained: true, value: '8 + 0', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'singleValue' }, + argPosition: { type: 'labeledArg', key: 'endAbsolute' }, pathToNode: expect.any(Array), stdLibFnName: 'xLineTo', }, @@ -900,7 +948,7 @@ describe('testing getConstraintInfo', () => { isConstrained: true, value: '5 + 0', sourceRange: [expect.any(Number), expect.any(Number), 0], - argPosition: { type: 'singleValue' }, + argPosition: { type: 'labeledArg', key: 'endAbsolute' }, pathToNode: expect.any(Array), stdLibFnName: 'yLineTo', }, @@ -962,7 +1010,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'labeledArg', key: 'angle' }, pathToNode: expect.any(Array), - stdLibFnName: 'angledLineOfXLength', + stdLibFnName: 'angledLine', }, { type: 'xRelative', @@ -971,7 +1019,7 @@ describe('testing getConstraintInfo', () => { sourceRange: [expect.any(Number), expect.any(Number), 0], argPosition: { type: 'labeledArg', key: 'lengthX' }, pathToNode: expect.any(Array), - stdLibFnName: 'angledLineOfXLength', + stdLibFnName: 'angledLine', }, ], ], diff --git a/src/lang/std/sketch.ts b/src/lang/std/sketch.ts index f03241153..c7c4b3cce 100644 --- a/src/lang/std/sketch.ts +++ b/src/lang/std/sketch.ts @@ -86,9 +86,8 @@ import { err } from '@src/lib/trap' import { allLabels, getAngle, getLength, roundOff } from '@src/lib/utils' import type { EdgeCutInfo } from '@src/machines/modelingMachine' -const STRAIGHT_SEGMENT_ERR = new Error( - 'Invalid input, expected "straight-segment"' -) +const STRAIGHT_SEGMENT_ERR = () => + new Error('Invalid input, expected "straight-segment"') const ARC_SEGMENT_ERR = () => new Error('Invalid input, expected "arc-segment"') const CIRCLE_THREE_POINT_SEGMENT_ERR = new Error( 'Invalid input, expected "circle-three-point-segment"' @@ -134,7 +133,9 @@ const constrainInfo = ( ? { type: 'objectProperty', key: g } : g?.type === 'labeledArg' ? g - : undefined + : g?.type === 'labeledArgArrayItem' + ? g + : undefined return { type: a, @@ -365,7 +366,7 @@ const horzVertConstraintInfoHelper = ( if (argIndex === undefined) { return [] } - const firstArg = callExp.arguments?.[argIndex].arg + const mainArg = callExp.arguments?.[argIndex].arg const callee = callExp.callee const pathToFirstArg: PathToNode = [ ...pathToNode, @@ -389,11 +390,11 @@ const horzVertConstraintInfoHelper = ( ), constrainInfo( inputConstrainTypes[1], - isNotLiteralArrayOrStatic(firstArg), - code.slice(firstArg.start, firstArg.end), + isNotLiteralArrayOrStatic(mainArg), + code.slice(mainArg.start, mainArg.end), stdLibFnName, abbreviatedInput, - topLevelRange(firstArg.start, firstArg.end), + topLevelRange(mainArg.start, mainArg.end), pathToFirstArg ), ] @@ -420,7 +421,7 @@ export const line: SketchLineHelperKw = { replaceExistingCallback, spliceBetween, }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const nodeMeta = getNodeFromPath( @@ -520,7 +521,7 @@ export const line: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -559,7 +560,7 @@ export const lineTo: SketchLineHelperKw = { replaceExistingCallback, spliceBetween, }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const to = segmentInput.to const _node = structuredClone(node) const nodeMeta = getNodeFromPath( @@ -618,15 +619,17 @@ export const lineTo: SketchLineHelperKw = { const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const result = replaceExistingCallback([ { - type: 'arrayItem', + type: 'labeledArgArrayItem', + key: ARG_END_ABSOLUTE, index: 0, - argType: 'xRelative', + argType: 'xAbsolute', expr: newXVal, }, { - type: 'arrayItem', + type: 'labeledArgArrayItem', + key: ARG_END_ABSOLUTE, index: 1, - argType: 'yRelative', + argType: 'yAbsolute', expr: newYVal, }, ]) @@ -669,7 +672,7 @@ export const lineTo: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -689,19 +692,58 @@ export const lineTo: SketchLineHelperKw = { }, getTag: getTagKwArg(), addTag: addTagKw(), - getConstraintInfo: (callExp, ...args) => - commonConstraintInfoHelper( - callExp, - ['xAbsolute', 'yAbsolute'], - 'line', - [{ arrayInput: 0 }, { arrayInput: 1 }], - ...args - ), + + getConstraintInfo: (callExp, code, pathToNode) => { + const endAbsoluteArg = findKwArgWithIndex(ARG_END_ABSOLUTE, callExp) + if (endAbsoluteArg === undefined) { + return [] + } + const { expr, argIndex } = endAbsoluteArg + const constraints: ConstrainInfo[] = [] + if (!(expr.type === 'ArrayExpression' && expr.elements.length === 2)) { + return [] + } + const pipeExpressionIndex = pathToNode.findIndex( + ([_, nodeName]) => nodeName === 'PipeExpression' + ) + const pathToArg: PathToNode = [ + ...pathToNode.slice(0, pipeExpressionIndex + 2), + ['arguments', 'CallExpressionKw'], + [argIndex, ARG_INDEX_FIELD], + ['arg', LABELED_ARG_FIELD], + ['elements', 'ArrayExpression'], + ] + const pathToXArg: PathToNode = [...pathToArg, [0, 'index']] + const pathToYArg: PathToNode = [...pathToArg, [1, 'index']] + constraints.push( + constrainInfo( + 'xAbsolute', + isNotLiteralArrayOrStatic(expr.elements[0]), + code.slice(expr.elements[0].start, expr.elements[0].end), + 'line', + { type: 'labeledArgArrayItem', index: 0, key: ARG_END_ABSOLUTE }, + topLevelRange(expr.elements[0].start, expr.elements[0].end), + pathToXArg + ) + ) + constraints.push( + constrainInfo( + 'yAbsolute', + isNotLiteralArrayOrStatic(expr.elements[1]), + code.slice(expr.elements[1].start, expr.elements[1].end), + 'line', + { type: 'labeledArgArrayItem', index: 1, key: ARG_END_ABSOLUTE }, + topLevelRange(expr.elements[1].start, expr.elements[1].end), + pathToYArg + ) + ) + return constraints + }, } export const xLineTo: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = segmentInput const _node = { ...node } const getNode = getNodeFromPathCurry(_node, pathToNode) @@ -714,7 +756,8 @@ export const xLineTo: SketchLineHelperKw = { const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const result = replaceExistingCallback([ { - type: 'singleValue', + type: 'labeledArg', + key: ARG_END_ABSOLUTE, argType: 'xAbsolute', expr: createLiteral(roundOff(to[0], 2)), }, @@ -738,7 +781,7 @@ export const xLineTo: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -759,14 +802,14 @@ export const xLineTo: SketchLineHelperKw = { callExp, ['horizontal', 'xAbsolute'], 'xLineTo', - 'singleValue', + { type: 'labeledArg', key: ARG_END_ABSOLUTE }, ...args ), } export const yLineTo: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = segmentInput const _node = { ...node } const getNode = getNodeFromPathCurry(_node, pathToNode) @@ -780,7 +823,8 @@ export const yLineTo: SketchLineHelperKw = { const { index: callIndex } = splitPathAtPipeExpression(pathToNode) const result = replaceExistingCallback([ { - type: 'singleValue', + type: 'labeledArg', + key: ARG_END_ABSOLUTE, argType: 'yAbsolute', expr: newVal, }, @@ -804,7 +848,7 @@ export const yLineTo: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -825,14 +869,14 @@ export const yLineTo: SketchLineHelperKw = { callExp, ['vertical', 'yAbsolute'], 'yLineTo', - 'singleValue', + { type: 'labeledArg', key: ARG_END_ABSOLUTE }, ...args ), } export const xLine: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = structuredClone(node) const getNode = getNodeFromPathCurry(_node, pathToNode) @@ -876,7 +920,7 @@ export const xLine: SketchLineHelperKw = { return { modifiedAst: _node, pathToNode } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -904,7 +948,7 @@ export const xLine: SketchLineHelperKw = { export const yLine: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = structuredClone(node) const getNode = getNodeFromPathCurry(_node, pathToNode) @@ -946,7 +990,7 @@ export const yLine: SketchLineHelperKw = { return { modifiedAst: _node, pathToNode } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -974,223 +1018,67 @@ export const yLine: SketchLineHelperKw = { export const tangentialArc: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR - const { to } = segmentInput - const _node = { ...node } - const getNode = getNodeFromPathCurry(_node, pathToNode) - const _node1 = getNode('PipeExpression') - if (err(_node1)) return _node1 - const { node: pipe } = _node1 - const _node2 = getNodeFromPath( - _node, + return tangentialArcHelpers.add({ + node, pathToNode, - 'VariableDeclarator' - ) - if (err(_node2)) return _node2 - const { node: varDec } = _node2 - - const toX = createLiteral(roundOff(to[0], 2)) - const toY = createLiteral(roundOff(to[1], 2)) - - if (replaceExistingCallback && pipe.type !== 'CallExpressionKw') { - const { index: callIndex } = splitPathAtPipeExpression(pathToNode) - const result = replaceExistingCallback([ - { - type: 'labeledArgArrayItem', - key: ARG_END_ABSOLUTE, - index: 0, - argType: 'xAbsolute', - expr: toX, - }, - { - type: 'labeledArgArrayItem', - key: ARG_END_ABSOLUTE, - index: 1, - argType: 'yAbsolute', - expr: toY, - }, - ]) - if (err(result)) return result - const { callExp, valueUsedInTransform } = result - pipe.body[callIndex] = callExp - return { - modifiedAst: _node, - pathToNode, - valueUsedInTransform, - } - } - const newLine = createCallExpressionStdLibKw( - 'tangentialArc', - null, // Assumes this is being called in a pipeline, so the first arg is optional and if not given, will become pipeline substitution. - [createLabeledArg(ARG_END_ABSOLUTE, createArrayExpression([toX, toY]))] - ) - if (pipe.type === 'PipeExpression') { - pipe.body = [...pipe.body, newLine] - return { - modifiedAst: _node, - pathToNode: [ - ...pathToNode.slice( - 0, - pathToNode.findIndex(([_, type]) => type === 'PipeExpression') + 1 - ), - ['body', 'PipeExpression'], - [pipe.body.length - 1, 'CallExpressionKw'], - ], - } - } else { - varDec.init = createPipeExpression([varDec.init, newLine]) - } - return { - modifiedAst: _node, - pathToNode, - } + segmentInput, + replaceExistingCallback, + isAbsolute: false, + }) }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR - const { to } = input - const _node = { ...node } - const nodeMeta = getNodeFromPath(_node, pathToNode) - if (err(nodeMeta)) return nodeMeta - const { node: callExpression } = nodeMeta - - if (callExpression.type !== 'CallExpressionKw') { - return new Error( - `Expected CallExpressionKw, but found ${callExpression.type}` - ) - } - - for (const arg of callExpression.arguments) { - if (arg.label?.name !== ARG_END_ABSOLUTE && arg.label?.name !== ARG_TAG) { - console.debug( - 'Trying to edit unsupported tangentialArc keyword arguments; skipping' - ) - return { - modifiedAst: _node, - pathToNode, - } - } - } - - const toArrExp = createArrayExpression([ - createLiteral(roundOff(to[0], 2)), - createLiteral(roundOff(to[1], 2)), - ]) - - mutateKwArg(ARG_END_ABSOLUTE, callExpression, toArrExp) - return { - modifiedAst: _node, + return tangentialArcHelpers.update({ + node, pathToNode, - } + input, + isAbsolute: false, + }) }, getTag: getTagKwArg(), addTag: addTagKw(), getConstraintInfo: (callExp: CallExpressionKw, code, pathToNode) => { - if (callExp.type !== 'CallExpressionKw') return [] - if (callExp.callee.name.name !== 'tangentialArc') return [] - const callee = callExp.callee - const pathToCallee: PathToNode = [ - ...pathToNode, - ['callee', 'CallExpressionKw'], - ] - const endAbsoluteArg = findKwArgWithIndex(ARG_END_ABSOLUTE, callExp) + return tangentialArcHelpers.getConstraintInfo({ + callExp, + code, + pathToNode, + isAbsolute: false, + }) + }, +} - const constraints: ConstrainInfo[] = [ - constrainInfo( - 'tangentialWithPrevious', - true, - callee.name.name, - 'tangentialArc', - undefined, - topLevelRange(callee.start, callee.end), - pathToCallee - ), - ] - if (endAbsoluteArg) { - const { expr, argIndex } = endAbsoluteArg - const pathToArgs: PathToNode = [ - ...pathToNode, - ['arguments', 'CallExpressionKw'], - ] - const pathToArg: PathToNode = [ - ...pathToArgs, - [argIndex, ARG_INDEX_FIELD], - ['arg', LABELED_ARG_FIELD], - ] - if (expr.type !== 'ArrayExpression' || expr.elements.length < 2) { - constraints.push({ - stdLibFnName: 'tangentialArc', - type: 'xAbsolute', - isConstrained: isNotLiteralArrayOrStatic(expr), - sourceRange: topLevelRange(expr.start, expr.end), - pathToNode: pathToArg, - value: code.slice(expr.start, expr.end), - argPosition: { - type: 'labeledArgArrayItem', - index: 0, - key: ARG_END_ABSOLUTE, - }, - }) - constraints.push({ - stdLibFnName: 'tangentialArc', - type: 'yAbsolute', - isConstrained: isNotLiteralArrayOrStatic(expr), - sourceRange: topLevelRange(expr.start, expr.end), - pathToNode: pathToArg, - value: code.slice(expr.start, expr.end), - argPosition: { - type: 'labeledArgArrayItem', - index: 1, - key: ARG_END_ABSOLUTE, - }, - }) - return constraints - } - const pathToX: PathToNode = [ - ...pathToArg, - ['elements', 'ArrayExpression'], - [0, 'index'], - ] - const pathToY: PathToNode = [ - ...pathToArg, - ['elements', 'ArrayExpression'], - [1, 'index'], - ] - const exprX = expr.elements[0] - const exprY = expr.elements[1] - constraints.push({ - stdLibFnName: 'tangentialArc', - type: 'xAbsolute', - isConstrained: isNotLiteralArrayOrStatic(exprX), - sourceRange: topLevelRange(exprX.start, exprX.end), - pathToNode: pathToX, - value: code.slice(exprX.start, exprX.end), - argPosition: { - type: 'labeledArgArrayItem', - index: 0, - key: ARG_END_ABSOLUTE, - }, - }) - constraints.push({ - stdLibFnName: 'tangentialArc', - type: 'yAbsolute', - isConstrained: isNotLiteralArrayOrStatic(exprY), - sourceRange: topLevelRange(exprY.start, exprY.end), - pathToNode: pathToY, - value: code.slice(exprY.start, exprY.end), - argPosition: { - type: 'labeledArgArrayItem', - index: 1, - key: ARG_END_ABSOLUTE, - }, - }) - } - return constraints +export const tangentialArcTo: SketchLineHelperKw = { + add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { + return tangentialArcHelpers.add({ + node, + pathToNode, + segmentInput, + replaceExistingCallback, + isAbsolute: true, + }) + }, + updateArgs: ({ node, pathToNode, input }) => { + return tangentialArcHelpers.update({ + node, + pathToNode, + input, + isAbsolute: true, + }) + }, + getTag: getTagKwArg(), + addTag: addTagKw(), + getConstraintInfo: (callExp: CallExpressionKw, code, pathToNode) => { + return tangentialArcHelpers.getConstraintInfo({ + callExp, + code, + pathToNode, + isAbsolute: true, + }) }, } export const startProfile: SketchLineHelperKw = { updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -1211,8 +1099,7 @@ export const startProfile: SketchLineHelperKw = { getTag: getTagKwArg(), addTag: addTagKw(), add: ({ node, pathToNode, replaceExistingCallback, segmentInput }) => { - console.log('segmentInput', segmentInput) - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = segmentInput const _node = structuredClone(node) const nodeMeta = getNodeFromPath( @@ -1296,7 +1183,7 @@ export const startProfile: SketchLineHelperKw = { return [] } const argIndex = findKwArgAnyIndex([ARG_AT], callExp) - if (argIndex === undefined) { + if (argIndex === undefined || expr.elements.length < 2) { return [] } const pathToXYArray: PathToNode = [ @@ -1584,7 +1471,9 @@ export const circle: SketchLineHelperKw = { key: ARG_RADIUS, }, }, - { + ] + if (centerInfo.expr.elements.length >= 2) { + constraints.push({ stdLibFnName: 'circle', type: 'xAbsolute', isConstrained: isNotLiteralArrayOrStatic(centerInfo.expr.elements[0]), @@ -1602,8 +1491,8 @@ export const circle: SketchLineHelperKw = { index: 0, key: ARG_CIRCLE_CENTER, }, - }, - { + }) + constraints.push({ stdLibFnName: 'circle', type: 'yAbsolute', isConstrained: isNotLiteralArrayOrStatic(centerInfo.expr.elements[1]), @@ -1621,8 +1510,8 @@ export const circle: SketchLineHelperKw = { index: 1, key: 'center', }, - }, - ] + }) + } return constraints }, } @@ -2136,7 +2025,7 @@ export const arcTo: SketchLineHelperKw = { interiorAbsoluteArr.elements[0].start, interiorAbsoluteArr.elements[0].end ), - stdLibFnName: 'arc', + stdLibFnName: 'arcTo', argPosition: { type: 'labeledArgArrayItem', key: ARG_INTERIOR_ABSOLUTE, @@ -2158,7 +2047,7 @@ export const arcTo: SketchLineHelperKw = { interiorAbsoluteArr.elements[1].start, interiorAbsoluteArr.elements[1].end ), - stdLibFnName: 'arc', + stdLibFnName: 'arcTo', argPosition: { type: 'labeledArgArrayItem', key: ARG_INTERIOR_ABSOLUTE, @@ -2175,7 +2064,7 @@ export const arcTo: SketchLineHelperKw = { type: 'xAbsolute', isConstrained: isNotLiteralArrayOrStatic(endArr.elements[0]), value: code.slice(endArr.elements[0].start, endArr.elements[0].end), - stdLibFnName: 'arc', + stdLibFnName: 'arcTo', argPosition: { type: 'labeledArgArrayItem', key: 'endAbsolute', @@ -2192,7 +2081,7 @@ export const arcTo: SketchLineHelperKw = { type: 'yAbsolute', isConstrained: isNotLiteralArrayOrStatic(endArr.elements[1]), value: code.slice(endArr.elements[1].start, endArr.elements[1].end), - stdLibFnName: 'arc', + stdLibFnName: 'arcTo', argPosition: { type: 'labeledArgArrayItem', key: 'endAbsolute', @@ -2242,42 +2131,42 @@ export const circleThreePoint: SketchLineHelperKw = { if (replaceExistingCallback) { const result = replaceExistingCallback([ { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 0, key: 'p1', argType: 'xAbsolute', expr: createRoundedLiteral(p1[0]), }, { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 1, key: 'p1', argType: 'yAbsolute', expr: createRoundedLiteral(p1[1]), }, { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 0, key: 'p2', argType: 'xAbsolute', expr: createRoundedLiteral(p2[0]), }, { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 1, key: 'p2', argType: 'yAbsolute', expr: createRoundedLiteral(p2[1]), }, { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 0, key: 'p3', argType: 'xAbsolute', expr: createRoundedLiteral(p3[0]), }, { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 1, key: 'p3', argType: 'yAbsolute', @@ -2344,21 +2233,21 @@ export const circleThreePoint: SketchLineHelperKw = { ...pathToNode, ['arguments', 'CallExpressionKw'], [p1Details.argIndex, 'arg index'], - ['arg', 'labeledArg -> Arg'], + ['arg', LABELED_ARG_FIELD], ['elements', 'ArrayExpression'], ] const pathToP2ArrayExpression: PathToNode = [ ...pathToNode, ['arguments', 'CallExpressionKw'], [p2Details.argIndex, 'arg index'], - ['arg', 'labeledArg -> Arg'], + ['arg', LABELED_ARG_FIELD], ['elements', 'ArrayExpression'], ] const pathToP3ArrayExpression: PathToNode = [ ...pathToNode, ['arguments', 'CallExpressionKw'], [p3Details.argIndex, 'arg index'], - ['arg', 'labeledArg -> Arg'], + ['arg', LABELED_ARG_FIELD], ['elements', 'ArrayExpression'], ] @@ -2369,134 +2258,103 @@ export const circleThreePoint: SketchLineHelperKw = { const pathToP3XArg: PathToNode = [...pathToP3ArrayExpression, [0, 'index']] const pathToP3YArg: PathToNode = [...pathToP3ArrayExpression, [1, 'index']] - const constraints: (ConstrainInfo & { filterValue: string })[] = [ - { + const constraints: (ConstrainInfo & { filterValue: string })[] = [] + if (p1Details.expr.elements.length >= 2) { + const p1XArg = p1Details.expr.elements[0] + const p1YArg = p1Details.expr.elements[1] + constraints.push({ stdLibFnName: 'circleThreePoint', type: 'xAbsolute', - isConstrained: isNotLiteralArrayOrStatic(p1Details.expr.elements[0]), - sourceRange: [ - p1Details.expr.elements[0].start, - p1Details.expr.elements[0].end, - 0, - ], + isConstrained: isNotLiteralArrayOrStatic(p1XArg), + sourceRange: topLevelRange(p1XArg.start, p1XArg.end), pathToNode: pathToP1XArg, - value: code.slice( - p1Details.expr.elements[0].start, - p1Details.expr.elements[0].end - ), + value: code.slice(p1XArg.start, p1XArg.end), argPosition: { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 0, key: 'p1', }, filterValue: 'p1', - }, - { + }) + constraints.push({ stdLibFnName: 'circleThreePoint', type: 'yAbsolute', - isConstrained: isNotLiteralArrayOrStatic(p1Details.expr.elements[1]), - sourceRange: [ - p1Details.expr.elements[1].start, - p1Details.expr.elements[1].end, - 0, - ], + isConstrained: isNotLiteralArrayOrStatic(p1YArg), + sourceRange: topLevelRange(p1YArg.start, p1YArg.end), pathToNode: pathToP1YArg, - value: code.slice( - p1Details.expr.elements[1].start, - p1Details.expr.elements[1].end - ), + value: code.slice(p1YArg.start, p1YArg.end), argPosition: { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 1, key: 'p1', }, filterValue: 'p1', - }, - { + }) + } + if (p2Details.expr.elements.length >= 2) { + const p2XArg = p2Details.expr.elements[0] + const p2YArg = p2Details.expr.elements[1] + constraints.push({ stdLibFnName: 'circleThreePoint', type: 'xAbsolute', - isConstrained: isNotLiteralArrayOrStatic(p2Details.expr.elements[0]), - sourceRange: [ - p2Details.expr.elements[0].start, - p2Details.expr.elements[0].end, - 0, - ], + isConstrained: isNotLiteralArrayOrStatic(p2XArg), + sourceRange: topLevelRange(p2XArg.start, p2XArg.end), pathToNode: pathToP2XArg, - value: code.slice( - p2Details.expr.elements[0].start, - p2Details.expr.elements[0].end - ), + value: code.slice(p2XArg.start, p2XArg.end), argPosition: { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 0, key: 'p2', }, filterValue: 'p2', - }, - { + }) + constraints.push({ stdLibFnName: 'circleThreePoint', type: 'yAbsolute', - isConstrained: isNotLiteralArrayOrStatic(p2Details.expr.elements[1]), - sourceRange: [ - p2Details.expr.elements[1].start, - p2Details.expr.elements[1].end, - 0, - ], + isConstrained: isNotLiteralArrayOrStatic(p2YArg), + sourceRange: topLevelRange(p2YArg.start, p2YArg.end), pathToNode: pathToP2YArg, - value: code.slice( - p2Details.expr.elements[1].start, - p2Details.expr.elements[1].end - ), + value: code.slice(p2YArg.start, p2YArg.end), argPosition: { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 1, key: 'p2', }, filterValue: 'p2', - }, - { + }) + } + if (p3Details.expr.elements.length >= 2) { + const p3XArg = p3Details.expr.elements[0] + const p3YArg = p3Details.expr.elements[1] + constraints.push({ stdLibFnName: 'circleThreePoint', type: 'xAbsolute', - isConstrained: isNotLiteralArrayOrStatic(p3Details.expr.elements[0]), - sourceRange: [ - p3Details.expr.elements[0].start, - p3Details.expr.elements[0].end, - 0, - ], + isConstrained: isNotLiteralArrayOrStatic(p3XArg), + sourceRange: topLevelRange(p3XArg.start, p3XArg.end), pathToNode: pathToP3XArg, - value: code.slice( - p3Details.expr.elements[0].start, - p3Details.expr.elements[0].end - ), + value: code.slice(p3XArg.start, p3XArg.end), argPosition: { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 0, key: 'p3', }, filterValue: 'p3', - }, - { + }) + constraints.push({ stdLibFnName: 'circleThreePoint', type: 'yAbsolute', - isConstrained: isNotLiteralArrayOrStatic(p3Details.expr.elements[1]), - sourceRange: [ - p3Details.expr.elements[1].start, - p3Details.expr.elements[1].end, - 0, - ], + isConstrained: isNotLiteralArrayOrStatic(p3YArg), + sourceRange: topLevelRange(p3YArg.start, p3YArg.end), pathToNode: pathToP3YArg, - value: code.slice( - p3Details.expr.elements[1].start, - p3Details.expr.elements[1].end - ), + value: code.slice(p3YArg.start, p3YArg.end), argPosition: { - type: 'arrayInObject', + type: 'labeledArgArrayItem', index: 1, key: 'p3', }, filterValue: 'p3', - }, - ] + }) + } const finalConstraints: ConstrainInfo[] = [] constraints.forEach((constraint) => { if (!filterValue) { @@ -2512,7 +2370,7 @@ export const circleThreePoint: SketchLineHelperKw = { export const angledLine: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback, snaps }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const getNode = getNodeFromPathCurry(_node, pathToNode) @@ -2585,7 +2443,7 @@ export const angledLine: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -2628,7 +2486,7 @@ export const angledLineOfXLength: SketchLineHelperKw = { segmentInput, replaceExistingCallback, }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const nodeMeta = getNodeFromPath( @@ -2657,16 +2515,14 @@ export const angledLineOfXLength: SketchLineHelperKw = { if (replaceExistingCallback) { const result = replaceExistingCallback([ { - type: 'arrayOrObjItem', - index: 0, + type: 'labeledArg', key: 'angle', argType: 'angle', expr: angle, }, { - type: 'arrayOrObjItem', - index: 1, - key: 'length', + type: 'labeledArg', + key: 'lengthX', argType: 'xRelative', expr: xLength, }, @@ -2691,7 +2547,7 @@ export const angledLineOfXLength: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -2730,7 +2586,7 @@ export const angledLineOfXLength: SketchLineHelperKw = { commonConstraintInfoHelper( callExp, ['angle', 'xRelative'], - 'angledLineOfXLength', + 'angledLine', [{ argLabel: 'angle' }, { argLabel: 'lengthX' }], ...args ), @@ -2744,7 +2600,7 @@ export const angledLineOfYLength: SketchLineHelperKw = { segmentInput, replaceExistingCallback, }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const nodeMeta = getNodeFromPath( @@ -2771,16 +2627,14 @@ export const angledLineOfYLength: SketchLineHelperKw = { if (replaceExistingCallback) { const result = replaceExistingCallback([ { - type: 'arrayOrObjItem', - index: 0, + type: 'labeledArg', key: 'angle', argType: 'angle', expr: angle, }, { - type: 'arrayOrObjItem', - index: 1, - key: 'length', + type: 'labeledArg', + key: 'lengthY', argType: 'yRelative', expr: yLength, }, @@ -2805,7 +2659,7 @@ export const angledLineOfYLength: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -2852,7 +2706,7 @@ export const angledLineOfYLength: SketchLineHelperKw = { export const angledLineToX: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const nodeMeta = getNodeFromPath( @@ -2868,16 +2722,14 @@ export const angledLineToX: SketchLineHelperKw = { if (replaceExistingCallback) { const result = replaceExistingCallback([ { - type: 'arrayOrObjItem', - index: 0, + type: 'labeledArg', key: 'angle', argType: 'angle', expr: angle, }, { - type: 'arrayOrObjItem', - index: 1, - key: 'to', + type: 'labeledArg', + key: 'endAbsoluteX', argType: 'xAbsolute', expr: xArg, }, @@ -2904,7 +2756,7 @@ export const angledLineToX: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -2941,7 +2793,7 @@ export const angledLineToX: SketchLineHelperKw = { export const angledLineToY: SketchLineHelperKw = { add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const nodeMeta = getNodeFromPath( @@ -2959,16 +2811,14 @@ export const angledLineToY: SketchLineHelperKw = { if (replaceExistingCallback) { const result = replaceExistingCallback([ { - type: 'arrayOrObjItem', - index: 0, + type: 'labeledArg', key: 'angle', argType: 'angle', expr: angle, }, { - type: 'arrayOrObjItem', - index: 1, - key: 'to', + type: 'labeledArg', + key: 'endAbsoluteY', argType: 'yAbsolute', expr: yArg, }, @@ -2995,7 +2845,7 @@ export const angledLineToY: SketchLineHelperKw = { } }, updateArgs: ({ node, pathToNode, input }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -3038,7 +2888,7 @@ export const angledLineThatIntersects: SketchLineHelperKw = { replaceExistingCallback, referencedSegment, }) => { - if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { from, to } = segmentInput const _node = { ...node } const nodeMeta = getNodeFromPath( @@ -3094,7 +2944,7 @@ export const angledLineThatIntersects: SketchLineHelperKw = { return new Error('not implemented') }, updateArgs: ({ node, pathToNode, input, variables }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to, from } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -3215,7 +3065,7 @@ export const updateStartProfileAtArgs: SketchLineHelperKw['updateArgs'] = ({ pathToNode, input, }) => { - if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() const { to } = input const _node = { ...node } const nodeMeta = getNodeFromPath(_node, pathToNode) @@ -3276,6 +3126,7 @@ export const sketchLineHelperMapKw: { [key: string]: SketchLineHelperKw } = { angledLineToX, angledLineToY, tangentialArc, + tangentialArcTo, startProfile, } as const @@ -3351,6 +3202,7 @@ export function fnNameToToolTipFromSegment( fnName: string ): ToolTip | Error { switch (fnName) { + case 'arcTo': case 'arc': { return seg.type === 'ArcThreePoint' ? 'arcTo' : 'arc' } @@ -3368,6 +3220,7 @@ export function fnNameToToolTipFromSegment( case 'circleThreePoint': case 'circle': case 'tangentialArc': + case 'tangentialArcTo': case 'angledLine': case 'startProfile': return fnName @@ -3390,8 +3243,7 @@ export function fnNameToTooltip( argLabels: string[], fnName: string ): ToolTip | Error { - const isAbsolute = - argLabels.findIndex((label) => label === ARG_END_ABSOLUTE) >= 0 + const isAbsolute = argLabels.some((label) => label === ARG_END_ABSOLUTE) switch (fnName) { case 'arc': { const isArc = argLabels.some((label) => @@ -3405,10 +3257,11 @@ export function fnNameToTooltip( return isAbsolute ? 'xLineTo' : 'xLine' case 'yLine': return isAbsolute ? 'yLineTo' : 'yLine' + case 'tangentialArc': + return isAbsolute ? 'tangentialArcTo' : 'tangentialArc' case 'angledLineThatIntersects': case 'circleThreePoint': case 'circle': - case 'tangentialArc': case 'startProfile': return fnName case 'angledLine': { @@ -3449,6 +3302,7 @@ export function tooltipToFnName(tooltip: ToolTip): string | Error { case 'xLine': case 'yLine': case 'line': + case 'tangentialArc': return tooltip case 'lineTo': return 'line' @@ -3456,6 +3310,8 @@ export function tooltipToFnName(tooltip: ToolTip): string | Error { return 'xLine' case 'yLineTo': return 'yLine' + case 'tangentialArcTo': + return 'tangentialArc' case 'angledLine': case 'angledLineToX': case 'angledLineToY': @@ -4063,7 +3919,6 @@ export function isAbsoluteLine(lineCall: CallExpressionKw): boolean | Error { const name = lineCall?.callee?.name.name switch (name) { case 'line': - case 'tangentialArc': if (findKwArg(ARG_END, lineCall) !== undefined) { return false } @@ -4084,6 +3939,8 @@ export function isAbsoluteLine(lineCall: CallExpressionKw): boolean | Error { return new Error( `${name} call has neither ${ARG_END} nor ${ARG_END_ABSOLUTE} params` ) + case 'tangentialArc': + return findKwArg(ARG_END_ABSOLUTE, lineCall) !== undefined case 'angledLineThatIntersects': case 'arc': case 'circle': @@ -4115,6 +3972,7 @@ export function getArgForEnd(lineCall: CallExpressionKw): switch (name) { case 'circle': return getCircle(lineCall) + case 'tangentialArc': case 'line': { const arg = findKwArgAny(DETERMINING_ARGS, lineCall) if (arg === undefined) { @@ -4171,3 +4029,264 @@ export function getArgForEnd(lineCall: CallExpressionKw): function removeDeterminingArgs(callExp: CallExpressionKw) { removeKwArgs(DETERMINING_ARGS, callExp) } + +const tangentialArcHelpers = { + add: ({ + node, + pathToNode, + segmentInput, + replaceExistingCallback, + isAbsolute = false, + }: { + node: Node + pathToNode: PathToNode + segmentInput: SegmentInputs + replaceExistingCallback?: ( + rawArgs: RawArgs + ) => CreatedSketchExprResult | Error + isAbsolute?: boolean + }) => { + if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() + const { to, from } = segmentInput + const _node = { ...node } + const getNode = getNodeFromPathCurry(_node, pathToNode) + const _node1 = getNode('PipeExpression') + if (err(_node1)) return _node1 + const { node: pipe } = _node1 + const _node2 = getNodeFromPath( + _node, + pathToNode, + 'VariableDeclarator' + ) + if (err(_node2)) return _node2 + const { node: varDec } = _node2 + + const toX = createLiteral(roundOff(isAbsolute ? to[0] : to[0] - from[0], 2)) + const toY = createLiteral(roundOff(isAbsolute ? to[1] : to[1] - from[1], 2)) + + const argLabel = isAbsolute ? ARG_END_ABSOLUTE : ARG_END + const xArgType = isAbsolute ? 'xAbsolute' : 'xRelative' + const yArgType = isAbsolute ? 'yAbsolute' : 'yRelative' + + if (replaceExistingCallback && pipe.type !== 'CallExpressionKw') { + const { index: callIndex } = splitPathAtPipeExpression(pathToNode) + const result = replaceExistingCallback([ + { + type: 'labeledArgArrayItem', + key: argLabel, + index: 0, + argType: xArgType, + expr: toX, + }, + { + type: 'labeledArgArrayItem', + key: argLabel, + index: 1, + argType: yArgType, + expr: toY, + }, + ]) + if (err(result)) return result + const { callExp, valueUsedInTransform } = result + pipe.body[callIndex] = callExp + return { + modifiedAst: _node, + pathToNode, + valueUsedInTransform, + } + } + const newLine = createCallExpressionStdLibKw( + 'tangentialArc', + null, // Assumes this is being called in a pipeline, so the first arg is optional and if not given, will become pipeline substitution. + [createLabeledArg(argLabel, createArrayExpression([toX, toY]))] + ) + if (pipe.type === 'PipeExpression') { + pipe.body = [...pipe.body, newLine] + return { + modifiedAst: _node, + pathToNode: [ + ...pathToNode.slice( + 0, + pathToNode.findIndex(([_, type]) => type === 'PipeExpression') + 1 + ), + ['body', 'PipeExpression'], + [pipe.body.length - 1, 'CallExpressionKw'], + ] as PathToNode, + } + } else { + varDec.init = createPipeExpression([varDec.init, newLine]) + } + return { + modifiedAst: _node, + pathToNode, + } + }, + update: ({ + node, + pathToNode, + input, + isAbsolute = false, + }: { + node: Node + pathToNode: PathToNode + input: SegmentInputs + isAbsolute?: boolean + }) => { + if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR() + const { to, from } = input + const _node = { ...node } + const nodeMeta = getNodeFromPath(_node, pathToNode) + if (err(nodeMeta)) return nodeMeta + const { node: callExpression } = nodeMeta + + if (callExpression.type !== 'CallExpressionKw') { + return new Error( + `Expected CallExpressionKw, but found ${callExpression.type}` + ) + } + + const argLabel = isAbsolute ? ARG_END_ABSOLUTE : ARG_END + const functionName = isAbsolute ? 'tangentialArcTo' : 'tangentialArc' + + for (const arg of callExpression.arguments) { + if (arg.label?.name !== argLabel && arg.label?.name !== ARG_TAG) { + console.debug( + `Trying to edit unsupported ${functionName} keyword arguments; skipping` + ) + return { + modifiedAst: _node, + pathToNode, + } + } + } + + const toArrExp = createArrayExpression([ + createLiteral(roundOff(isAbsolute ? to[0] : to[0] - from[0], 2)), + createLiteral(roundOff(isAbsolute ? to[1] : to[1] - from[1], 2)), + ]) + + mutateKwArg(argLabel, callExpression, toArrExp) + return { + modifiedAst: _node, + pathToNode, + } + }, + getConstraintInfo: ({ + callExp, + code, + pathToNode, + isAbsolute = false, + }: { + callExp: CallExpressionKw + code: string + pathToNode: PathToNode + isAbsolute?: boolean + }): ConstrainInfo[] => { + if (callExp.type !== 'CallExpressionKw') return [] + if (callExp.callee.name.name !== 'tangentialArc') return [] + + const callee = callExp.callee + const pathToCallee: PathToNode = [ + ...pathToNode, + ['callee', 'CallExpressionKw'], + ] + + const argLabel = isAbsolute ? ARG_END_ABSOLUTE : ARG_END + const xConstraintType = isAbsolute ? 'xAbsolute' : 'xRelative' + const yConstraintType = isAbsolute ? 'yAbsolute' : 'yRelative' + + const endArg = findKwArgWithIndex(argLabel, callExp) + + const constraints: ConstrainInfo[] = [ + constrainInfo( + 'tangentialWithPrevious', + true, + callee.name.name, + 'tangentialArc', + undefined, + topLevelRange(callee.start, callee.end), + pathToCallee + ), + ] + if (endArg) { + const { expr, argIndex } = endArg + const pathToArgs: PathToNode = [ + ...pathToNode, + ['arguments', 'CallExpressionKw'], + ] + const pathToArg: PathToNode = [ + ...pathToArgs, + [argIndex, ARG_INDEX_FIELD], + ['arg', LABELED_ARG_FIELD], + ] + if (expr.type !== 'ArrayExpression' || expr.elements.length < 2) { + constraints.push({ + stdLibFnName: 'tangentialArc', + type: xConstraintType, + isConstrained: isNotLiteralArrayOrStatic(expr), + sourceRange: topLevelRange(expr.start, expr.end), + pathToNode: pathToArg, + value: code.slice(expr.start, expr.end), + argPosition: { + type: 'labeledArgArrayItem', + index: 0, + key: argLabel, + }, + }) + constraints.push({ + stdLibFnName: 'tangentialArc', + type: yConstraintType, + isConstrained: isNotLiteralArrayOrStatic(expr), + sourceRange: topLevelRange(expr.start, expr.end), + pathToNode: pathToArg, + value: code.slice(expr.start, expr.end), + argPosition: { + type: 'labeledArgArrayItem', + index: 1, + key: argLabel, + }, + }) + return constraints + } + const pathToX: PathToNode = [ + ...pathToArg, + ['elements', 'ArrayExpression'], + [0, 'index'], + ] + const pathToY: PathToNode = [ + ...pathToArg, + ['elements', 'ArrayExpression'], + [1, 'index'], + ] + const exprX = expr.elements[0] + const exprY = expr.elements[1] + constraints.push({ + stdLibFnName: 'tangentialArc', + type: xConstraintType, + isConstrained: isNotLiteralArrayOrStatic(exprX), + sourceRange: topLevelRange(exprX.start, exprX.end), + pathToNode: pathToX, + value: code.slice(exprX.start, exprX.end), + argPosition: { + type: 'labeledArgArrayItem', + index: 0, + key: argLabel, + }, + }) + constraints.push({ + stdLibFnName: 'tangentialArc', + type: yConstraintType, + isConstrained: isNotLiteralArrayOrStatic(exprY), + sourceRange: topLevelRange(exprY.start, exprY.end), + pathToNode: pathToY, + value: code.slice(exprY.start, exprY.end), + argPosition: { + type: 'labeledArgArrayItem', + index: 1, + key: argLabel, + }, + }) + } + return constraints + }, +} diff --git a/src/lang/std/sketchcombos.ts b/src/lang/std/sketchcombos.ts index cf725528d..2be5132ee 100644 --- a/src/lang/std/sketchcombos.ts +++ b/src/lang/std/sketchcombos.ts @@ -1350,8 +1350,15 @@ export function removeSingleConstraint({ return false } + const toolTip = fnNameToTooltip( + allLabels(callExp.node), + callExp.node.callee.name.name + ) + const transform: TransformInfo = { - tooltip: callExp.node.callee.name.name as any, + tooltip: err(toolTip) + ? (callExp.node.callee.name.name as ToolTip) + : toolTip, createNode: ({ tag, inputs, rawArgs }) => { // inputs is the current values for each of the inputs // rawValues is the raw 'literal' values equivalent to the inputs @@ -1495,23 +1502,20 @@ export function removeSingleConstraint({ const literal = rawArg?.overrideExpr ?? rawArg?.expr return (arg.index === inputToReplace.index && literal) || argExpr }) + // It's a kw call. - const isAbsolute = callExp.node.callee.name.name == 'lineTo' - if (isAbsolute) { - const args = [ - createLabeledArg(ARG_END_ABSOLUTE, createArrayExpression(values)), - ] - return createStdlibCallExpressionKw('line', args, tag) - } else { - const args = [ - createLabeledArg(ARG_END, createArrayExpression(values)), - ] - return createStdlibCallExpressionKw( - callExp.node.callee.name.name as ToolTip, - args, - tag - ) - } + const isAbsolute = inputs.some((input) => input.argType === 'xAbsolute') + const args = [ + createLabeledArg( + isAbsolute ? ARG_END_ABSOLUTE : ARG_END, + createArrayExpression(values) + ), + ] + return createStdlibCallExpressionKw( + callExp.node.callee.name.name as ToolTip, + args, + tag + ) } if ( inputToReplace.type === 'arrayInObject' || diff --git a/src/lang/wasm.test.ts b/src/lang/wasm.test.ts index 85ae288ba..c945bf674 100644 --- a/src/lang/wasm.test.ts +++ b/src/lang/wasm.test.ts @@ -47,7 +47,7 @@ it('formats numbers with units', () => { describe('test errFromErrWithOutputs', () => { it('converts KclErrorWithOutputs to KclError', () => { const blob = - '{"error":{"kind":"internal","sourceRanges":[],"backtrace":[],"msg":"Cache busted"},"nonFatal":[],"operations":[],"artifactCommands":[],"artifactGraph":{"map":{}},"filenames":{},"sourceFiles":{},"defaultPlanes":null}' + '{"error":{"kind":"internal","details":{"sourceRanges":[],"backtrace":[],"msg":"Cache busted"}},"nonFatal":[],"operations":[],"artifactCommands":[],"artifactGraph":{"map":{}},"filenames":{},"sourceFiles":{},"defaultPlanes":null}' const error = errFromErrWithOutputs(blob) const errorStr = JSON.stringify(error) expect(errorStr).toEqual( diff --git a/src/lang/wasm.ts b/src/lang/wasm.ts index f916f3c59..0f4c25437 100644 --- a/src/lang/wasm.ts +++ b/src/lang/wasm.ts @@ -159,20 +159,20 @@ export function defaultSourceRange(): SourceRange { } function bestSourceRange(error: RustKclError): SourceRange { - if (error.sourceRanges.length === 0) { + if (error.details.sourceRanges.length === 0) { return defaultSourceRange() } // When there's an error, the call stack is unwound, and the locations are // built up from deepest location to shallowest. So the deepest call is first. - for (const range of error.sourceRanges) { + for (const range of error.details.sourceRanges) { // Skip ranges pointing into files that aren't the top-level module. if (isTopLevelModule(range)) { return sourceRangeFromRust(range) } } // We didn't find a top-level module range, so just use the first one. - return sourceRangeFromRust(error.sourceRanges[0]) + return sourceRangeFromRust(error.details.sourceRanges[0]) } const splitErrors = ( @@ -241,7 +241,7 @@ export const parse = (code: string | Error): ParseResult | Error => { const parsed: RustKclError = JSON.parse(e.toString()) return new KCLError( parsed.kind, - parsed.msg, + parsed.details.msg, bestSourceRange(parsed), [], [], @@ -389,12 +389,25 @@ export function sketchFromKclValue( } export const errFromErrWithOutputs = (e: any): KCLError => { - const parsed: KclErrorWithOutputs = JSON.parse(e.toString()) + // `e` is any, so let's figure out something useful to do with it. + const parsed: KclErrorWithOutputs = (() => { + // No need to parse, it's already an object. + if (typeof e === 'object') { + return e + } + // It's a string, so parse it. + if (typeof e === 'string') { + return JSON.parse(e) + } + // It can be converted to a string, then parsed. + return JSON.parse(e.toString()) + })() + return new KCLError( parsed.error.kind, - parsed.error.msg, + parsed.error.details.msg, bestSourceRange(parsed.error), - parsed.error.backtrace, + parsed.error.details.backtrace, parsed.nonFatal, parsed.operations, parsed.artifactCommands, diff --git a/src/lib/constants.ts b/src/lib/constants.ts index ee8cedfb2..df293744c 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -217,3 +217,6 @@ export const POOL_QUERY_PARAM = 'pool' * @deprecated: supporting old share links with this. For new command URLs, use "cmd" */ export const CREATE_FILE_URL_PARAM = 'create-file' +/** A query parameter to skip the sign-on view if unnecessary. */ +export const IMMEDIATE_SIGN_IN_IF_NECESSARY_QUERY_PARAM = + 'immediate-sign-in-if-necessary' diff --git a/src/lib/crossPlatformFetch.ts b/src/lib/crossPlatformFetch.ts index 28247442d..54b8ec0eb 100644 --- a/src/lib/crossPlatformFetch.ts +++ b/src/lib/crossPlatformFetch.ts @@ -1,6 +1,5 @@ import { DEV } from '@src/env' import isomorphicFetch from 'isomorphic-fetch' - import { isDesktop } from '@src/lib/isDesktop' // TODO I not sure this file should exist @@ -38,22 +37,21 @@ export default async function crossPlatformFetch( return new Error('Failed to request endpoint: ' + url) } + const data = (await response.json().catch((e) => e)) as T | Error + if (!response.ok) { console.error( - 'Failed to request endpoint: ' + url, - JSON.stringify(response) - ) - return new Error( - 'Failed to request endpoint: ' + - url + - ' with status: ' + - response.status + - ' ' + - response.statusText + `Failed to request endpoint: ${url}`, + JSON.stringify(response), + data ) + const fallbackErrorMessage = `Failed to request endpoint: ${url} with status: ${response.status} ${response.statusText}` + const resolvedMessage = + data instanceof Object && 'message' in data + ? data.message + : fallbackErrorMessage + return new Error(resolvedMessage) } - const data = (await response.json()) as T | Error - return data } diff --git a/src/lib/operations.test.ts b/src/lib/operations.test.ts index 985557be2..d945a32b0 100644 --- a/src/lib/operations.test.ts +++ b/src/lib/operations.test.ts @@ -1,7 +1,12 @@ import type { Operation } from '@rust/kcl-lib/bindings/Operation' +import { topLevelRange } from '@src/lang/util' -import { defaultSourceRange } from '@src/lang/wasm' -import { filterOperations } from '@src/lib/operations' +import { + assertParse, + defaultSourceRange, + type SourceRange, +} from '@src/lang/wasm' +import { filterOperations, getOperationVariableName } from '@src/lib/operations' function stdlib(name: string): Operation { return { @@ -162,3 +167,75 @@ describe('operations filtering', () => { ]) }) }) + +function rangeOfText(fullCode: string, target: string): SourceRange { + const start = fullCode.indexOf(target) + if (start === -1) { + throw new Error(`Could not find \`${target}\` in: ${fullCode}`) + } + return topLevelRange(start, start + target.length) +} + +describe('variable name of operations', () => { + it('finds the variable name with simple assignment', async () => { + const op = stdlib('stdLibFn') + if (op.type !== 'StdLibCall') { + throw new Error('Expected operation to be a StdLibCall') + } + const code = `myVar = stdLibFn()` + // Make the source range match the code. + op.sourceRange = rangeOfText(code, 'stdLibFn()') + + const program = assertParse(code) + const variableName = getOperationVariableName(op, program) + expect(variableName).toBe('myVar') + }) + it('finds the variable name inside a function with simple assignment', async () => { + const op = stdlib('stdLibFn') + if (op.type !== 'StdLibCall') { + throw new Error('Expected operation to be a StdLibCall') + } + const code = `fn myFunc() { + myVar = stdLibFn() + return 0 +} +` + // Make the source range match the code. + op.sourceRange = rangeOfText(code, 'stdLibFn()') + + const program = assertParse(code) + const variableName = getOperationVariableName(op, program) + expect(variableName).toBe('myVar') + }) + it("finds the variable name when it's the last in a pipeline", async () => { + const op = stdlib('stdLibFn') + if (op.type !== 'StdLibCall') { + throw new Error('Expected operation to be a StdLibCall') + } + const code = `myVar = foo() + |> stdLibFn() +` + // Make the source range match the code. + op.sourceRange = rangeOfText(code, 'stdLibFn()') + + const program = assertParse(code) + const variableName = getOperationVariableName(op, program) + expect(variableName).toBe('myVar') + }) + it("finds nothing when it's not the last in a pipeline", async () => { + const op = stdlib('stdLibFn') + if (op.type !== 'StdLibCall') { + throw new Error('Expected operation to be a StdLibCall') + } + const code = `myVar = foo() + |> stdLibFn() + |> bar() +` + // Make the source range match the code. + op.sourceRange = rangeOfText(code, 'stdLibFn()') + + const program = assertParse(code) + const variableName = getOperationVariableName(op, program) + expect(variableName).toBeUndefined() + }) +}) diff --git a/src/lib/operations.ts b/src/lib/operations.ts index cefbf055f..e40a7cec6 100644 --- a/src/lib/operations.ts +++ b/src/lib/operations.ts @@ -15,7 +15,13 @@ import { getSweepEdgeCodeRef, getWallCodeRef, } from '@src/lang/std/artifactGraph' -import { type PipeExpression, sourceRangeFromRust } from '@src/lang/wasm' +import { + type CallExpressionKw, + type PipeExpression, + type Program, + sourceRangeFromRust, + type VariableDeclaration, +} from '@src/lang/wasm' import type { HelixModes, ModelingCommandSchema, @@ -982,6 +988,16 @@ export const stdLibMap: Record = { supportsAppearance: true, supportsTransform: true, }, + rotate: { + label: 'Rotate', + icon: 'rotate', + prepareToEdit: prepareToEditRotate, + supportsTransform: true, + }, + scale: { + label: 'Scale', + icon: 'scale', + }, shell: { label: 'Shell', icon: 'shell', @@ -1018,6 +1034,12 @@ export const stdLibMap: Record = { prepareToEdit: prepareToEditSweep, supportsAppearance: true, }, + translate: { + label: 'Translate', + icon: 'move', + prepareToEdit: prepareToEditTranslate, + supportsTransform: true, + }, union: { label: 'Union', icon: 'booleanUnion', @@ -1074,6 +1096,71 @@ export function getOperationIcon(op: Operation): CustomIconName { } } +/** + * If the result of the operation is assigned to a variable, returns the + * variable name. + */ +export function getOperationVariableName( + op: Operation, + program: Program +): string | undefined { + if ( + op.type !== 'StdLibCall' && + !(op.type === 'GroupBegin' && op.group.type === 'FunctionCall') + ) { + return undefined + } + // Find the AST node. + const range = sourceRangeFromRust(op.sourceRange) + const pathToNode = getNodePathFromSourceRange(program, range) + if (pathToNode.length === 0) { + return undefined + } + const call = getNodeFromPath( + program, + pathToNode, + 'CallExpressionKw' + ) + if (err(call) || call.node.type !== 'CallExpressionKw') { + return undefined + } + // Find the var name from the variable declaration. + const varDec = getNodeFromPath( + program, + pathToNode, + 'VariableDeclaration' + ) + if (err(varDec)) { + return undefined + } + if (varDec.node.type !== 'VariableDeclaration') { + // There's no variable declaration for this call. + return undefined + } + const varName = varDec.node.declaration.id.name + // If the operation is a simple assignment, we can use the variable name. + if (varDec.node.declaration.init === call.node) { + return varName + } + // If the AST node is in a pipe expression, we can only use the variable + // name if it's the last operation in the pipe. + const pipe = getNodeFromPath( + program, + pathToNode, + 'PipeExpression' + ) + if (err(pipe)) { + return undefined + } + if ( + pipe.node.type === 'PipeExpression' && + pipe.node.body[pipe.node.body.length - 1] === call.node + ) { + return varName + } + return undefined +} + /** * Apply all filters to a list of operations. */ @@ -1232,17 +1319,19 @@ export async function enterAppearanceFlow({ ) } -export async function enterTranslateFlow({ - operation, -}: EnterEditFlowProps): Promise { +async function prepareToEditTranslate({ operation }: EnterEditFlowProps) { + const baseCommand = { + name: 'Translate', + groupId: 'modeling', + } const isModuleImport = operation.type === 'GroupBegin' const isSupportedStdLibCall = operation.type === 'StdLibCall' && stdLibMap[operation.name]?.supportsTransform if (!isModuleImport && !isSupportedStdLibCall) { - return new Error( - 'Unsupported operation type. Please edit in the code editor.' - ) + return { + reason: 'Unsupported operation type. Please edit in the code editor.', + } } const nodeToEdit = getNodePathFromSourceRange( @@ -1285,26 +1374,38 @@ export async function enterTranslateFlow({ const selection: Selections = { graphSelections: [], otherSelections: [] } const argDefaultValues = { nodeToEdit, selection, x, y, z } return { - type: 'Find and select command', - data: { - name: 'Translate', - groupId: 'modeling', - argDefaultValues, - }, + ...baseCommand, + argDefaultValues, } } -export async function enterRotateFlow({ +export async function enterTranslateFlow({ operation, }: EnterEditFlowProps): Promise { + const data = await prepareToEditTranslate({ operation }) + if ('reason' in data) { + return new Error(data.reason) + } + + return { + type: 'Find and select command', + data, + } +} + +async function prepareToEditRotate({ operation }: EnterEditFlowProps) { + const baseCommand = { + name: 'Rotate', + groupId: 'modeling', + } const isModuleImport = operation.type === 'GroupBegin' const isSupportedStdLibCall = operation.type === 'StdLibCall' && stdLibMap[operation.name]?.supportsTransform if (!isModuleImport && !isSupportedStdLibCall) { - return new Error( - 'Unsupported operation type. Please edit in the code editor.' - ) + return { + reason: 'Unsupported operation type. Please edit in the code editor.', + } } const nodeToEdit = getNodePathFromSourceRange( @@ -1346,13 +1447,23 @@ export async function enterRotateFlow({ // Won't be used since we provide nodeToEdit const selection: Selections = { graphSelections: [], otherSelections: [] } const argDefaultValues = { nodeToEdit, selection, roll, pitch, yaw } + return { + ...baseCommand, + argDefaultValues, + } +} + +export async function enterRotateFlow({ + operation, +}: EnterEditFlowProps): Promise { + const data = await prepareToEditRotate({ operation }) + if ('reason' in data) { + return new Error(data.reason) + } + return { type: 'Find and select command', - data: { - name: 'Rotate', - groupId: 'modeling', - argDefaultValues, - }, + data, } } diff --git a/src/lib/rustContext.ts b/src/lib/rustContext.ts index b946f7236..ab626cdc8 100644 --- a/src/lib/rustContext.ts +++ b/src/lib/rustContext.ts @@ -141,7 +141,7 @@ export default class RustContext { ) } catch (e: any) { const parsed: RustKclError = JSON.parse(e.toString()) - toast.error(parsed.msg, { id: toastId }) + toast.error(parsed.details.msg, { id: toastId }) return } } diff --git a/src/lib/selections.ts b/src/lib/selections.ts index 4d94c5569..c9a17b27c 100644 --- a/src/lib/selections.ts +++ b/src/lib/selections.ts @@ -703,7 +703,8 @@ export async function sendSelectEventToEngine( cmd_id: uuidv4(), }) if (!res) { - return Promise.reject('no response') + console.warn('No response') + return undefined } if (isArray(res)) { diff --git a/src/lib/settings/initialKeybindings.ts b/src/lib/settings/initialKeybindings.ts index b49bd1462..067c0c9e4 100644 --- a/src/lib/settings/initialKeybindings.ts +++ b/src/lib/settings/initialKeybindings.ts @@ -146,12 +146,19 @@ export const interactionMap: Record< 'Available while modeling with either a face selected or an empty selection, when not typing in the code editor.', }, { - name: 'center-on-selection', + name: 'camera-center-on-selection', sequence: `${PRIMARY}+Alt+C`, title: 'Center on selection', description: 'Centers the view on the selected geometry, or everything if nothing is selected.', }, + { + name: 'camera-reset-position', + sequence: `${PRIMARY}+Alt+X`, + title: 'Reset camera position', + description: + 'Reset the camera to its default position and orientation, which is an isometric view.', + }, ], 'Code Editor': [ { diff --git a/src/machines/engineStreamMachine.ts b/src/machines/engineStreamMachine.ts index 013887c4d..1653ac746 100644 --- a/src/machines/engineStreamMachine.ts +++ b/src/machines/engineStreamMachine.ts @@ -70,7 +70,6 @@ export async function holdOntoVideoFrameInCanvas( video: HTMLVideoElement, canvas: HTMLCanvasElement ) { - video.pause() canvas.width = video.videoWidth canvas.height = video.videoHeight canvas.style.width = video.videoWidth + 'px' @@ -220,11 +219,14 @@ export const engineStreamMachine = setup({ if (context.videoRef.current && context.canvasRef.current) { await context.videoRef.current.pause() - await holdOntoVideoFrameInCanvas( - context.videoRef.current, - context.canvasRef.current - ) - context.videoRef.current.style.display = 'none' + // It's possible we've already frozen the frame due to a disconnect. + if (context.videoRef.current.style.display !== 'none') { + await holdOntoVideoFrameInCanvas( + context.videoRef.current, + context.canvasRef.current + ) + context.videoRef.current.style.display = 'none' + } } await rootContext.sceneInfra.camControls.saveRemoteCameraState() @@ -365,9 +367,12 @@ export const engineStreamMachine = setup({ }), }, on: { - [EngineStreamTransition.StartOrReconfigureEngine]: { + [EngineStreamTransition.Resume]: { target: EngineStreamState.Resuming, }, + [EngineStreamTransition.Stop]: { + target: EngineStreamState.Stopped, + }, }, }, [EngineStreamState.Stopped]: { @@ -398,11 +403,17 @@ export const engineStreamMachine = setup({ rootContext: args.self.system.get('root').getSnapshot().context, event: args.event, }), + // Usually only fails if there was a disconnection mid-way. + onError: [ + { + target: EngineStreamState.WaitingForDependencies, + reenter: true, + }, + ], }, on: { - // The stream can be paused as it's resuming. - [EngineStreamTransition.Pause]: { - target: EngineStreamState.Paused, + [EngineStreamTransition.Stop]: { + target: EngineStreamState.Stopped, }, [EngineStreamTransition.SetMediaStream]: { target: EngineStreamState.Playing, diff --git a/src/machines/modelingMachine.test.ts b/src/machines/modelingMachine.test.ts index 181257a9a..eabf4469e 100644 --- a/src/machines/modelingMachine.test.ts +++ b/src/machines/modelingMachine.test.ts @@ -4,7 +4,7 @@ import { } from '@src/machines/modelingMachine' import { createActor } from 'xstate' import { vi } from 'vitest' -import { assertParse, type CallExpressionKw } from '@src/lang/wasm' +import { assertParse, recast, type CallExpressionKw } from '@src/lang/wasm' import { initPromise } from '@src/lang/wasmUtils' import { codeManager, @@ -12,7 +12,7 @@ import { kclManager, } from '@src/lib/singletons' import { VITE_KC_DEV_TOKEN } from '@src/env' -import { line } from '@src/lang/std/sketch' +import { getConstraintInfoKw } from '@src/lang/std/sketch' import { getNodeFromPath } from '@src/lang/queryAst' import type { Node } from '@rust/kcl-lib/bindings/Node' import { err } from '@src/lib/trap' @@ -21,6 +21,8 @@ import { createLiteral, createVariableDeclaration, } from '@src/lang/create' +import { ARG_END_ABSOLUTE, ARG_INTERIOR_ABSOLUTE } from '@src/lang/constants' +import { removeSingleConstraintInfo } from '@src/lang/modifyAst' // Store original method to restore in afterAll @@ -114,132 +116,1186 @@ describe('modelingMachine - XState', () => { }) }) - describe('when in sketch mode', () => { - it('should transition to sketch state when entering sketch mode', async () => { - const code = `sketch001 = startSketchOn(XZ) + const makeStraightSegmentSnippet = (line: string) => ({ + code: `testVar1 = 55 +testVar2 = 66 +testVar3 = 77 +testVar4 = 88 +sketch001 = startSketchOn(XZ) profile001 = startProfile(sketch001, at = [2263.04, -2721.2]) - |> line(end = [16.27, 73.81]) - |> line(end = [75.72, 18.41]) -` +|> line(end = [78, 19]) +|> ${line} +|> line(end = [75.72, 18.41])`, + searchText: line, + }) + const makeCircSnippet = (line: string) => ({ + code: `testVar1 = 55 +testVar2 = 66 +testVar3 = 77 +testVar4 = 88 +testVar5 = 99 +testVar6 = 11 +sketch001 = startSketchOn(YZ) +profile001 = ${line} +`, + searchText: line, + }) + const threePointCirceCode = `circleThreePoint( +sketch001, +p1 = [testVar1, testVar2], +p2 = [testVar3, testVar4], +p3 = [testVar5, testVar6], +)` + const threePointCirceCodeLiterals = `circleThreePoint( +sketch001, +p1 = [281.18, 215.74], +p2 = [295.39, 269.96], +p3 = [342.51, 216.38], +)` - const ast = assertParse(code) + type TestDetails = { + name: string + code: string + searchText: string + constraintIndex: number + expectedResult: string + filter?: string + } - await kclManager.executeAst({ ast }) + const cases: { + [strLibName: string]: { + namedConstantConstraint: TestDetails[] + removeAllConstraintsCases: TestDetails[] + removeIndividualConstraintsCases: TestDetails[] + deleteSegment: Omit[] + } + } = { + line: { + namedConstantConstraint: [ + { + name: 'should constrain line x value', + ...makeStraightSegmentSnippet('line(end = [16.27, 73.81])'), + constraintIndex: 0, + expectedResult: 'line(end = [test_variable,', + }, + { + name: 'should constrain line y value', + ...makeStraightSegmentSnippet('line(end = [16.27, 73.81])'), + constraintIndex: 1, + expectedResult: 'line(end = [16.27, test_variable]', + }, + { + name: 'should constrain line absolute x value', + ...makeStraightSegmentSnippet('line(endAbsolute = [16.27, 73.81])'), + constraintIndex: 0, + expectedResult: 'line(endAbsolute = [test_variable, 73.81]', + }, + { + name: 'should constrain line absolute y value', + ...makeStraightSegmentSnippet('line(endAbsolute = [16.27, 73.81])'), + constraintIndex: 1, + expectedResult: 'line(endAbsolute = [16.27, test_variable]', + }, + ], + removeAllConstraintsCases: [ + { + name: 'should un-constrain rel-line', + ...makeStraightSegmentSnippet('line(end = [testVar1, testVar2])'), + constraintIndex: 0, + expectedResult: 'line(end = [55, 66])', + }, + { + name: 'should un-constrain abs-line', + ...makeStraightSegmentSnippet( + 'line(endAbsolute = [testVar1, testVar2])' + ), + constraintIndex: 0, + expectedResult: 'line(end = [-2286.04, 2768.2]', + // TODO un-constrains to relative line when it should not, expectedResult should be the following + // expectedResult: 'line(endAbsolute = [55, 66]', + }, + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain line x value', + ...makeStraightSegmentSnippet('line(end = [testVar1, testVar2])'), + constraintIndex: 0, + expectedResult: 'line(end = [55, testVar2]', + }, + { + name: 'should un-constrain line y value', + ...makeStraightSegmentSnippet('line(end = [testVar1, testVar2])'), + constraintIndex: 1, + expectedResult: 'line(end = [testVar1, 66]', + }, + { + name: 'should un-constrain line absolute x value', + ...makeStraightSegmentSnippet( + 'line(endAbsolute = [testVar1, testVar2])' + ), + constraintIndex: 0, + // expectedResult: 'line(end = [-2286.04, testVar2])', + // // TODO should not swap from abs to relative, expected should be + expectedResult: 'line(endAbsolute = [55, testVar2]', + }, + { + name: 'should un-constrain line absolute y value', + ...makeStraightSegmentSnippet( + 'line(endAbsolute = [testVar1, testVar2])' + ), + constraintIndex: 1, + expectedResult: 'line(endAbsolute = [testVar1, 66])', + }, + ], + deleteSegment: [ + { + name: 'should delete rel-line', + ...makeStraightSegmentSnippet('line(end = [testVar1, testVar2])'), + }, + { + name: 'should delete abs-line', + ...makeStraightSegmentSnippet( + 'line(endAbsolute = [testVar1, testVar2])' + ), + }, + ], + }, + xLine: { + namedConstantConstraint: [ + { + name: 'should constrain xLine x value', + ...makeStraightSegmentSnippet('xLine(length = 15)'), + constraintIndex: 1, + expectedResult: 'xLine(length = test_variable)', + }, + { + name: 'should constrain xLine x absolute value', + ...makeStraightSegmentSnippet('xLine(endAbsolute = 15)'), + constraintIndex: 1, + expectedResult: 'xLine(endAbsolute = test_variable)', + }, + ], + removeAllConstraintsCases: [ + { + name: 'should un-constrain xLine', + ...makeStraightSegmentSnippet('xLine(length = testVar1)'), + constraintIndex: 1, + expectedResult: 'line(end = [55, 0])', + }, + { + name: 'should un-constrain xLine absolute value', + ...makeStraightSegmentSnippet('xLine(endAbsolute = testVar1)'), + constraintIndex: 1, + expectedResult: 'line(end = [-2286.04, 0])', + // TODO un-constrains to relative line when it should not, expectedResult should be the following + // expectedResult: 'line(endAbsolute = [55, 0])', + }, + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain xLine x value', + ...makeStraightSegmentSnippet('xLine(length = testVar1)'), + constraintIndex: 1, + expectedResult: 'xLine(length = 55)', + }, + { + name: 'should un-constrain xLine x absolute value', + ...makeStraightSegmentSnippet('xLine(endAbsolute = testVar1)'), + constraintIndex: 1, + expectedResult: 'xLine(endAbsolute = 55)', + }, + ], + deleteSegment: [ + { + name: 'should delete xLine', + ...makeStraightSegmentSnippet('xLine(length = 15)'), + }, + { + name: 'should delete xLine', + ...makeStraightSegmentSnippet('xLine(endAbsolute = 15)'), + }, + ], + }, + yLine: { + namedConstantConstraint: [ + { + name: 'should constrain yLine y value', + ...makeStraightSegmentSnippet('yLine(length = 15)'), + constraintIndex: 1, + expectedResult: 'yLine(length = test_variable)', + }, + { + name: 'should constrain yLine y absolute value', + ...makeStraightSegmentSnippet('yLine(endAbsolute = 15)'), + constraintIndex: 1, + expectedResult: 'yLine(endAbsolute = test_variable)', + }, + ], + removeAllConstraintsCases: [ + { + name: 'should un-constrain yLine value', + ...makeStraightSegmentSnippet('yLine(length = testVar1)'), + constraintIndex: 1, + expectedResult: 'line(end = [0, 55])', + }, + { + name: 'should un-constrain yLine absolute value', + ...makeStraightSegmentSnippet('yLine(endAbsolute = testVar1)'), + constraintIndex: 1, + expectedResult: 'line(end = [0, 2757.2])', + // TODO un-constrains to relative line when it should not, expectedResult should be the following + // expectedResult: 'line(endAbsolute = [0, 55])', + }, + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain yLine y value', + ...makeStraightSegmentSnippet('yLine(length = testVar1)'), + constraintIndex: 1, + expectedResult: 'yLine(length = 55)', + }, + { + name: 'should un-constrain yLine y absolute value', + ...makeStraightSegmentSnippet('yLine(endAbsolute = testVar1)'), + constraintIndex: 1, + expectedResult: 'yLine(endAbsolute = 55)', + }, + ], + deleteSegment: [ + { + name: 'should delete yLine', + ...makeStraightSegmentSnippet('yLine(length = 15)'), + }, + { + name: 'should delete yLine abs', + ...makeStraightSegmentSnippet('yLine(endAbsolute = 15)'), + }, + ], + }, + angledLine: { + namedConstantConstraint: [ + { + name: 'should constrain angledLine, angle value', + ...makeStraightSegmentSnippet('angledLine(angle = 45, length = 100)'), + constraintIndex: 0, + expectedResult: 'angledLine(angle = test_variable, length = 100)', + }, + { + name: 'should constrain angledLine, length value', + ...makeStraightSegmentSnippet('angledLine(angle = 45, length = 100)'), + constraintIndex: 1, + expectedResult: 'angledLine(angle = 45, length = test_variable)', + }, + { + name: 'should constrain angledLine, endAbsoluteY value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = 45, endAbsoluteY = 5)' + ), + constraintIndex: 1, + expectedResult: + 'angledLine(angle = 45, endAbsoluteY = test_variable)', + }, + { + name: 'should constrain angledLine, endAbsoluteX value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = 45, endAbsoluteX = 5)' + ), + constraintIndex: 1, + expectedResult: + 'angledLine(angle = 45, endAbsoluteX = test_variable)', + }, + { + name: 'should constrain angledLine, lengthY value', + ...makeStraightSegmentSnippet('angledLine(angle = 45, lengthY = 5)'), + constraintIndex: 1, + expectedResult: 'angledLine(angle = 45, lengthY = test_variable)', + }, + { + name: 'should constrain angledLine, lengthX value', + ...makeStraightSegmentSnippet('angledLine(angle = 45, lengthX = 5)'), + constraintIndex: 1, + expectedResult: 'angledLine(angle = 45, lengthX = test_variable)', + }, + ], + removeAllConstraintsCases: [ + { + name: 'should un-constrain angledLine', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, length = testVar2)' + ), + constraintIndex: 0, + expectedResult: 'line(end = [37.86, 54.06]', + }, + { + name: 'should un-constrain angledLine, endAbsoluteY', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, endAbsoluteY = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'line(end = [1938.31, 2768.2])', + }, + { + name: 'should un-constrain angledLine, endAbsoluteX', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, endAbsoluteX = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'line(end = [-2275.04, -3249.09])', + }, + { + name: 'should un-constrain angledLine, lengthY', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, lengthY = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'line(end = [46.21, 66])', + }, + { + name: 'should un-constrain angledLine, lengthX', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, lengthX = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'line(end = [66, 94.26])', + }, + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain angledLine, angle value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, length = testVar2)' + ), + constraintIndex: 0, + expectedResult: 'angledLine(angle = 55, length = testVar2)', + }, + { + name: 'should un-constrain angledLine, length value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, length = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'angledLine(angle = testVar1, length = 66)', + }, + { + name: 'should un-constrain angledLine, endAbsoluteY value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, endAbsoluteY = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'angledLine(angle = testVar1, endAbsoluteY = 66)', + }, + { + name: 'should un-constrain angledLine, endAbsoluteX value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, endAbsoluteX = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'angledLine(angle = testVar1, endAbsoluteX = 66)', + }, + { + name: 'should un-constrain angledLine, lengthY value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, lengthY = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'angledLine(angle = testVar1, lengthY = 66)', + }, + { + name: 'should un-constrain angledLine, lengthX value', + ...makeStraightSegmentSnippet( + 'angledLine(angle = testVar1, lengthX = testVar2)' + ), + constraintIndex: 1, + expectedResult: 'angledLine(angle = testVar1, lengthX = 66)', + }, + ], + deleteSegment: [ + { + name: 'should delete angledLine, angle length', + ...makeStraightSegmentSnippet('angledLine(angle = 45, length = 100)'), + }, + { + name: 'should delete angledLine, endAbsoluteY', + ...makeStraightSegmentSnippet( + 'angledLine(angle = 45, endAbsoluteY = 5)' + ), + }, + { + name: 'should delete angledLine, endAbsoluteX', + ...makeStraightSegmentSnippet( + 'angledLine(angle = 45, endAbsoluteX = 5)' + ), + }, + { + name: 'should delete angledLine, lengthY', + ...makeStraightSegmentSnippet('angledLine(angle = 45, lengthY = 5)'), + }, + { + name: 'should delete angledLine, lengthX', + ...makeStraightSegmentSnippet('angledLine(angle = 45, lengthX = 5)'), + }, + ], + }, + circle: { + namedConstantConstraint: [ + { + name: 'should constrain circle, radius value', + ...makeCircSnippet( + 'circle(sketch001, center = [140.82, 183.92], radius = 74.18)' + ), + constraintIndex: 0, + expectedResult: + 'circle(sketch001, center = [140.82, 183.92], radius = test_variable)', + }, + { + name: 'should constrain circle, center x value', + ...makeCircSnippet( + 'circle(sketch001, center = [140.82, 183.92], radius = 74.18)' + ), + constraintIndex: 1, + expectedResult: + 'circle(sketch001, center = [test_variable, 183.92], radius = 74.18)', + }, + { + name: 'should constrain circle, center y value', + ...makeCircSnippet( + 'circle(sketch001, center = [140.82, 183.92], radius = 74.18)' + ), + constraintIndex: 2, + expectedResult: + 'circle(sketch001, center = [140.82, test_variable], radius = 74.18)', + }, + ], + removeAllConstraintsCases: [ + // TODO circle when remove all is working + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain circle, radius value', + ...makeCircSnippet( + 'circle(sketch001, center = [140.82, 183.92], radius = testVar1)' + ), + constraintIndex: 0, + expectedResult: + 'circle(sketch001, center = [140.82, 183.92], radius = 55)', + }, + { + name: 'should un-constrain circle, center x value', + ...makeCircSnippet( + 'circle(sketch001, center = [testVar1, testVar2], radius = 74.18)' + ), + constraintIndex: 1, + expectedResult: + 'circle(sketch001, center = [55, testVar2], radius = 74.18)', + }, + { + name: 'should un-constrain circle, center y value', + ...makeCircSnippet( + 'circle(sketch001, center = [testVar1, testVar2], radius = 74.18)' + ), + constraintIndex: 2, + expectedResult: + 'circle(sketch001, center = [testVar1, 66], radius = 74.18)', + }, + ], + deleteSegment: [ + /** TODO once circle has delete implemented */ + ], + }, + circleThreePoint: { + namedConstantConstraint: [ + { + name: 'should constrain circleThreePoint, p1 x value', + ...makeCircSnippet(threePointCirceCodeLiterals), + constraintIndex: 0, + expectedResult: 'p1 = [test_variable, 215.74]', + filter: 'p1', + }, + { + name: 'should constrain circleThreePoint, p1 y value', + ...makeCircSnippet(threePointCirceCodeLiterals), + constraintIndex: 1, + expectedResult: 'p1 = [281.18, test_variable]', + filter: 'p1', + }, + { + name: 'should constrain circleThreePoint, p2 x value', + ...makeCircSnippet(threePointCirceCodeLiterals), + constraintIndex: 0, + expectedResult: 'p2 = [test_variable, 269.96]', + filter: 'p2', + }, + { + name: 'should constrain circleThreePoint, p2 y value', + ...makeCircSnippet(threePointCirceCodeLiterals), + constraintIndex: 1, + expectedResult: 'p2 = [295.39, test_variable]', + filter: 'p2', + }, + { + name: 'should constrain circleThreePoint, p3 x value', + ...makeCircSnippet(threePointCirceCodeLiterals), + constraintIndex: 0, + expectedResult: 'p3 = [test_variable, 216.38]', + filter: 'p3', + }, + { + name: 'should constrain circleThreePoint, p3 y value', + ...makeCircSnippet(threePointCirceCodeLiterals), + constraintIndex: 1, + expectedResult: 'p3 = [342.51, test_variable]', + filter: 'p3', + }, + ], + removeAllConstraintsCases: [ + // TODO circleThreePoint when remove all is working + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain circleThreePoint, p1 x value', + ...makeCircSnippet(threePointCirceCode), + constraintIndex: 0, + expectedResult: 'p1 = [55, testVar2]', + filter: 'p1', + }, + { + name: 'should un-constrain circleThreePoint, p1 y value', + ...makeCircSnippet(threePointCirceCode), + constraintIndex: 1, + expectedResult: 'p1 = [testVar1, 66]', + filter: 'p1', + }, + { + name: 'should un-constrain circleThreePoint, p2 x value', + ...makeCircSnippet(threePointCirceCode), + constraintIndex: 0, + expectedResult: 'p2 = [77, testVar4]', + filter: 'p2', + }, + { + name: 'should un-constrain circleThreePoint, p2 y value', + ...makeCircSnippet(threePointCirceCode), + constraintIndex: 1, + expectedResult: 'p2 = [testVar3, 88]', + filter: 'p2', + }, + { + name: 'should un-constrain circleThreePoint, p3 x value', + ...makeCircSnippet(threePointCirceCode), + constraintIndex: 0, + expectedResult: 'p3 = [99, testVar6]', + filter: 'p3', + }, + { + name: 'should un-constrain circleThreePoint, p3 y value', + ...makeCircSnippet(threePointCirceCode), + constraintIndex: 1, + expectedResult: 'p3 = [testVar5, 11]', + filter: 'p3', + }, + ], + deleteSegment: [ + /**TODO once three point circle has delete implemented */ + ], + }, + tangentialArc: { + namedConstantConstraint: [ + { + name: 'should constrain tangentialArc absolute x value', + ...makeStraightSegmentSnippet( + 'tangentialArc(endAbsolute = [176.11, 19.49])' + ), + constraintIndex: 1, + expectedResult: 'endAbsolute = [test_variable, 19.49]', + }, + { + name: 'should constrain tangentialArc absolute y value', + ...makeStraightSegmentSnippet( + 'tangentialArc(endAbsolute = [176.11, 19.49])' + ), + constraintIndex: 2, + expectedResult: 'endAbsolute = [176.11, test_variable]', + }, + // TODO tangentialArc relative when that's working + ], + removeAllConstraintsCases: [ + // TODO tangentialArc when remove all is working + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain tangentialArc absolute x value', + ...makeStraightSegmentSnippet( + 'tangentialArc(endAbsolute = [testVar1, testVar2])' + ), + constraintIndex: 1, + expectedResult: 'endAbsolute = [55, testVar2]', + }, + { + name: 'should un-constrain tangentialArc absolute y value', + ...makeStraightSegmentSnippet( + 'tangentialArc(endAbsolute = [testVar1, testVar2])' + ), + constraintIndex: 2, + expectedResult: 'endAbsolute = [testVar1, 66]', + }, + ], + deleteSegment: [ + { + name: 'should delete tangentialArc absolute', + ...makeStraightSegmentSnippet( + 'tangentialArc(endAbsolute = [176.11, 19.49])' + ), + }, + ], + }, + arc: { + namedConstantConstraint: [ + { + name: 'should constrain threePoint Arc interior x value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [379.93, 103.92], endAbsolute = [386.2, 162.89])' + ), + constraintIndex: 0, + expectedResult: 'interiorAbsolute = [test_variable, 103.92]', + filter: ARG_INTERIOR_ABSOLUTE, + }, + { + name: 'should constrain threePoint Arc interior y value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [379.93, 103.92], endAbsolute = [386.2, 162.89])' + ), + constraintIndex: 1, + expectedResult: 'interiorAbsolute = [379.93, test_variable]', + filter: ARG_INTERIOR_ABSOLUTE, + }, + { + name: 'should constrain threePoint Arc end x value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [379.93, 103.92], endAbsolute = [386.2, 162.89])' + ), + constraintIndex: 0, + expectedResult: 'endAbsolute = [test_variable, 162.89]', + filter: ARG_END_ABSOLUTE, + }, + { + name: 'should constrain threePoint Arc end y value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [379.93, 103.92], endAbsolute = [386.2, 162.89])' + ), + constraintIndex: 1, + expectedResult: 'endAbsolute = [386.2, test_variable]', + filter: ARG_END_ABSOLUTE, + }, + // TODO do other kwargs for arc + ], + removeAllConstraintsCases: [ + // TODO arc when remove all is working + ], + removeIndividualConstraintsCases: [ + { + name: 'should un-constrain threePoint Arc interior x value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [testVar1, testVar2], endAbsolute = [testVar3, testVar4])' + ), + constraintIndex: 0, + expectedResult: 'interiorAbsolute = [55, testVar2]', + filter: ARG_INTERIOR_ABSOLUTE, + }, + { + name: 'should un-constrain threePoint Arc interior y value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [testVar1, testVar2], endAbsolute = [testVar3, testVar4])' + ), + constraintIndex: 1, + expectedResult: 'interiorAbsolute = [testVar1, 66]', + filter: ARG_INTERIOR_ABSOLUTE, + }, + { + name: 'should un-constrain threePoint Arc end x value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [testVar1, testVar2], endAbsolute = [testVar3, testVar4])' + ), + constraintIndex: 0, + expectedResult: 'endAbsolute = [77, testVar4]', + filter: ARG_END_ABSOLUTE, + }, + { + name: 'should un-constrain threePoint Arc end y value', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [testVar1, testVar2], endAbsolute = [testVar3, testVar4])' + ), + constraintIndex: 1, + expectedResult: 'endAbsolute = [testVar3, 88]', + filter: ARG_END_ABSOLUTE, + }, + ], + deleteSegment: [ + { + name: 'should delete threePoint Arc (interior, end)', + ...makeStraightSegmentSnippet( + 'arc(interiorAbsolute = [379.93, 103.92], endAbsolute = [386.2, 162.89])' + ), + }, + ], + }, + } - expect(kclManager.errors).toEqual([]) + describe('Deleting segment with three dot menu', () => { + const namedConstantConstraintCases = Object.values(cases).flatMap( + (caseGroup) => caseGroup.deleteSegment + ) + namedConstantConstraintCases.forEach( + ({ name, code, searchText, filter }) => { + it(name, async () => { + const indexOfInterest = code.indexOf(searchText) - const indexOfInterest = code.indexOf('[16.27, 73.81]') + const ast = assertParse(code) - // segment artifact with that source range - const artifact = [...kclManager.artifactGraph].find( - ([_, artifact]) => - artifact?.type === 'segment' && - artifact.codeRef.range[0] <= indexOfInterest && - indexOfInterest <= artifact.codeRef.range[1] - )?.[1] - if (!artifact || !('codeRef' in artifact)) { - throw new Error('Artifact not found or invalid artifact structure') - } + await kclManager.executeAst({ ast }) - const actor = createActor(modelingMachine, { - input: modelingMachineDefaultContext, - }).start() + expect(kclManager.errors).toEqual([]) - // Send event to transition to sketch mode - actor.send({ - type: 'Set selection', - data: { - selectionType: 'mirrorCodeMirrorSelections', - selection: { - graphSelections: [ - { - artifact: artifact, - codeRef: artifact.codeRef, + // segment artifact with that source range + const artifact = [...kclManager.artifactGraph].find( + ([_, artifact]) => + artifact?.type === 'segment' && + artifact.codeRef.range[0] <= indexOfInterest && + indexOfInterest <= artifact.codeRef.range[1] + )?.[1] + if (!artifact || !('codeRef' in artifact)) { + throw new Error('Artifact not found or invalid artifact structure') + } + + const actor = createActor(modelingMachine, { + input: modelingMachineDefaultContext, + }).start() + + // Send event to transition to sketch mode + actor.send({ + type: 'Set selection', + data: { + selectionType: 'mirrorCodeMirrorSelections', + selection: { + graphSelections: [ + { + artifact: artifact, + codeRef: artifact.codeRef, + }, + ], + otherSelections: [], }, - ], - otherSelections: [], - }, - }, - }) - actor.send({ type: 'Enter sketch' }) - - // Check that we're in the sketch state - let state = actor.getSnapshot() - expect(state.value).toBe('animating to existing sketch') - - // wait for it to transition - await waitForCondition(() => { - const snapshot = actor.getSnapshot() - return snapshot.value !== 'animating to existing sketch' - }, 5000) - - // After the condition is met, do the actual assertion - expect(actor.getSnapshot().value).toEqual({ - Sketch: { SketchIdle: 'scene drawn' }, - }) - - const getConstraintInfo = line.getConstraintInfo - const callExp = getNodeFromPath>( - kclManager.ast, - artifact.codeRef.pathToNode, - 'CallExpressionKw' - ) - if (err(callExp)) { - throw new Error('Failed to get CallExpressionKw node') - } - const constraintInfo = getConstraintInfo( - callExp.node, - codeManager.code, - artifact.codeRef.pathToNode - ) - const first = constraintInfo[0] - - // Now that we're in sketchIdle state, test the "Constrain with named value" event - actor.send({ - type: 'Constrain with named value', - data: { - currentValue: { - valueText: first.value, - pathToNode: first.pathToNode, - variableName: 'test_variable', - }, - // Use type assertion to mock the complex type - namedValue: { - valueText: '20', - variableName: 'test_variable', - insertIndex: 0, - valueCalculated: '20', - variableDeclarationAst: createVariableDeclaration( - 'test_variable', - createLiteral('20') - ), - variableIdentifierAst: createIdentifier('test_variable') as any, - valueAst: createLiteral('20'), - }, - }, - }) - - // Wait for the state to change in response to the constraint - await waitForCondition(() => { - const snapshot = actor.getSnapshot() - // Check if we've transitioned to a different state - return ( - JSON.stringify(snapshot.value) !== - JSON.stringify({ - Sketch: { SketchIdle: 'set up segments' }, + }, }) - ) - }, 5000) + actor.send({ type: 'Enter sketch' }) - await waitForCondition(() => { - const snapshot = actor.getSnapshot() - // Check if we've transitioned to a different state - return ( - JSON.stringify(snapshot.value) !== - JSON.stringify({ Sketch: 'Converting to named value' }) - ) - }, 5000) - expect(codeManager.code).toContain('line(end = [test_variable,') - }, 10_000) + // Check that we're in the sketch state + let state = actor.getSnapshot() + expect(state.value).toBe('animating to existing sketch') + + // wait for it to transition + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + return snapshot.value !== 'animating to existing sketch' + }, 5000) + + // After the condition is met, do the actual assertion + expect(actor.getSnapshot().value).toEqual({ + Sketch: { SketchIdle: 'scene drawn' }, + }) + + const callExp = getNodeFromPath>( + kclManager.ast, + artifact.codeRef.pathToNode, + 'CallExpressionKw' + ) + if (err(callExp)) { + throw new Error('Failed to get CallExpressionKw node') + } + const constraintInfo = getConstraintInfoKw( + callExp.node, + codeManager.code, + artifact.codeRef.pathToNode, + filter + ) + const constraint = constraintInfo[0] + + // Now that we're in sketchIdle state, test the "Constrain with named value" event + actor.send({ + type: 'Delete segment', + data: constraint.pathToNode, + }) + + // Wait for the state to change in response to the constraint + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + // Check if we've transitioned to a different state + return ( + JSON.stringify(snapshot.value) !== + JSON.stringify({ + Sketch: { SketchIdle: 'set up segments' }, + }) + ) + }, 5000) + + const startTime = Date.now() + while ( + codeManager.code.includes(searchText) && + Date.now() - startTime < 5000 + ) { + await new Promise((resolve) => setTimeout(resolve, 100)) + } + expect(codeManager.code).not.toContain(searchText) + }, 10_000) + } + ) + }) + describe('Adding segment overlay constraints', () => { + const namedConstantConstraintCases = Object.values(cases).flatMap( + (caseGroup) => caseGroup.namedConstantConstraint + ) + namedConstantConstraintCases.forEach( + ({ name, code, searchText, constraintIndex, expectedResult, filter }) => { + it(name, async () => { + const indexOfInterest = code.indexOf(searchText) + + const ast = assertParse(code) + + await kclManager.executeAst({ ast }) + + expect(kclManager.errors).toEqual([]) + + // segment artifact with that source range + const artifact = [...kclManager.artifactGraph].find( + ([_, artifact]) => + artifact?.type === 'segment' && + artifact.codeRef.range[0] <= indexOfInterest && + indexOfInterest <= artifact.codeRef.range[1] + )?.[1] + if (!artifact || !('codeRef' in artifact)) { + throw new Error('Artifact not found or invalid artifact structure') + } + + const actor = createActor(modelingMachine, { + input: modelingMachineDefaultContext, + }).start() + + // Send event to transition to sketch mode + actor.send({ + type: 'Set selection', + data: { + selectionType: 'mirrorCodeMirrorSelections', + selection: { + graphSelections: [ + { + artifact: artifact, + codeRef: artifact.codeRef, + }, + ], + otherSelections: [], + }, + }, + }) + actor.send({ type: 'Enter sketch' }) + + // Check that we're in the sketch state + let state = actor.getSnapshot() + expect(state.value).toBe('animating to existing sketch') + + // wait for it to transition + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + return snapshot.value !== 'animating to existing sketch' + }, 5000) + + // After the condition is met, do the actual assertion + expect(actor.getSnapshot().value).toEqual({ + Sketch: { SketchIdle: 'scene drawn' }, + }) + + const callExp = getNodeFromPath>( + kclManager.ast, + artifact.codeRef.pathToNode, + 'CallExpressionKw' + ) + if (err(callExp)) { + throw new Error('Failed to get CallExpressionKw node') + } + const constraintInfo = getConstraintInfoKw( + callExp.node, + codeManager.code, + artifact.codeRef.pathToNode, + filter + ) + const constraint = constraintInfo[constraintIndex] + + // Now that we're in sketchIdle state, test the "Constrain with named value" event + actor.send({ + type: 'Constrain with named value', + data: { + currentValue: { + valueText: constraint.value, + pathToNode: constraint.pathToNode, + variableName: 'test_variable', + }, + // Use type assertion to mock the complex type + namedValue: { + valueText: '20', + variableName: 'test_variable', + insertIndex: 0, + valueCalculated: '20', + variableDeclarationAst: createVariableDeclaration( + 'test_variable', + createLiteral('20') + ), + variableIdentifierAst: createIdentifier('test_variable') as any, + valueAst: createLiteral('20'), + }, + }, + }) + + // Wait for the state to change in response to the constraint + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + // Check if we've transitioned to a different state + return ( + JSON.stringify(snapshot.value) !== + JSON.stringify({ + Sketch: { SketchIdle: 'set up segments' }, + }) + ) + }, 5000) + + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + // Check if we've transitioned to a different state + return ( + JSON.stringify(snapshot.value) !== + JSON.stringify({ Sketch: 'Converting to named value' }) + ) + }, 5000) + expect(codeManager.code).toContain(expectedResult) + }, 10_000) + } + ) + }) + describe('removing individual constraints with segment overlay events', () => { + const removeIndividualConstraintsCases = Object.values(cases).flatMap( + (caseGroup) => caseGroup.removeIndividualConstraintsCases + ) + + removeIndividualConstraintsCases.forEach( + ({ name, code, searchText, constraintIndex, expectedResult, filter }) => { + it(name, async () => { + const indexOfInterest = code.indexOf(searchText) + + const ast = assertParse(code) + + await kclManager.executeAst({ ast }) + + expect(kclManager.errors).toEqual([]) + + // segment artifact with that source range + const artifact = [...kclManager.artifactGraph].find( + ([_, artifact]) => + artifact?.type === 'segment' && + artifact.codeRef.range[0] <= indexOfInterest && + indexOfInterest <= artifact.codeRef.range[1] + )?.[1] + if (!artifact || !('codeRef' in artifact)) { + throw new Error('Artifact not found or invalid artifact structure') + } + + const actor = createActor(modelingMachine, { + input: modelingMachineDefaultContext, + }).start() + + // Send event to transition to sketch mode + actor.send({ + type: 'Set selection', + data: { + selectionType: 'mirrorCodeMirrorSelections', + selection: { + graphSelections: [ + { + artifact: artifact, + codeRef: artifact.codeRef, + }, + ], + otherSelections: [], + }, + }, + }) + actor.send({ type: 'Enter sketch' }) + + // Check that we're in the sketch state + let state = actor.getSnapshot() + expect(state.value).toBe('animating to existing sketch') + + // wait for it to transition + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + return snapshot.value !== 'animating to existing sketch' + }, 5000) + + // After the condition is met, do the actual assertion + expect(actor.getSnapshot().value).toEqual({ + Sketch: { SketchIdle: 'scene drawn' }, + }) + + const callExp = getNodeFromPath>( + kclManager.ast, + artifact.codeRef.pathToNode, + 'CallExpressionKw' + ) + if (err(callExp)) { + throw new Error('Failed to get CallExpressionKw node') + } + const constraintInfo = getConstraintInfoKw( + callExp.node, + codeManager.code, + artifact.codeRef.pathToNode, + filter + ) + const constraint = constraintInfo[constraintIndex] + console.log('constraint', constraint) + if (!constraint.argPosition) { + throw new Error( + `Constraint at index ${constraintIndex} does not have argPosition` + ) + } + + const mod = removeSingleConstraintInfo( + constraint.pathToNode, + constraint.argPosition, + ast, + kclManager.variables + ) + if (!mod) { + throw new Error('Failed to remove constraint info') + } + const codeRecast = recast(mod.modifiedAst) + + expect(codeRecast).toContain(expectedResult) + }, 10_000) + } + ) + }) + describe('Removing segment overlay constraints', () => { + const removeAllConstraintsCases = Object.values(cases).flatMap( + (caseGroup) => caseGroup.removeAllConstraintsCases + ) + + removeAllConstraintsCases.forEach( + ({ name, code, searchText, constraintIndex, expectedResult, filter }) => { + it(name, async () => { + const indexOfInterest = code.indexOf(searchText) + + const ast = assertParse(code) + + await kclManager.executeAst({ ast }) + + expect(kclManager.errors).toEqual([]) + + // segment artifact with that source range + const artifact = [...kclManager.artifactGraph].find( + ([_, artifact]) => + artifact?.type === 'segment' && + artifact.codeRef.range[0] <= indexOfInterest && + indexOfInterest <= artifact.codeRef.range[1] + )?.[1] + if (!artifact || !('codeRef' in artifact)) { + throw new Error('Artifact not found or invalid artifact structure') + } + + const actor = createActor(modelingMachine, { + input: modelingMachineDefaultContext, + }).start() + + // Send event to transition to sketch mode + actor.send({ + type: 'Set selection', + data: { + selectionType: 'mirrorCodeMirrorSelections', + selection: { + graphSelections: [ + { + artifact: artifact, + codeRef: artifact.codeRef, + }, + ], + otherSelections: [], + }, + }, + }) + actor.send({ type: 'Enter sketch' }) + + // Check that we're in the sketch state + let state = actor.getSnapshot() + expect(state.value).toBe('animating to existing sketch') + + // wait for it to transition + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + return snapshot.value !== 'animating to existing sketch' + }, 5000) + + // After the condition is met, do the actual assertion + expect(actor.getSnapshot().value).toEqual({ + Sketch: { SketchIdle: 'scene drawn' }, + }) + + const callExp = getNodeFromPath>( + kclManager.ast, + artifact.codeRef.pathToNode, + 'CallExpressionKw' + ) + if (err(callExp)) { + throw new Error('Failed to get CallExpressionKw node') + } + const constraintInfo = getConstraintInfoKw( + callExp.node, + codeManager.code, + artifact.codeRef.pathToNode, + filter + ) + const constraint = constraintInfo[constraintIndex] + + // Now that we're in sketchIdle state, test the "Constrain with named value" event + actor.send({ + type: 'Constrain remove constraints', + data: constraint.pathToNode, + }) + + // Wait for the state to change in response to the constraint + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + // Check if we've transitioned to a different state + return ( + JSON.stringify(snapshot.value) !== + JSON.stringify({ + Sketch: { SketchIdle: 'set up segments' }, + }) + ) + }, 5000) + + await waitForCondition(() => { + const snapshot = actor.getSnapshot() + // Check if we've transitioned to a different state + return ( + JSON.stringify(snapshot.value) !== + JSON.stringify({ Sketch: 'Constrain remove constraints' }) + ) + }, 5000) + const startTime = Date.now() + while ( + !codeManager.code.includes(expectedResult) && + Date.now() - startTime < 5000 + ) { + await new Promise((resolve) => setTimeout(resolve, 100)) + } + expect(codeManager.code).toContain(expectedResult) + }, 10_000) + } + ) }) }) diff --git a/src/routes/Home.tsx b/src/routes/Home.tsx index 89af650de..b323216bd 100644 --- a/src/routes/Home.tsx +++ b/src/routes/Home.tsx @@ -521,7 +521,7 @@ function ProjectGrid({ return (
{state.matches(SystemIOMachineStates.readingFolders) ? ( - Loading your Projects... + Loading your Projects... ) : ( <> {searchResults.length > 0 ? ( diff --git a/src/routes/SignIn.tsx b/src/routes/SignIn.tsx index 19ae83e57..161f8be26 100644 --- a/src/routes/SignIn.tsx +++ b/src/routes/SignIn.tsx @@ -10,12 +10,11 @@ import { VITE_KC_API_BASE_URL, VITE_KC_SITE_BASE_URL } from '@src/env' import { APP_NAME } from '@src/lib/constants' import { isDesktop } from '@src/lib/isDesktop' import { openExternalBrowserIfDesktop } from '@src/lib/openWindow' -import { PATHS } from '@src/lib/paths' import { Themes, getSystemTheme } from '@src/lib/theme' import { reportRejection } from '@src/lib/trap' import { toSync } from '@src/lib/utils' import { authActor, useSettings } from '@src/lib/singletons' -import { APP_VERSION } from '@src/routes/utils' +import { APP_VERSION, generateSignInUrl } from '@src/routes/utils' const subtleBorder = 'border border-solid border-chalkboard-30 dark:border-chalkboard-80' @@ -36,11 +35,7 @@ const SignIn = () => { const { app: { theme }, } = useSettings() - const signInUrl = `${VITE_KC_SITE_BASE_URL}${ - PATHS.SIGN_IN - }?callbackUrl=${encodeURIComponent( - typeof window !== 'undefined' && window.location.href.replace('signin', '') - )}` + const signInUrl = generateSignInUrl() const kclSampleUrl = `${VITE_KC_SITE_BASE_URL}/docs/kcl-samples/car-wheel-assembly` const getThemeText = useCallback( diff --git a/src/routes/utils.ts b/src/routes/utils.ts index a6c7536cb..4a0ab2e19 100644 --- a/src/routes/utils.ts +++ b/src/routes/utils.ts @@ -1,6 +1,7 @@ -import { NODE_ENV } from '@src/env' +import { NODE_ENV, VITE_KC_SITE_BASE_URL } from '@src/env' import { isDesktop } from '@src/lib/isDesktop' import { IS_PLAYWRIGHT_KEY } from '@src/lib/constants' +import { PATHS } from '@src/lib/paths' const isTestEnv = window?.localStorage.getItem(IS_PLAYWRIGHT_KEY) === 'true' @@ -27,3 +28,11 @@ export function getReleaseUrl(version: string = APP_VERSION) { return `https://github.com/KittyCAD/modeling-app/releases/tag/v${version}` } + +export function generateSignInUrl() { + return `${VITE_KC_SITE_BASE_URL}${ + PATHS.SIGN_IN + }?callbackUrl=${encodeURIComponent( + typeof window !== 'undefined' && window.location.href.replace('signin', '') + )}` +}