Compare commits
1 Commits
kurt-add-e
...
dependabot
Author | SHA1 | Date | |
---|---|---|---|
6e2274a6c4 |
2
.github/workflows/playwright.yml
vendored
2
.github/workflows/playwright.yml
vendored
@ -35,7 +35,7 @@ jobs:
|
|||||||
|
|
||||||
playwright-ubuntu:
|
playwright-ubuntu:
|
||||||
timeout-minutes: 30
|
timeout-minutes: 30
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest-8-cores
|
||||||
strategy:
|
strategy:
|
||||||
fail-fast: false
|
fail-fast: false
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -151,12 +151,11 @@ test.describe('Sketch tests', () => {
|
|||||||
|
|
||||||
await page.mouse.click(700, 200)
|
await page.mouse.click(700, 200)
|
||||||
|
|
||||||
await expect.poll(u.normalisedEditorCode)
|
await expect(page.locator('.cm-content')).toHaveText(
|
||||||
.toBe(`const sketch001 = startSketchOn('XZ')
|
`const sketch001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([12.34, -12.34], %)
|
|> startProfileAt([4.61, -14.01], %)
|
||||||
|> line([-12.34, 12.34], %)
|
|> line([0.31, 16.47], %)`
|
||||||
|
)
|
||||||
`)
|
|
||||||
})
|
})
|
||||||
test('Can exit selection of face', async ({ page }) => {
|
test('Can exit selection of face', async ({ page }) => {
|
||||||
// Load the app with the code panes
|
// Load the app with the code panes
|
||||||
|
@ -204,24 +204,19 @@ test.describe('Test network and connection issues', () => {
|
|||||||
|
|
||||||
// Ensure we can continue sketching
|
// Ensure we can continue sketching
|
||||||
await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 20)
|
await page.mouse.click(startXPx + PUR * 20, 500 - PUR * 20)
|
||||||
await expect.poll(u.normalisedEditorCode)
|
await expect(page.locator('.cm-content'))
|
||||||
.toBe(`const sketch001 = startSketchOn('XZ')
|
.toHaveText(`const sketch001 = startSketchOn('XZ')
|
||||||
|> startProfileAt([12.34, -12.34], %)
|
|> startProfileAt(${commonPoints.startAt}, %)
|
||||||
|> line([12.34, 0], %)
|
|> line([${commonPoints.num1}, 0], %)
|
||||||
|> line([-12.34, 12.34], %)
|
|> line([-8.84, 8.75], %)`)
|
||||||
|
|
||||||
`)
|
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
await page.mouse.click(startXPx, 500 - PUR * 20)
|
await page.mouse.click(startXPx, 500 - PUR * 20)
|
||||||
|
await expect(page.locator('.cm-content'))
|
||||||
await expect.poll(u.normalisedEditorCode)
|
.toHaveText(`const sketch001 = startSketchOn('XZ')
|
||||||
.toBe(`const sketch001 = startSketchOn('XZ')
|
|> startProfileAt(${commonPoints.startAt}, %)
|
||||||
|> startProfileAt([12.34, -12.34], %)
|
|> line([${commonPoints.num1}, 0], %)
|
||||||
|> line([12.34, 0], %)
|
|> line([-8.84, 8.75], %)
|
||||||
|> line([-12.34, 12.34], %)
|
|> line([-5.6, 0], %)`)
|
||||||
|> line([-12.34, 0], %)
|
|
||||||
|
|
||||||
`)
|
|
||||||
|
|
||||||
// Unequip line tool
|
// Unequip line tool
|
||||||
await page.keyboard.press('Escape')
|
await page.keyboard.press('Escape')
|
||||||
|
@ -268,18 +268,6 @@ async function waitForAuthAndLsp(page: Page) {
|
|||||||
return waitForLspPromise
|
return waitForLspPromise
|
||||||
}
|
}
|
||||||
|
|
||||||
export function normaliseKclNumbers(code: string, ignoreZero = true): string {
|
|
||||||
const numberRegexp = /(?<!\w)-?\b\d+(\.\d+)?\b(?!\w)/g
|
|
||||||
const replaceNumber = (number: string) => {
|
|
||||||
if (ignoreZero && (number === '0' || number === '-0')) return number
|
|
||||||
const sign = number.startsWith('-') ? '-' : ''
|
|
||||||
return `${sign}12.34`
|
|
||||||
}
|
|
||||||
const replaceNumbers = (text: string) =>
|
|
||||||
text.replace(numberRegexp, replaceNumber)
|
|
||||||
return replaceNumbers(code)
|
|
||||||
}
|
|
||||||
|
|
||||||
export async function getUtils(page: Page) {
|
export async function getUtils(page: Page) {
|
||||||
// Chrome devtools protocol session only works in Chromium
|
// Chrome devtools protocol session only works in Chromium
|
||||||
const browserType = page.context().browser()?.browserType().name()
|
const browserType = page.context().browser()?.browserType().name()
|
||||||
@ -342,11 +330,6 @@ export async function getUtils(page: Page) {
|
|||||||
.boundingBox()
|
.boundingBox()
|
||||||
.then((box) => ({ ...box, x: box?.x || 0, y: box?.y || 0 })),
|
.then((box) => ({ ...box, x: box?.x || 0, y: box?.y || 0 })),
|
||||||
codeLocator: page.locator('.cm-content'),
|
codeLocator: page.locator('.cm-content'),
|
||||||
normalisedEditorCode: async () => {
|
|
||||||
const code = await page.locator('.cm-content').innerText()
|
|
||||||
return normaliseKclNumbers(code)
|
|
||||||
},
|
|
||||||
normalisedCode: (code: string) => normaliseKclNumbers(code),
|
|
||||||
canvasLocator: page.getByTestId('client-side-scene'),
|
canvasLocator: page.getByTestId('client-side-scene'),
|
||||||
doAndWaitForCmd: async (
|
doAndWaitForCmd: async (
|
||||||
fn: () => Promise<void>,
|
fn: () => Promise<void>,
|
||||||
|
@ -80,11 +80,11 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %, $seg01)
|
|> line([74.36, 130.4], %, $seg01)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> angledLine([segAng(seg01), yo], %)
|
|> angledLine([segAng(seg01), yo], %)
|
||||||
|> line([41.19, 58.97 + 5], %)
|
|> line([41.19, 28.97 + 5], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 120], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-385.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|> yLine(-170.06, %)
|
|> yLine(-264.06, %)
|
||||||
|> xLine(segLen(seg_what), %)
|
|> xLine(segLen(seg_what), %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
|> lineTo([profileStartX(%), profileStartY(%)], %)`
|
||||||
)
|
)
|
||||||
@ -138,7 +138,7 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %, $seg01)
|
|> line([74.36, 130.4], %, $seg01)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> angledLine([segAng(seg01), 78.33], %)
|
|> angledLine([segAng(seg01), 78.33], %)
|
||||||
|> line([51.19, 48.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
@ -237,7 +237,7 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %)
|
|> line([74.36, 130.4], %)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> line([9.16, 77.79], %)
|
|> line([9.16, 77.79], %)
|
||||||
|> line([51.19, 48.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
@ -343,7 +343,7 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %)
|
|> line([74.36, 130.4], %)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> line([9.16, 77.79], %)
|
|> line([9.16, 77.79], %)
|
||||||
|> line([51.19, 48.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
@ -450,7 +450,7 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %)
|
|> line([74.36, 130.4], %)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> line([9.16, 77.79], %)
|
|> line([9.16, 77.79], %)
|
||||||
|> line([51.19, 48.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
@ -560,7 +560,7 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %)
|
|> line([74.36, 130.4], %)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> line([9.16, 77.79], %)
|
|> line([9.16, 77.79], %)
|
||||||
|> line([51.19, 48.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
@ -613,14 +613,14 @@ const part002 = startSketchOn('XZ')
|
|||||||
codeAfter: [
|
codeAfter: [
|
||||||
`|> yLine(130.4, %)`,
|
`|> yLine(130.4, %)`,
|
||||||
`|> yLine(77.79, %)`,
|
`|> yLine(77.79, %)`,
|
||||||
`|> yLine(48.97, %)`,
|
`|> yLine(28.97, %)`,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
codeAfter: [
|
codeAfter: [
|
||||||
`|> xLine(74.36, %)`,
|
`|> xLine(74.36, %)`,
|
||||||
`|> xLine(9.16, %)`,
|
`|> xLine(9.16, %)`,
|
||||||
`|> xLine(51.19, %)`,
|
`|> xLine(41.19, %)`,
|
||||||
],
|
],
|
||||||
constraintName: 'Horizontal',
|
constraintName: 'Horizontal',
|
||||||
},
|
},
|
||||||
@ -636,7 +636,7 @@ const part001 = startSketchOn('XZ')
|
|||||||
|> line([74.36, 130.4], %)
|
|> line([74.36, 130.4], %)
|
||||||
|> line([78.92, -120.11], %)
|
|> line([78.92, -120.11], %)
|
||||||
|> line([9.16, 77.79], %)
|
|> line([9.16, 77.79], %)
|
||||||
|> line([51.19, 48.97], %)
|
|> line([41.19, 28.97], %)
|
||||||
const part002 = startSketchOn('XZ')
|
const part002 = startSketchOn('XZ')
|
||||||
|> startProfileAt([299.05, 231.45], %)
|
|> startProfileAt([299.05, 231.45], %)
|
||||||
|> xLine(-425.34, %, $seg_what)
|
|> xLine(-425.34, %, $seg_what)
|
||||||
|
@ -468,7 +468,7 @@ test('Sketch on face', async ({ page }) => {
|
|||||||
|
|
||||||
await u.openAndClearDebugPanel()
|
await u.openAndClearDebugPanel()
|
||||||
await u.doAndWaitForCmd(
|
await u.doAndWaitForCmd(
|
||||||
() => page.mouse.click(625, 165),
|
() => page.mouse.click(625, 133),
|
||||||
'default_camera_get_settings',
|
'default_camera_get_settings',
|
||||||
true
|
true
|
||||||
)
|
)
|
||||||
@ -498,14 +498,13 @@ test('Sketch on face', async ({ page }) => {
|
|||||||
await expect(page.locator('.cm-content')).not.toHaveText(previousCodeContent)
|
await expect(page.locator('.cm-content')).not.toHaveText(previousCodeContent)
|
||||||
previousCodeContent = await page.locator('.cm-content').innerText()
|
previousCodeContent = await page.locator('.cm-content').innerText()
|
||||||
|
|
||||||
await expect.poll(u.normalisedEditorCode).toContain(
|
await expect(page.locator('.cm-content'))
|
||||||
u.normalisedCode(`const sketch002 = startSketchOn(extrude001, seg01)
|
.toContainText(`const sketch002 = startSketchOn(extrude001, seg01)
|
||||||
|> startProfileAt([-12.94, 6.6], %)
|
|> startProfileAt([-12.94, 6.6], %)
|
||||||
|> line([2.45, -0.2], %)
|
|> line([2.45, -0.2], %)
|
||||||
|> line([-2.6, -1.25], %)
|
|> line([-2.6, -1.25], %)
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
||||||
|> close(%)`)
|
|> close(%)`)
|
||||||
)
|
|
||||||
|
|
||||||
await u.openAndClearDebugPanel()
|
await u.openAndClearDebugPanel()
|
||||||
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
||||||
@ -514,7 +513,7 @@ test('Sketch on face', async ({ page }) => {
|
|||||||
await u.updateCamPosition([1049, 239, 686])
|
await u.updateCamPosition([1049, 239, 686])
|
||||||
await u.closeDebugPanel()
|
await u.closeDebugPanel()
|
||||||
|
|
||||||
await page.getByText('startProfileAt([-12').click()
|
await page.getByText('startProfileAt([-12.94, 6.6], %)').click()
|
||||||
await expect(page.getByRole('button', { name: 'Edit Sketch' })).toBeVisible()
|
await expect(page.getByRole('button', { name: 'Edit Sketch' })).toBeVisible()
|
||||||
await page.getByRole('button', { name: 'Edit Sketch' }).click()
|
await page.getByRole('button', { name: 'Edit Sketch' }).click()
|
||||||
await page.waitForTimeout(400)
|
await page.waitForTimeout(400)
|
||||||
@ -550,7 +549,7 @@ test('Sketch on face', async ({ page }) => {
|
|||||||
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
await page.getByRole('button', { name: 'Exit Sketch' }).click()
|
||||||
await u.expectCmdLog('[data-message-type="execution-done"]')
|
await u.expectCmdLog('[data-message-type="execution-done"]')
|
||||||
|
|
||||||
await page.getByText('startProfileAt([-12').click()
|
await page.getByText('startProfileAt([-12.94, 6.6], %)').click()
|
||||||
|
|
||||||
await expect(page.getByRole('button', { name: 'Extrude' })).not.toBeDisabled()
|
await expect(page.getByRole('button', { name: 'Extrude' })).not.toBeDisabled()
|
||||||
await page.waitForTimeout(100)
|
await page.waitForTimeout(100)
|
||||||
|
@ -31,7 +31,7 @@
|
|||||||
"@tauri-apps/plugin-shell": "^2.0.0-beta.7",
|
"@tauri-apps/plugin-shell": "^2.0.0-beta.7",
|
||||||
"@tauri-apps/plugin-updater": "^2.0.0-beta.6",
|
"@tauri-apps/plugin-updater": "^2.0.0-beta.6",
|
||||||
"@ts-stack/markdown": "^1.5.0",
|
"@ts-stack/markdown": "^1.5.0",
|
||||||
"@tweenjs/tween.js": "^23.1.1",
|
"@tweenjs/tween.js": "^25.0.0",
|
||||||
"@xstate/inspect": "^0.8.0",
|
"@xstate/inspect": "^0.8.0",
|
||||||
"@xstate/react": "^3.2.2",
|
"@xstate/react": "^3.2.2",
|
||||||
"codemirror": "^6.0.1",
|
"codemirror": "^6.0.1",
|
||||||
|
@ -9,7 +9,6 @@ import { useModelingContext } from './useModelingContext'
|
|||||||
import { getEventForSelectWithPoint } from 'lib/selections'
|
import { getEventForSelectWithPoint } from 'lib/selections'
|
||||||
import {
|
import {
|
||||||
getCapCodeRef,
|
getCapCodeRef,
|
||||||
getExtrudeEdgeCodeRef,
|
|
||||||
getExtrusionFromSuspectedExtrudeSurface,
|
getExtrusionFromSuspectedExtrudeSurface,
|
||||||
getSolid2dCodeRef,
|
getSolid2dCodeRef,
|
||||||
getWallCodeRef,
|
getWallCodeRef,
|
||||||
@ -61,13 +60,6 @@ export function useEngineConnectionSubscriptions() {
|
|||||||
? [codeRef.range]
|
? [codeRef.range]
|
||||||
: [codeRef.range, extrusion.codeRef.range]
|
: [codeRef.range, extrusion.codeRef.range]
|
||||||
)
|
)
|
||||||
} else if (artifact?.type === 'extrudeEdge') {
|
|
||||||
const codeRef = getExtrudeEdgeCodeRef(
|
|
||||||
artifact,
|
|
||||||
engineCommandManager.artifactGraph
|
|
||||||
)
|
|
||||||
if (err(codeRef)) return
|
|
||||||
editorManager.setHighlightRange([codeRef.range])
|
|
||||||
} else if (artifact?.type === 'segment') {
|
} else if (artifact?.type === 'segment') {
|
||||||
editorManager.setHighlightRange([
|
editorManager.setHighlightRange([
|
||||||
artifact?.codeRef?.range || [0, 0],
|
artifact?.codeRef?.range || [0, 0],
|
||||||
|
@ -35,7 +35,6 @@ export function addFillet(
|
|||||||
node: Program,
|
node: Program,
|
||||||
pathToSegmentNode: PathToNode,
|
pathToSegmentNode: PathToNode,
|
||||||
pathToExtrudeNode: PathToNode,
|
pathToExtrudeNode: PathToNode,
|
||||||
edgeType: 'oppositeEdge' | 'adjacentEdge' | 'default',
|
|
||||||
radius = createLiteral(5) as Value
|
radius = createLiteral(5) as Value
|
||||||
// shouldPipe = false, // TODO: Implement this feature
|
// shouldPipe = false, // TODO: Implement this feature
|
||||||
): { modifiedAst: Program; pathToFilletNode: PathToNode } | Error {
|
): { modifiedAst: Program; pathToFilletNode: PathToNode } | Error {
|
||||||
@ -85,18 +84,10 @@ export function addFillet(
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
// Create the fillet call expression in one line
|
// Create the fillet call expression in one line
|
||||||
|
|
||||||
let tagCall: Value = createIdentifier(tag)
|
|
||||||
if (edgeType === 'oppositeEdge') {
|
|
||||||
tagCall = createCallExpressionStdLib('getOppositeEdge', [tagCall])
|
|
||||||
} else if (edgeType === 'adjacentEdge') {
|
|
||||||
tagCall = createCallExpressionStdLib('getNextAdjacentEdge', [tagCall])
|
|
||||||
}
|
|
||||||
|
|
||||||
const filletCall = createCallExpressionStdLib('fillet', [
|
const filletCall = createCallExpressionStdLib('fillet', [
|
||||||
createObjectExpression({
|
createObjectExpression({
|
||||||
radius: radius,
|
radius: radius,
|
||||||
tags: createArrayExpression([tagCall]),
|
tags: createArrayExpression([createIdentifier(tag)]),
|
||||||
}),
|
}),
|
||||||
createPipeSubstitution(),
|
createPipeSubstitution(),
|
||||||
])
|
])
|
||||||
@ -187,13 +178,11 @@ export function addFillet(
|
|||||||
extrudeDeclarator.init = createPipeExpression([extrudeInit, filletCall])
|
extrudeDeclarator.init = createPipeExpression([extrudeInit, filletCall])
|
||||||
return {
|
return {
|
||||||
modifiedAst: _node,
|
modifiedAst: _node,
|
||||||
pathToFilletNode: [],
|
pathToFilletNode: getPathToNodeOfFilletLiteral(
|
||||||
// TODO fix and re-enable this
|
pathToExtrudeNode,
|
||||||
// pathToFilletNode: getPathToNodeOfFilletLiteral(
|
extrudeDeclarator,
|
||||||
// pathToExtrudeNode,
|
tag
|
||||||
// extrudeDeclarator,
|
),
|
||||||
// tag
|
|
||||||
// ),
|
|
||||||
}
|
}
|
||||||
} else if (extrudeInit.type === 'PipeExpression') {
|
} else if (extrudeInit.type === 'PipeExpression') {
|
||||||
// 2. fillet case
|
// 2. fillet case
|
||||||
|
@ -58,10 +58,7 @@ Map {
|
|||||||
92,
|
92,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
@ -80,10 +77,7 @@ Map {
|
|||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeCutId": "UUID",
|
"edgeCutId": "UUID",
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
@ -101,10 +95,7 @@ Map {
|
|||||||
156,
|
156,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
@ -122,10 +113,7 @@ Map {
|
|||||||
209,
|
209,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
@ -164,16 +152,7 @@ Map {
|
|||||||
266,
|
266,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceIds": [
|
"surfaceIds": [
|
||||||
"UUID",
|
"UUID",
|
||||||
@ -230,54 +209,6 @@ Map {
|
|||||||
"type": "cap",
|
"type": "cap",
|
||||||
},
|
},
|
||||||
"UUID-15" => {
|
"UUID-15" => {
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-16" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-17" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-18" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-19" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-20" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-21" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-22" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-23" => {
|
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -295,7 +226,7 @@ Map {
|
|||||||
"subType": "fillet",
|
"subType": "fillet",
|
||||||
"type": "edgeCut",
|
"type": "edgeCut",
|
||||||
},
|
},
|
||||||
"UUID-24" => {
|
"UUID-16" => {
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -319,7 +250,7 @@ Map {
|
|||||||
"solid2dId": "UUID",
|
"solid2dId": "UUID",
|
||||||
"type": "path",
|
"type": "path",
|
||||||
},
|
},
|
||||||
"UUID-25" => {
|
"UUID-17" => {
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -332,15 +263,12 @@ Map {
|
|||||||
416,
|
416,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
},
|
},
|
||||||
"UUID-26" => {
|
"UUID-18" => {
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -353,15 +281,12 @@ Map {
|
|||||||
438,
|
438,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
},
|
},
|
||||||
"UUID-27" => {
|
"UUID-19" => {
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -374,15 +299,12 @@ Map {
|
|||||||
491,
|
491,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceId": "UUID",
|
"surfaceId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
},
|
},
|
||||||
"UUID-28" => {
|
"UUID-20" => {
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -399,11 +321,11 @@ Map {
|
|||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"type": "segment",
|
"type": "segment",
|
||||||
},
|
},
|
||||||
"UUID-29" => {
|
"UUID-21" => {
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"type": "solid2D",
|
"type": "solid2D",
|
||||||
},
|
},
|
||||||
"UUID-30" => {
|
"UUID-22" => {
|
||||||
"codeRef": {
|
"codeRef": {
|
||||||
"pathToNode": [
|
"pathToNode": [
|
||||||
[
|
[
|
||||||
@ -416,14 +338,7 @@ Map {
|
|||||||
546,
|
546,
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
"edgeIds": [
|
"edgeIds": [],
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
"UUID",
|
|
||||||
],
|
|
||||||
"pathId": "UUID",
|
"pathId": "UUID",
|
||||||
"surfaceIds": [
|
"surfaceIds": [
|
||||||
"UUID",
|
"UUID",
|
||||||
@ -434,76 +349,40 @@ Map {
|
|||||||
],
|
],
|
||||||
"type": "extrusion",
|
"type": "extrusion",
|
||||||
},
|
},
|
||||||
"UUID-31" => {
|
"UUID-23" => {
|
||||||
"edgeCutEdgeIds": [],
|
"edgeCutEdgeIds": [],
|
||||||
"extrusionId": "UUID",
|
"extrusionId": "UUID",
|
||||||
"pathIds": [],
|
"pathIds": [],
|
||||||
"segId": "UUID",
|
"segId": "UUID",
|
||||||
"type": "wall",
|
"type": "wall",
|
||||||
},
|
},
|
||||||
"UUID-32" => {
|
"UUID-24" => {
|
||||||
"edgeCutEdgeIds": [],
|
"edgeCutEdgeIds": [],
|
||||||
"extrusionId": "UUID",
|
"extrusionId": "UUID",
|
||||||
"pathIds": [],
|
"pathIds": [],
|
||||||
"segId": "UUID",
|
"segId": "UUID",
|
||||||
"type": "wall",
|
"type": "wall",
|
||||||
},
|
},
|
||||||
"UUID-33" => {
|
"UUID-25" => {
|
||||||
"edgeCutEdgeIds": [],
|
"edgeCutEdgeIds": [],
|
||||||
"extrusionId": "UUID",
|
"extrusionId": "UUID",
|
||||||
"pathIds": [],
|
"pathIds": [],
|
||||||
"segId": "UUID",
|
"segId": "UUID",
|
||||||
"type": "wall",
|
"type": "wall",
|
||||||
},
|
},
|
||||||
"UUID-34" => {
|
"UUID-26" => {
|
||||||
"edgeCutEdgeIds": [],
|
"edgeCutEdgeIds": [],
|
||||||
"extrusionId": "UUID",
|
"extrusionId": "UUID",
|
||||||
"pathIds": [],
|
"pathIds": [],
|
||||||
"subType": "start",
|
"subType": "start",
|
||||||
"type": "cap",
|
"type": "cap",
|
||||||
},
|
},
|
||||||
"UUID-35" => {
|
"UUID-27" => {
|
||||||
"edgeCutEdgeIds": [],
|
"edgeCutEdgeIds": [],
|
||||||
"extrusionId": "UUID",
|
"extrusionId": "UUID",
|
||||||
"pathIds": [],
|
"pathIds": [],
|
||||||
"subType": "end",
|
"subType": "end",
|
||||||
"type": "cap",
|
"type": "cap",
|
||||||
},
|
},
|
||||||
"UUID-36" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-37" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-38" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-39" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-40" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "opposite",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
"UUID-41" => {
|
|
||||||
"extrusionId": "UUID",
|
|
||||||
"segId": "UUID",
|
|
||||||
"subType": "adjacent",
|
|
||||||
"type": "extrudeEdge",
|
|
||||||
},
|
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
|
@ -251,7 +251,7 @@ describe('testing createArtifactGraph', () => {
|
|||||||
// of the edges refers to a non-existent node, the graph will throw.
|
// of the edges refers to a non-existent node, the graph will throw.
|
||||||
// further more we can check that each edge is bi-directional, if it's not
|
// further more we can check that each edge is bi-directional, if it's not
|
||||||
// by checking the arrow heads going both ways, on the graph.
|
// by checking the arrow heads going both ways, on the graph.
|
||||||
await GraphTheGraph(theMap, 2000, 2000, 'exampleCode1.png')
|
await GraphTheGraph(theMap, 1400, 1400, 'exampleCode1.png')
|
||||||
}, 20000)
|
}, 20000)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -275,7 +275,7 @@ describe('capture graph of sketchOnFaceOnFace...', () => {
|
|||||||
// of the edges refers to a non-existent node, the graph will throw.
|
// of the edges refers to a non-existent node, the graph will throw.
|
||||||
// further more we can check that each edge is bi-directional, if it's not
|
// further more we can check that each edge is bi-directional, if it's not
|
||||||
// by checking the arrow heads going both ways, on the graph.
|
// by checking the arrow heads going both ways, on the graph.
|
||||||
await GraphTheGraph(theMap, 3000, 3000, 'sketchOnFaceOnFaceEtc.png')
|
await GraphTheGraph(theMap, 2500, 2500, 'sketchOnFaceOnFaceEtc.png')
|
||||||
}, 20000)
|
}, 20000)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
@ -607,7 +607,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'segment',
|
type: 'segment',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceId: expect.any(String),
|
surfaceId: expect.any(String),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [98, 125],
|
range: [98, 125],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -627,7 +627,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'segment',
|
type: 'segment',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceId: expect.any(String),
|
surfaceId: expect.any(String),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [162, 209],
|
range: [162, 209],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -637,7 +637,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'extrusion',
|
type: 'extrusion',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceIds: expect.any(Array),
|
surfaceIds: expect.any(Array),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [243, 266],
|
range: [243, 266],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -654,7 +654,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'segment',
|
type: 'segment',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceId: expect.any(String),
|
surfaceId: expect.any(String),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [131, 156],
|
range: [131, 156],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -664,7 +664,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'extrusion',
|
type: 'extrusion',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceIds: expect.any(Array),
|
surfaceIds: expect.any(Array),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [243, 266],
|
range: [243, 266],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -681,7 +681,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'segment',
|
type: 'segment',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceId: expect.any(String),
|
surfaceId: expect.any(String),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [98, 125],
|
range: [98, 125],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -692,7 +692,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'extrusion',
|
type: 'extrusion',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceIds: expect.any(Array),
|
surfaceIds: expect.any(Array),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [243, 266],
|
range: [243, 266],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -709,7 +709,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'segment',
|
type: 'segment',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceId: expect.any(String),
|
surfaceId: expect.any(String),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [76, 92],
|
range: [76, 92],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -719,7 +719,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'extrusion',
|
type: 'extrusion',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceIds: expect.any(Array),
|
surfaceIds: expect.any(Array),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [243, 266],
|
range: [243, 266],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -736,7 +736,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'extrusion',
|
type: 'extrusion',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceIds: expect.any(Array),
|
surfaceIds: expect.any(Array),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [243, 266],
|
range: [243, 266],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
@ -753,7 +753,7 @@ describe('testing getArtifactsToUpdate', () => {
|
|||||||
type: 'extrusion',
|
type: 'extrusion',
|
||||||
pathId: expect.any(String),
|
pathId: expect.any(String),
|
||||||
surfaceIds: expect.any(Array),
|
surfaceIds: expect.any(Array),
|
||||||
edgeIds: expect.any(Array),
|
edgeIds: [],
|
||||||
codeRef: {
|
codeRef: {
|
||||||
range: [243, 266],
|
range: [243, 266],
|
||||||
pathToNode: [['body', '']],
|
pathToNode: [['body', '']],
|
||||||
|
@ -86,11 +86,12 @@ interface CapArtifact {
|
|||||||
extrusionId: string
|
extrusionId: string
|
||||||
pathIds: Array<string>
|
pathIds: Array<string>
|
||||||
}
|
}
|
||||||
export interface ExtrudeEdge {
|
|
||||||
|
interface ExtrudeEdge {
|
||||||
type: 'extrudeEdge'
|
type: 'extrudeEdge'
|
||||||
segId: string
|
segId: string
|
||||||
extrusionId: string
|
extrusionId: string
|
||||||
subType: 'opposite' | 'adjacent'
|
edgeId: string
|
||||||
}
|
}
|
||||||
|
|
||||||
/** A edgeCut is a more generic term for both fillet or chamfer */
|
/** A edgeCut is a more generic term for both fillet or chamfer */
|
||||||
@ -421,54 +422,6 @@ export function getArtifactsToUpdate({
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
return returnArr
|
return returnArr
|
||||||
} else if (
|
|
||||||
(cmd.type === 'solid3d_get_opposite_edge' &&
|
|
||||||
response.type === 'modeling' &&
|
|
||||||
response.data.modeling_response.type === 'solid3d_get_opposite_edge' &&
|
|
||||||
response.data.modeling_response.data.edge) ||
|
|
||||||
(cmd.type === 'solid3d_get_prev_adjacent_edge' &&
|
|
||||||
response.type === 'modeling' &&
|
|
||||||
response.data.modeling_response.type ===
|
|
||||||
'solid3d_get_prev_adjacent_edge' &&
|
|
||||||
response.data.modeling_response.data.edge)
|
|
||||||
) {
|
|
||||||
const wall = getArtifact(cmd.face_id)
|
|
||||||
if (wall?.type !== 'wall') return returnArr
|
|
||||||
const extrusion = getArtifact(wall.extrusionId)
|
|
||||||
if (extrusion?.type !== 'extrusion') return returnArr
|
|
||||||
const path = getArtifact(extrusion.pathId)
|
|
||||||
if (path?.type !== 'path') return returnArr
|
|
||||||
const segment = getArtifact(cmd.edge_id)
|
|
||||||
if (segment?.type !== 'segment') return returnArr
|
|
||||||
|
|
||||||
return [
|
|
||||||
{
|
|
||||||
id: response.data.modeling_response.data.edge,
|
|
||||||
artifact: {
|
|
||||||
type: 'extrudeEdge',
|
|
||||||
subType:
|
|
||||||
cmd.type === 'solid3d_get_prev_adjacent_edge'
|
|
||||||
? 'adjacent'
|
|
||||||
: 'opposite',
|
|
||||||
segId: cmd.edge_id,
|
|
||||||
extrusionId: path.extrusionId,
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: cmd.edge_id,
|
|
||||||
artifact: {
|
|
||||||
...segment,
|
|
||||||
edgeIds: [response.data.modeling_response.data.edge],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
{
|
|
||||||
id: path.extrusionId,
|
|
||||||
artifact: {
|
|
||||||
...extrusion,
|
|
||||||
edgeIds: [response.data.modeling_response.data.edge],
|
|
||||||
},
|
|
||||||
},
|
|
||||||
]
|
|
||||||
} else if (cmd.type === 'solid3d_fillet_edge') {
|
} else if (cmd.type === 'solid3d_fillet_edge') {
|
||||||
returnArr.push({
|
returnArr.push({
|
||||||
id,
|
id,
|
||||||
@ -702,18 +655,6 @@ export function getWallCodeRef(
|
|||||||
return seg.codeRef
|
return seg.codeRef
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getExtrudeEdgeCodeRef(
|
|
||||||
edge: ExtrudeEdge,
|
|
||||||
artifactGraph: ArtifactGraph
|
|
||||||
): CommonCommandProperties | Error {
|
|
||||||
const seg = getArtifactOfTypes(
|
|
||||||
{ key: edge.segId, types: ['segment'] },
|
|
||||||
artifactGraph
|
|
||||||
)
|
|
||||||
if (err(seg)) return seg
|
|
||||||
return seg.codeRef
|
|
||||||
}
|
|
||||||
|
|
||||||
export function getExtrusionFromSuspectedExtrudeSurface(
|
export function getExtrusionFromSuspectedExtrudeSurface(
|
||||||
id: string,
|
id: string,
|
||||||
artifactGraph: ArtifactGraph
|
artifactGraph: ArtifactGraph
|
||||||
|
Binary file not shown.
Before Width: | Height: | Size: 380 KiB After Width: | Height: | Size: 180 KiB |
Binary file not shown.
Before Width: | Height: | Size: 617 KiB After Width: | Height: | Size: 371 KiB |
@ -30,11 +30,9 @@ import { AXIS_GROUP, X_AXIS } from 'clientSideScene/sceneInfra'
|
|||||||
import { PathToNodeMap } from 'lang/std/sketchcombos'
|
import { PathToNodeMap } from 'lang/std/sketchcombos'
|
||||||
import { err } from 'lib/trap'
|
import { err } from 'lib/trap'
|
||||||
import {
|
import {
|
||||||
ExtrudeEdge,
|
|
||||||
getArtifactOfTypes,
|
getArtifactOfTypes,
|
||||||
getArtifactsOfTypes,
|
getArtifactsOfTypes,
|
||||||
getCapCodeRef,
|
getCapCodeRef,
|
||||||
getExtrudeEdgeCodeRef,
|
|
||||||
getSolid2dCodeRef,
|
getSolid2dCodeRef,
|
||||||
getWallCodeRef,
|
getWallCodeRef,
|
||||||
} from 'lang/std/artifactGraph'
|
} from 'lang/std/artifactGraph'
|
||||||
@ -58,8 +56,6 @@ export type Selection = {
|
|||||||
| 'line'
|
| 'line'
|
||||||
| 'arc'
|
| 'arc'
|
||||||
| 'all'
|
| 'all'
|
||||||
| 'opposite-edge'
|
|
||||||
| 'adjacent-edge'
|
|
||||||
range: SourceRange
|
range: SourceRange
|
||||||
}
|
}
|
||||||
export type Selections = {
|
export type Selections = {
|
||||||
@ -89,7 +85,6 @@ export async function getEventForSelectWithPoint({
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
let _artifact = engineCommandManager.artifactGraph.get(data.entity_id)
|
let _artifact = engineCommandManager.artifactGraph.get(data.entity_id)
|
||||||
console.log('entity id', data.entity_id)
|
|
||||||
if (!_artifact)
|
if (!_artifact)
|
||||||
return {
|
return {
|
||||||
type: 'Set selection',
|
type: 'Set selection',
|
||||||
@ -146,27 +141,6 @@ export async function getEventForSelectWithPoint({
|
|||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (_artifact.type === 'extrudeEdge') {
|
|
||||||
const codeRef = getExtrudeEdgeCodeRef(
|
|
||||||
_artifact,
|
|
||||||
engineCommandManager.artifactGraph
|
|
||||||
)
|
|
||||||
console.log('codeRef', codeRef)
|
|
||||||
if (err(codeRef)) return null
|
|
||||||
return {
|
|
||||||
type: 'Set selection',
|
|
||||||
data: {
|
|
||||||
selectionType: 'singleCodeCursor',
|
|
||||||
selection: {
|
|
||||||
range: codeRef.range,
|
|
||||||
type:
|
|
||||||
_artifact.subType === 'adjacent'
|
|
||||||
? 'adjacent-edge'
|
|
||||||
: 'opposite-edge',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -557,25 +531,6 @@ function codeToIdSelections(
|
|||||||
bestCandidate = entry
|
bestCandidate = entry
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
if (
|
|
||||||
(type === 'opposite-edge' || type === 'adjacent-edge') &&
|
|
||||||
entry.artifact.type === 'segment'
|
|
||||||
) {
|
|
||||||
const tweakedType: ExtrudeEdge['subType'] =
|
|
||||||
type === 'opposite-edge' ? 'opposite' : 'adjacent'
|
|
||||||
const edgeArtifact = [
|
|
||||||
...getArtifactsOfTypes(
|
|
||||||
{ keys: entry.artifact.edgeIds, types: ['extrudeEdge'] },
|
|
||||||
engineCommandManager.artifactGraph
|
|
||||||
),
|
|
||||||
].find(([_, edge]) => edge.subType === tweakedType)
|
|
||||||
if (!edgeArtifact) return
|
|
||||||
bestCandidate = {
|
|
||||||
artifact: edgeArtifact[1],
|
|
||||||
selection: { type, range, ...rest },
|
|
||||||
id: edgeArtifact[0],
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (type === 'solid2D' && entry.artifact.type === 'path') {
|
if (type === 'solid2D' && entry.artifact.type === 'path') {
|
||||||
const solid = engineCommandManager.artifactGraph.get(
|
const solid = engineCommandManager.artifactGraph.get(
|
||||||
entry.artifact.solid2dId || ''
|
entry.artifact.solid2dId || ''
|
||||||
|
@ -51,39 +51,4 @@ if (typeof window !== 'undefined') {
|
|||||||
padding: 0.2, // padding around the objects
|
padding: 0.2, // padding around the objects
|
||||||
},
|
},
|
||||||
})
|
})
|
||||||
;(window as any).getEdgesForAndAskEngineForType = async (faceId: string) => {
|
|
||||||
// Kurt - Debugging tool used help to show edges aren't stable after further 3d operations
|
|
||||||
// if this was added more than a few months ago, it probably can be removed.
|
|
||||||
const face = engineCommandManager.artifactGraph.get(faceId)
|
|
||||||
if (face?.type !== 'wall') {
|
|
||||||
console.log('was expecting a wall, you gave me a ', face?.type)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
const extrusion = engineCommandManager.artifactGraph.get(face.extrusionId)
|
|
||||||
if (extrusion?.type !== 'extrusion') {
|
|
||||||
console.log('was expecting an extrusion, but got ', extrusion?.type)
|
|
||||||
return
|
|
||||||
}
|
|
||||||
extrusion.edgeIds.forEach(async (edgeId) => {
|
|
||||||
const result = await engineCommandManager
|
|
||||||
.sendSceneCommand({
|
|
||||||
type: 'modeling_cmd_req',
|
|
||||||
cmd_id: uuidv4(),
|
|
||||||
cmd: {
|
|
||||||
type: 'get_entity_type',
|
|
||||||
entity_id: edgeId,
|
|
||||||
},
|
|
||||||
})
|
|
||||||
.catch((a) => console.log('error:', a))
|
|
||||||
if (!result?.success) return
|
|
||||||
if (result.resp.type !== 'modeling') return
|
|
||||||
if (result.resp.data.modeling_response.type !== 'get_entity_type') return
|
|
||||||
console.log(
|
|
||||||
'result edge is: ',
|
|
||||||
result.resp.data.modeling_response.data.entity_type,
|
|
||||||
' id: ',
|
|
||||||
edgeId
|
|
||||||
)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -1197,11 +1197,6 @@ export const modelingMachine = createMachine(
|
|||||||
ast,
|
ast,
|
||||||
pathToSegmentNode,
|
pathToSegmentNode,
|
||||||
pathToExtrudeNode,
|
pathToExtrudeNode,
|
||||||
selection.codeBasedSelections[0].type === 'opposite-edge'
|
|
||||||
? 'oppositeEdge'
|
|
||||||
: selection.codeBasedSelections[0].type === 'adjacent-edge'
|
|
||||||
? 'adjacentEdge'
|
|
||||||
: 'default',
|
|
||||||
'variableName' in radius
|
'variableName' in radius
|
||||||
? radius.variableIdentifierAst
|
? radius.variableIdentifierAst
|
||||||
: radius.valueAst
|
: radius.valueAst
|
||||||
@ -1211,8 +1206,7 @@ export const modelingMachine = createMachine(
|
|||||||
const { modifiedAst, pathToFilletNode } = addFilletResult
|
const { modifiedAst, pathToFilletNode } = addFilletResult
|
||||||
|
|
||||||
const updatedAst = await kclManager.updateAst(modifiedAst, true, {
|
const updatedAst = await kclManager.updateAst(modifiedAst, true, {
|
||||||
// TODO fix and re-enable
|
focusPath: pathToFilletNode,
|
||||||
// focusPath: pathToFilletNode,
|
|
||||||
})
|
})
|
||||||
if (updatedAst?.selections) {
|
if (updatedAst?.selections) {
|
||||||
editorManager.selectRange(updatedAst?.selections)
|
editorManager.selectRange(updatedAst?.selections)
|
||||||
|
@ -1,41 +0,0 @@
|
|||||||
import { normaliseKclNumbers } from '../e2e/playwright/test-utils'
|
|
||||||
|
|
||||||
test('normaliseKclNumbers', () => {
|
|
||||||
expect(
|
|
||||||
normaliseKclNumbers(`const sketch001 = startSketchOn('XY')
|
|
||||||
|> startProfileAt([-10, 10], %)
|
|
||||||
|> line([20, 0], %)
|
|
||||||
|> line([0, -20], %)
|
|
||||||
|> line([-20, 0], %)
|
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|
||||||
|> close(%)
|
|
||||||
const extrude001 = extrude(-15, sketch001)`)
|
|
||||||
).toBe(`const sketch001 = startSketchOn('XY')
|
|
||||||
|> startProfileAt([-12.34, 12.34], %)
|
|
||||||
|> line([12.34, 0], %)
|
|
||||||
|> line([0, -12.34], %)
|
|
||||||
|> line([-12.34, 0], %)
|
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|
||||||
|> close(%)
|
|
||||||
const extrude001 = extrude(-12.34, sketch001)`)
|
|
||||||
expect(
|
|
||||||
normaliseKclNumbers(
|
|
||||||
`const sketch001 = startSketchOn('XY')
|
|
||||||
|> startProfileAt([-10, 10], %)
|
|
||||||
|> line([20, 0], %)
|
|
||||||
|> line([0, -20], %)
|
|
||||||
|> line([-20, 0], %)
|
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|
||||||
|> close(%)
|
|
||||||
const extrude001 = extrude(-15, sketch001)`,
|
|
||||||
false
|
|
||||||
)
|
|
||||||
).toBe(`const sketch001 = startSketchOn('XY')
|
|
||||||
|> startProfileAt([-12.34, 12.34], %)
|
|
||||||
|> line([12.34, 12.34], %)
|
|
||||||
|> line([12.34, -12.34], %)
|
|
||||||
|> line([-12.34, 12.34], %)
|
|
||||||
|> lineTo([profileStartX(%), profileStartY(%)], %)
|
|
||||||
|> close(%)
|
|
||||||
const extrude001 = extrude(-12.34, sketch001)`)
|
|
||||||
})
|
|
@ -181,48 +181,6 @@ pub(crate) async fn do_post_extrude(
|
|||||||
vec![]
|
vec![]
|
||||||
};
|
};
|
||||||
|
|
||||||
for face_info in face_infos.iter() {
|
|
||||||
if face_info.cap == kittycad::types::ExtrusionFaceCapType::None
|
|
||||||
&& face_info.face_id.is_some()
|
|
||||||
&& face_info.curve_id.is_some()
|
|
||||||
{
|
|
||||||
match args
|
|
||||||
.batch_modeling_cmd(
|
|
||||||
uuid::Uuid::new_v4(),
|
|
||||||
kittycad::types::ModelingCmd::Solid3DGetOppositeEdge {
|
|
||||||
edge_id: face_info.curve_id.unwrap(),
|
|
||||||
object_id: sketch_group.id,
|
|
||||||
face_id: face_info.face_id.unwrap_or_default(),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
Ok(info) => info,
|
|
||||||
Err(e) => {
|
|
||||||
eprintln!("Error fetching opposite edge: {:?}", e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
match args
|
|
||||||
.batch_modeling_cmd(
|
|
||||||
uuid::Uuid::new_v4(),
|
|
||||||
kittycad::types::ModelingCmd::Solid3DGetPrevAdjacentEdge {
|
|
||||||
edge_id: face_info.curve_id.unwrap(),
|
|
||||||
object_id: sketch_group.id,
|
|
||||||
face_id: face_info.face_id.unwrap(),
|
|
||||||
},
|
|
||||||
)
|
|
||||||
.await
|
|
||||||
{
|
|
||||||
Ok(info) => info,
|
|
||||||
Err(e) => {
|
|
||||||
eprintln!("Error fetching adjacent edge: {:?}", e);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a hashmap for quick id lookup
|
// Create a hashmap for quick id lookup
|
||||||
let mut face_id_map = std::collections::HashMap::new();
|
let mut face_id_map = std::collections::HashMap::new();
|
||||||
// creating fake ids for start and end caps is to make extrudes mock-execute safe
|
// creating fake ids for start and end caps is to make extrudes mock-execute safe
|
||||||
|
38
yarn.lock
38
yarn.lock
@ -2227,7 +2227,12 @@
|
|||||||
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
|
resolved "https://registry.yarnpkg.com/@tsconfig/node16/-/node16-1.0.4.tgz#0b92dcc0cc1c81f6f306a381f28e31b1a56536e9"
|
||||||
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
|
integrity sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==
|
||||||
|
|
||||||
"@tweenjs/tween.js@^23.1.1", "@tweenjs/tween.js@~23.1.1":
|
"@tweenjs/tween.js@^25.0.0":
|
||||||
|
version "25.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-25.0.0.tgz#7266baebcc3affe62a3a54318a3ea82d904cd0b9"
|
||||||
|
integrity sha512-XKLA6syeBUaPzx4j3qwMqzzq+V4uo72BnlbOjmuljLrRqdsd3qnzvZZoxvMHZ23ndsRS4aufU6JOZYpCbU6T1A==
|
||||||
|
|
||||||
|
"@tweenjs/tween.js@~23.1.1":
|
||||||
version "23.1.2"
|
version "23.1.2"
|
||||||
resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.2.tgz#4e5357fd6742f5aa50447d3fa808aed4cda93ed7"
|
resolved "https://registry.yarnpkg.com/@tweenjs/tween.js/-/tween.js-23.1.2.tgz#4e5357fd6742f5aa50447d3fa808aed4cda93ed7"
|
||||||
integrity sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==
|
integrity sha512-kMCNaZCJugWI86xiEHaY338CU5JpD0B97p1j1IKNn/Zto8PgACjQx0UxbHjmOcLl/dDOBnItwD07KmCs75pxtQ==
|
||||||
@ -7712,7 +7717,16 @@ string-natural-compare@^3.0.1:
|
|||||||
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
|
resolved "https://registry.yarnpkg.com/string-natural-compare/-/string-natural-compare-3.0.1.tgz#7a42d58474454963759e8e8b7ae63d71c1e7fdf4"
|
||||||
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==
|
integrity sha512-n3sPwynL1nwKi3WJ6AIsClwBMa0zTi54fn2oLU6ndfTSIO05xaznjSf15PcBZU6FNWbmN5Q6cxT4V5hGvB4taw==
|
||||||
|
|
||||||
"string-width-cjs@npm:string-width@^4.2.0", string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
"string-width-cjs@npm:string-width@^4.2.0":
|
||||||
|
version "4.2.3"
|
||||||
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
|
dependencies:
|
||||||
|
emoji-regex "^8.0.0"
|
||||||
|
is-fullwidth-code-point "^3.0.0"
|
||||||
|
strip-ansi "^6.0.1"
|
||||||
|
|
||||||
|
string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3:
|
||||||
version "4.2.3"
|
version "4.2.3"
|
||||||
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
resolved "https://registry.yarnpkg.com/string-width/-/string-width-4.2.3.tgz#269c7117d27b05ad2e536830a8ec895ef9c6d010"
|
||||||
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
integrity sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==
|
||||||
@ -7790,7 +7804,14 @@ string_decoder@~1.1.1:
|
|||||||
dependencies:
|
dependencies:
|
||||||
safe-buffer "~5.1.0"
|
safe-buffer "~5.1.0"
|
||||||
|
|
||||||
"strip-ansi-cjs@npm:strip-ansi@^6.0.1", strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
"strip-ansi-cjs@npm:strip-ansi@^6.0.1":
|
||||||
|
version "6.0.1"
|
||||||
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
|
dependencies:
|
||||||
|
ansi-regex "^5.0.1"
|
||||||
|
|
||||||
|
strip-ansi@^6.0.0, strip-ansi@^6.0.1:
|
||||||
version "6.0.1"
|
version "6.0.1"
|
||||||
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
resolved "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.1.tgz#9e26c63d30f53443e9489495b2105d37b67a85d9"
|
||||||
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
integrity sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==
|
||||||
@ -8666,7 +8687,7 @@ workerpool@6.2.1:
|
|||||||
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
|
resolved "https://registry.yarnpkg.com/workerpool/-/workerpool-6.2.1.tgz#46fc150c17d826b86a008e5a4508656777e9c343"
|
||||||
integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
|
integrity sha512-ILEIE97kDZvF9Wb9f6h5aXK4swSlKGUcOEGiIYb2OOu/IrDU9iwj0fD//SsA6E5ibwJxpEvhullJY4Sl4GcpAw==
|
||||||
|
|
||||||
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0:
|
"wrap-ansi-cjs@npm:wrap-ansi@^7.0.0":
|
||||||
version "7.0.0"
|
version "7.0.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
@ -8684,6 +8705,15 @@ wrap-ansi@^6.2.0:
|
|||||||
string-width "^4.1.0"
|
string-width "^4.1.0"
|
||||||
strip-ansi "^6.0.0"
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
|
wrap-ansi@^7.0.0:
|
||||||
|
version "7.0.0"
|
||||||
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43"
|
||||||
|
integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==
|
||||||
|
dependencies:
|
||||||
|
ansi-styles "^4.0.0"
|
||||||
|
string-width "^4.1.0"
|
||||||
|
strip-ansi "^6.0.0"
|
||||||
|
|
||||||
wrap-ansi@^8.1.0:
|
wrap-ansi@^8.1.0:
|
||||||
version "8.1.0"
|
version "8.1.0"
|
||||||
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
resolved "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-8.1.0.tgz#56dc22368ee570face1b49819975d9b9a5ead214"
|
||||||
|
Reference in New Issue
Block a user