Start changing JS codemods

This commit is contained in:
Adam Chalmers
2025-03-19 11:28:26 -05:00
parent e13ee69c40
commit 1125a6a1e6
5 changed files with 1321 additions and 1595 deletions

View File

@ -1,20 +1,17 @@
import type { Page } from '@playwright/test'
import type { LineInputsType } from '@src/lang/std/sketchcombos'
import { uuidv4 } from '@src/lib/utils'
import { Page } from '@playwright/test'
import { test, expect } from './zoo-test'
import type { EditorFixture } from '@e2e/playwright/fixtures/editorFixture'
import {
deg,
getUtils,
orRunWhenFullSuiteEnabled,
wiggleMove,
} from '@e2e/playwright/test-utils'
import { expect, test } from '@e2e/playwright/zoo-test'
import { deg, getUtils, wiggleMove } from './test-utils'
import { LineInputsType } from 'lang/std/sketchcombos'
import { uuidv4 } from 'lib/utils'
import { EditorFixture } from './fixtures/editorFixture'
test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
test('Hover over a segment should show its overlay, hovering over the input overlays should show its popover, clicking the input overlay should constrain/unconstrain it:\nfor the following segments', () => {
test.fixme(
'Hover over a segment should show its overlay, hovering over the input overlays should show its popover, clicking the input overlay should constrain/unconstrain it:\nfor the following segments',
() => {
// TODO: fix this test on mac after the electron migration
test.fixme(orRunWhenFullSuiteEnabled())
test.skip(process.platform === 'darwin', 'Skip on mac')
/**
* Clicks on an constrained element
* @param {Page} page - The page to perform the action on
@ -162,6 +159,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
const unconstrainedLocator = page.locator(
`[data-constraint-type="${constraintType}"][data-is-constrained="false"]`
)
await expect(unconstrainedLocator).toBeVisible()
await unconstrainedLocator.hover()
await expect(
await page.getByTestId('constraint-symbol-popover').count()
@ -210,8 +208,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
`part001 = startSketchOn('XZ')
|> startProfileAt([5 + 0, 20 + 0], %)
|> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -220,8 +217,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
|> yLine(endAbsolute = 20 + -10.77, tag = $a)
|> xLine(length = 26.04)
|> yLine(length = 21.14 + 0)
|> angledLine(angle = 181 + 0, xLength = 23.14)
|> angledLine(angle = -91, yLength = 19 + 0)
|> angledLine(angle = 181 + 0, lengthX = 23.14)
|> angledLine(angle = -91, lengthX = 19 + 0)
|> angledLine(angle = 3 + 0, endAbsoluteX = 5 + 26)
|> angledLine(angle = 89, endAbsoluteY = 20 + 9.14 + 0)
|> angledLineThatIntersects({
@ -277,8 +274,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
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="${0}"]`)
ang = await u.getAngle(`[data-overlay-index="${0}"]`)
console.log('line1', line, ang)
await clickConstrained({
hoverPos: { x: line.x, y: line.y },
@ -300,17 +297,16 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-index="0"]',
})
const angledLine = await u.getBoundingBox('[data-overlay-index="1"]')
ang = await u.getAngle('[data-overlay-index="1"]')
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)',
'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"]',
})
@ -319,10 +315,10 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
hoverPos: { x: angledLine.x, y: angledLine.y },
constraintType: 'length',
expectBeforeUnconstrained:
'angledLine(angle = angle001, length = 32 + 0)',
'angledLine(angle = angle001, length = 32 + 0 )',
expectAfterUnconstrained:
'angledLine(angle = angle001, length = 32)',
expectFinal: 'angledLine(angle = angle001, length = len001)',
'angledLine(angle = angle001, length = 32 )',
expectFinal: 'angledLine(angle = angle001, length = len001 )',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="1"]',
})
@ -330,8 +326,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
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"]')
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 },
@ -356,8 +352,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-toolbar-index="2"]',
})
const xLineTo = await u.getBoundingBox('[data-overlay-index="3"]')
ang = await u.getAngle('[data-overlay-index="3"]')
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 },
@ -372,24 +368,20 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
})
// Broken on main at time of writing!
test('for segments [yLineTo, xLine]', async ({
page,
editor,
homePage,
}) => {
test.fixme(orRunWhenFullSuiteEnabled())
test.fixme(
'for segments [yLineTo, xLine]',
async ({ page, editor, homePage }) => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
yRel001 = -14
`yRel001 = -14
xRel001 = 0.5
angle001 = 3
len001 = 32
yAbs001 = 11.5
xAbs001 = 33
xAbs002 = 4
part001 = startSketchOn(XZ)
part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0.5, yRel001])
|> angledLine(angle = angle001, length = len001 )
@ -426,8 +418,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
let ang = 0
const yLineTo = await u.getBoundingBox('[data-overlay-index="4"]')
ang = await u.getAngle('[data-overlay-index="4"]')
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 },
@ -439,8 +431,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-toolbar-index="4"]',
})
const xLine = await u.getBoundingBox('[data-overlay-index="5"]')
ang = await u.getAngle('[data-overlay-index="5"]')
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 },
@ -452,7 +444,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
ang: ang + 180,
locator: '[data-overlay-toolbar-index="5"]',
})
})
}
)
test('for segments [yLine, angledLineOfXLength, angledLineOfYLength]', async ({
page,
editor,
@ -461,8 +454,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
`part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -508,8 +500,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
let ang = 0
const yLine = await u.getBoundingBox('[data-overlay-index="6"]')
ang = await u.getAngle('[data-overlay-index="6"]')
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 },
@ -522,9 +514,9 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
})
const angledLineOfXLength = await u.getBoundingBox(
'[data-overlay-index="7"]'
`[data-overlay-index="7"]`
)
ang = await u.getAngle('[data-overlay-index="7"]')
ang = await u.getAngle(`[data-overlay-index="7"]`)
console.log('angledLineOfXLength1')
await clickConstrained({
hoverPos: { x: angledLineOfXLength.x, y: angledLineOfXLength.y },
@ -554,9 +546,9 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
})
const angledLineOfYLength = await u.getBoundingBox(
'[data-overlay-index="8"]'
`[data-overlay-index="8"]`
)
ang = await u.getAngle('[data-overlay-index="8"]')
ang = await u.getAngle(`[data-overlay-index="8"]`)
console.log('angledLineOfYLength1')
await clickUnconstrained({
hoverPos: { x: angledLineOfYLength.x, y: angledLineOfYLength.y },
@ -565,7 +557,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)',
expectAfterUnconstrained:
'angledLineOfYLength({ angle = angle002, length = 19 + 0 }, %)',
expectFinal: 'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)',
expectFinal:
'angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)',
ang: ang + 180,
steps: 6,
locator: '[data-overlay-toolbar-index="8"]',
@ -593,8 +586,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
`part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -614,62 +606,6 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
}, %)
|> tangentialArcTo([3.14 + 13, 1.14], %)
`
<<<<<<< HEAD
||||||| parent of bcbec9f87 (Update KCL in JS project)
)
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:
'angledLineToX({ angle = 3 + 0, to = 26 }, %)',
expectAfterUnconstrained: 'angledLineToX({ angle = 3, to = 26 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 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:
'angledLineToX({ angle = angle001, to = 26 }, %)',
expectAfterUnconstrained:
'angledLineToX({ angle = angle001, to = xAbs001 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 26 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="9"]',
})
const angledLineToY = await u.getBoundingBox(
`[data-overlay-index="10"]`
=======
)
localStorage.setItem('disableAxis', 'true')
})
@ -723,41 +659,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
const angledLineToY = await u.getBoundingBox(
`[data-overlay-index="10"]`
>>>>>>> bcbec9f87 (Update KCL in JS project)
)
<<<<<<< HEAD
localStorage.setItem('disableAxis', 'true')
})
const u = await getUtils(page)
await page.setBodyDimensions({ width: 1200, height: 500 })
||||||| parent of bcbec9f87 (Update KCL in JS project)
ang = await u.getAngle(`[data-overlay-index="10"]`)
console.log('angledLineToY')
await clickUnconstrained({
hoverPos: { x: angledLineToY.x, y: angledLineToY.y },
constraintType: 'angle',
expectBeforeUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained:
'angledLineToY({ angle = angle002, to = 9.14 + 0 }, %)',
expectFinal: 'angledLineToY({ 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:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained:
'angledLineToY({ angle = 89, to = 9.14 }, %)',
expectFinal: 'angledLineToY({ angle = 89, to = yAbs001 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
=======
ang = await u.getAngle(`[data-overlay-index="10"]`)
console.log('angledLineToY')
await clickUnconstrained({
@ -784,84 +686,11 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
>>>>>>> bcbec9f87 (Update KCL in JS project)
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:
'angledLineToX({ angle = 3 + 0, to = 26 }, %)',
expectAfterUnconstrained: 'angledLineToX({ angle = 3, to = 26 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 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:
'angledLineToX({ angle = angle001, to = 26 }, %)',
expectAfterUnconstrained:
'angledLineToX({ angle = angle001, to = xAbs001 }, %)',
expectFinal: 'angledLineToX({ angle = angle001, to = 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:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained:
'angledLineToY({ angle = angle002, to = 9.14 + 0 }, %)',
expectFinal: 'angledLineToY({ 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:
'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
expectAfterUnconstrained: 'angledLineToY({ angle = 89, to = 9.14 }, %)',
expectFinal: 'angledLineToY({ angle = 89, to = yAbs001 }, %)',
ang: ang + 180,
locator: '[data-overlay-toolbar-index="10"]',
})
const angledLineThatIntersects = await u.getBoundingBox(
'[data-overlay-index="11"]'
`[data-overlay-index="11"]`
)
ang = await u.getAngle('[data-overlay-index="11"]')
ang = await u.getAngle(`[data-overlay-index="11"]`)
console.log('angledLineThatIntersects')
await clickUnconstrained({
hoverPos: {
@ -921,8 +750,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
`part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0])
|> angledLine(angle = 3 + 0, length = 32 + 0 )
@ -992,145 +820,11 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
locator: '[data-overlay-toolbar-index="12"]',
})
})
test('for segment [arcTo]', async ({
page,
editor,
homePage,
scene,
cmdBar,
}) => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
sketch001 = startSketchOn(XZ)
profile001 = startProfileAt([56.37, 120.33], sketch001)
|> line(end = [162.86, 106.48])
|> arcTo({
interior = [360.16, 231.76],
end = [391.48, 131.54]
}, %)
|> yLine(-131.54, %)
|> arc({
radius = 126.46,
angleStart = 33.53,
angleEnd = -141.07
}, %)
`
)
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 interior x')
await clickUnconstrained({
hoverPos: { x: arcTo.x, y: arcTo.y },
constraintType: 'xAbsolute',
expectBeforeUnconstrained: `arcTo({
interior = [360.16, 231.76],
end = [391.48, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [360.16, 231.76],
end = [391.48, 131.54]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
ang: ang,
steps: 6,
locator: '[data-overlay-toolbar-index="1"]',
})
console.log('arcTo interior y')
await clickUnconstrained({
hoverPos: { x: arcTo.x, y: arcTo.y },
constraintType: 'yAbsolute',
expectBeforeUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [xAbs001, yAbs001],
end = [391.48, 131.54]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [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: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [391.48, 131.54]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [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: `arcTo({
interior = [xAbs001, 231.76],
end = [xAbs002, 131.54]
}, %)`,
expectAfterUnconstrained: `arcTo({
interior = [xAbs001, 231.76],
end = [xAbs002, yAbs002]
}, %)`,
expectFinal: `arcTo({
interior = [xAbs001, 231.76],
end = [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)
`part001 = startSketchOn('XZ')
|> circle(center = [1 + 0, 0], radius = 8)
`
)
@ -1174,7 +868,8 @@ part001 = startSketchOn(XZ)
await clickUnconstrained({
hoverPos,
constraintType: 'yAbsolute',
expectBeforeUnconstrained: 'circle(center = [xAbs001, 0], radius = 8)',
expectBeforeUnconstrained:
'circle(center = [xAbs001, 0], radius = 8)',
expectAfterUnconstrained:
'circle(center = [xAbs001, yAbs001], radius = 8)',
expectFinal: 'circle(center = [xAbs001, 0], radius = 8)',
@ -1186,7 +881,8 @@ part001 = startSketchOn(XZ)
await clickUnconstrained({
hoverPos,
constraintType: 'radius',
expectBeforeUnconstrained: 'circle(center = [xAbs001, 0], radius = 8)',
expectBeforeUnconstrained:
'circle(center = [xAbs001, 0], radius = 8)',
expectAfterUnconstrained:
'circle(center = [xAbs001, 0], radius = radius001)',
expectFinal: 'circle(center = [xAbs001, 0], radius = 8)',
@ -1195,7 +891,8 @@ part001 = startSketchOn(XZ)
locator: '[data-overlay-toolbar-index="0"]',
})
})
})
}
)
test.describe('Testing deleting a segment', () => {
const _deleteSegmentSequence =
(page: Page, editor: EditorFixture) =>
@ -1230,78 +927,17 @@ part001 = startSketchOn(XZ)
shouldNormalise: true,
})
await page
.locator(`[data-stdlib-fn-name="${stdLibFnName}"]`)
.first()
.click()
await page.locator(`[data-stdlib-fn-name="${stdLibFnName}"]`).click()
await page.getByText('Delete Segment').click()
await editor.expectEditor.not.toContain(codeToBeDeleted, {
shouldNormalise: true,
})
}
test('all segment types', async ({
page,
editor,
homePage,
scene,
cmdBar,
}) => {
test('all segment types', async ({ page, editor, homePage }) => {
await page.addInitScript(async () => {
localStorage.setItem(
'persistCode',
<<<<<<< HEAD
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
|>startProfileAt([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)
|> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)
|> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)
|> angledLineToX({ angle = 3 + 0, to = 26 }, %)
|> angledLineToY({ angle = 89, to = 9.14 + 0 }, %)
|> angledLineThatIntersects({
angle = 4.14,
intersectTag = a,
offset = 9
}, %)
|> tangentialArcTo([3.14 + 13, 1.14], %)
|> arcTo({
interior = [16.25, 5.12],
end = [21.61, 4.15]
}, %)
|> arc({
radius = 9.03,
angleStart = 40.27,
angleEnd = -38.05
}, %)
||||||| parent of bcbec9f87 (Update KCL in JS project)
`part001 = startSketchOn('XZ')
|> startProfileAt([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)
|> angledLineOfXLength({ angle = 181 + 0, length = 23.14 }, %)
|> angledLineOfYLength({ angle = -91, length = 19 + 0 }, %)
|> angledLineToX({ angle = 3 + 0, to = 26 }, %)
|> angledLineToY({ angle = 89, to = 9.14 + 0 }, %)
|> angledLineThatIntersects({
angle = 4.14,
intersectTag = a,
offset = 9
}, %)
|> tangentialArcTo([3.14 + 13, 1.14], %)
=======
`part001 = startSketchOn('XZ')
|> startProfileAt([0, 0], %)
|> line(end = [0.5, -14 + 0])
@ -1321,7 +957,6 @@ part001 = startSketchOn(XZ)
offset = 9
}, %)
|> tangentialArcTo([3.14 + 13, 1.14], %)
>>>>>>> bcbec9f87 (Update KCL in JS project)
`
)
localStorage.setItem('disableAxis', 'true')
@ -1330,55 +965,27 @@ part001 = startSketchOn(XZ)
await page.setBodyDimensions({ width: 1200, height: 500 })
await homePage.goToModelingScene()
await scene.connectionEstablished()
await scene.settled(cmdBar)
await u.waitForPageLoad()
// 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(16)
await expect(page.getByTestId('segment-overlay')).toHaveCount(13)
const deleteSegmentSequence = _deleteSegmentSequence(page, editor)
let segmentToDelete
const getOverlayByIndex = (index: number) =>
u.getBoundingBox(`[data - overlay - index="${index}"]`)
segmentToDelete = await getOverlayByIndex(14)
let ang = await u.getAngle('[data-overlay-index="14"]')
await editor.scrollToText('angleEnd')
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: `arc({
radius = 9.03,
angleStart = 40.27,
angleEnd = -38.05
}, %)`,
stdLibFnName: 'arc',
ang: ang + 180,
steps: 6,
locator: '[data-overlay-toolbar-index="14"]',
})
segmentToDelete = await getOverlayByIndex(13)
ang = await u.getAngle('[data-overlay-index="13"]')
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: `arcTo({
interior =[16.25, 5.12],
end =[21.61, 4.15]
}, %)`,
stdLibFnName: 'arcTo',
ang: ang,
steps: 6,
locator: '[data-overlay-toolbar-index="13"]',
})
u.getBoundingBox(`[data-overlay-index="${index}"]`)
segmentToDelete = await getOverlayByIndex(12)
ang = await u.getAngle('[data-overlay-index="12"]')
let ang = await u.getAngle(`[data-overlay-index="${12}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'tangentialArcTo([3.14 + 13, 1.14], %)',
@ -1389,7 +996,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(11)
ang = await u.getAngle('[data-overlay-index="11"]')
ang = await u.getAngle(`[data-overlay-index="${11}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: `angledLineThatIntersects({
@ -1404,7 +1011,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(10)
ang = await u.getAngle('[data-overlay-index="10"]')
ang = await u.getAngle(`[data-overlay-index="${10}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'angledLine(angle = 89, endAbsoluteY = 9.14 + 0)',
@ -1414,7 +1021,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(9)
ang = await u.getAngle('[data-overlay-index="9"]')
ang = await u.getAngle(`[data-overlay-index="${9}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'angledLine(angle = 3 + 0, endAbsoluteX = 26)',
@ -1424,7 +1031,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(8)
ang = await u.getAngle('[data-overlay-index="8"]')
ang = await u.getAngle(`[data-overlay-index="${8}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted:
@ -1435,7 +1042,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(7)
ang = await u.getAngle('[data-overlay-index="7"]')
ang = await u.getAngle(`[data-overlay-index="${7}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted:
@ -1446,7 +1053,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(6)
ang = await u.getAngle('[data-overlay-index="6"]')
ang = await u.getAngle(`[data-overlay-index="${6}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'yLine(length = 21.14 + 0)',
@ -1456,7 +1063,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(5)
ang = await u.getAngle('[data-overlay-index="5"]')
ang = await u.getAngle(`[data-overlay-index="${5}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'xLine(length = 26.04)',
@ -1466,7 +1073,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(4)
ang = await u.getAngle('[data-overlay-index="4"]')
ang = await u.getAngle(`[data-overlay-index="${4}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'yLine(endAbsolute = -10.77, tag = $a)',
@ -1476,7 +1083,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(3)
ang = await u.getAngle('[data-overlay-index="3"]')
ang = await u.getAngle(`[data-overlay-index="${3}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'xLine(endAbsolute = 9 - 5)',
@ -1486,7 +1093,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(2)
ang = await u.getAngle('[data-overlay-index="2"]')
ang = await u.getAngle(`[data-overlay-index="${2}"]`)
await expect(page.getByText('Added variable')).not.toBeVisible()
const hoverPos = { x: segmentToDelete.x, y: segmentToDelete.y }
@ -1519,7 +1126,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(1)
ang = await u.getAngle('[data-overlay-index="1"]')
ang = await u.getAngle(`[data-overlay-index="${1}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'angledLine(angle = 3 + 0, length = 32 + 0 )',
@ -1529,7 +1136,7 @@ part001 = startSketchOn(XZ)
})
segmentToDelete = await getOverlayByIndex(0)
ang = await u.getAngle('[data-overlay-index="0"]')
ang = await u.getAngle(`[data-overlay-index="${0}"]`)
await deleteSegmentSequence({
hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
codeToBeDeleted: 'line(end = [0.5, -14 + 0])',
@ -1560,26 +1167,18 @@ part001 = startSketchOn(XZ)
for (const doesHaveTagOutsideSketch of [true, false]) {
for (const lineOfInterest of cases) {
const isObj = lineOfInterest.includes('{ angle = 3,')
test(`${ lineOfInterest.split('=')[0] }${ isObj? '-[obj-input]': '' }${
doesHaveTagOutsideSketch? '-[tagOutsideSketch]': ''
test(`${lineOfInterest.split('=')[0]}${isObj ? '-[obj-input]' : ''}${doesHaveTagOutsideSketch ? '-[tagOutsideSketch]' : ''
}`, async ({ page, editor, homePage }) => {
await page.addInitScript(
async ({ lineToBeDeleted, extraLine }) => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
`part001 = startSketchOn('XZ')
|> startProfileAt([5, 6], %)
|> ${ lineToBeDeleted }
|> ${lineToBeDeleted}
|> line(end = [-10, -15])
<<<<<<< HEAD
|> angledLine([-176, segLen(seg01)], %)
||||||| parent of bcbec9f87 (Update KCL in JS project)
|> angledLine([-176, segLen(seg01)], %)
=======
|> angledLine(angle = -176, length = segLen(seg01))
>>>>>>> bcbec9f87 (Update KCL in JS project)
${ extraLine? 'myVar = segLen(seg01)': '' }`
${extraLine ? 'myVar = segLen(seg01)' : ''}`
)
},
{
@ -1607,8 +1206,7 @@ part001 = startSketchOn(XZ)
page.getByRole('button', { name: 'Edit Sketch' })
).toBeVisible()
return true
// eslint-disable-next-line @typescript-eslint/no-unused-vars
} catch (_e) {
} catch (_) {
return false
}
})
@ -1617,7 +1215,7 @@ part001 = startSketchOn(XZ)
await expect(page.getByTestId('segment-overlay')).toHaveCount(3)
const segmentToDelete = await u.getBoundingBox(
`[data - overlay - index= "0"]`
`[data-overlay-index="0"]`
)
const isYLine = lineOfInterest.toLowerCase().includes('yline')
@ -1730,7 +1328,7 @@ part001 = startSketchOn(XZ)
for (const { before, after } of cases) {
const isObj = before.includes('{ angle = 3')
test(`${ before.split('=')[0] }${ isObj? '-[obj-input]': '' }`, async ({
test(`${before.split('=')[0]}${isObj ? '-[obj-input]' : ''}`, async ({
page,
editor,
homePage,
@ -1739,10 +1337,9 @@ part001 = startSketchOn(XZ)
async ({ lineToBeDeleted }) => {
localStorage.setItem(
'persistCode',
`@settings(defaultLengthUnit = in)
part001 = startSketchOn(XZ)
`part001 = startSketchOn('XZ')
|> startProfileAt([5, 6], %)
|> ${ lineToBeDeleted }
|> ${lineToBeDeleted}
|> line(end = [-10, -15])
|> angledLine(angle = -176, length = segLen(seg01))`
)
@ -1766,8 +1363,8 @@ part001 = startSketchOn(XZ)
await expect(page.getByTestId('segment-overlay')).toHaveCount(3)
await expect(page.getByText('Added variable')).not.toBeVisible()
const hoverPos = await u.getBoundingBox(`[data - overlay - index="0"]`)
let ang = await u.getAngle('[data-overlay-index="0"]')
const hoverPos = await u.getBoundingBox(`[data-overlay-index="0"]`)
let ang = await u.getAngle(`[data-overlay-index="${0}"]`)
ang += 180
await page.mouse.move(0, 0)

View File

@ -5,3 +5,8 @@ export const ARG_END_ABSOLUTE = 'endAbsolute'
export const ARG_CIRCLE_CENTER = 'center'
export const ARG_CIRCLE_RADIUS = 'radius'
export const DETERMINING_ARGS = [ARG_LENGTH, ARG_END, ARG_END_ABSOLUTE]
export const ARG_LENGTH_X = 'lengthX'
export const ARG_LENGTH_Y = 'lengthY'
export const ARG_ANGLE = 'angle'
export const ARG_END_ABSOLUTE_X = 'endAbsoluteX'
export const ARG_END_ABSOLUTE_Y = 'endAbsoluteY'

View File

@ -182,6 +182,7 @@ const commonConstraintInfoHelper = (
pathToNode: PathToNode,
filterValue?: string
) => {
console.warn('ADAM: Must be updated to handle angled line kw args')
if (callExp.type !== 'CallExpression' && callExp.type !== 'CallExpressionKw')
return []
const firstArg = (() => {
@ -2169,7 +2170,7 @@ export const circleThreePoint: SketchLineHelperKw = {
return finalConstraints
},
}
export const angledLine: SketchLineHelper = {
export const angledLine: SketchLineHelperKw = {
add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => {
if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { from, to } = segmentInput
@ -2181,12 +2182,13 @@ export const angledLine: SketchLineHelper = {
const newAngleVal = createLiteral(roundOff(getAngle(from, to), 0))
const newLengthVal = createLiteral(roundOff(getLength(from, to), 2))
const newLine = createCallExpression('angledLine', [
createArrayExpression([newAngleVal, newLengthVal]),
createPipeSubstitution(),
const newLine = createCallExpressionStdLibKw('angledLine', null, [
createLabeledArg('angle', newAngleVal),
createLabeledArg('length', newLengthVal),
])
if (replaceExistingCallback) {
console.warn('ADAM: Probably needs to be adjusted for kw args')
const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
const result = replaceExistingCallback([
{
@ -2224,7 +2226,7 @@ export const angledLine: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input
const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode)
const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0)
@ -2234,18 +2236,17 @@ export const angledLine: SketchLineHelper = {
const lengthLit = createLiteral(lineLength)
const firstArg = callExpression.arguments?.[0]
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) {
mutateObjExpProp(firstArg, angleLit, 'angle')
mutateObjExpProp(firstArg, lengthLit, 'length')
}
removeDeterminingArgs(callExpression)
mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateKwArg(ARG_LENGTH, callExpression, lengthLit)
return {
modifiedAst: _node,
pathToNode,
}
},
getTag: getTag(),
addTag: addTag(),
getTag: getTagKwArg(),
addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper(
callExp,
@ -2259,7 +2260,7 @@ export const angledLine: SketchLineHelper = {
),
}
export const angledLineOfXLength: SketchLineHelper = {
export const angledLineOfXLength: SketchLineHelperKw = {
add: ({
node,
variables,
@ -2313,9 +2314,9 @@ export const angledLineOfXLength: SketchLineHelper = {
if (err(result)) return result
newLine = result.callExp
} else {
newLine = createCallExpression('angledLineOfXLength', [
createArrayExpression([angle, xLength]),
createPipeSubstitution(),
newLine = createCallExpressionStdLibKw('angledLineOfXLength', null, [
createLabeledArg(ARG_ANGLE, angle),
createLabeledArg(ARG_LENGTH_X, xLength),
])
}
const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
@ -2333,32 +2334,38 @@ export const angledLineOfXLength: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input
const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode)
const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0)
const xLength = roundOff(Math.abs(to[0] - from[0]), 2)
const firstArg = callExpression.arguments?.[0]
const adjustedXLength = isAngleLiteral(firstArg)
const oldAngle = findKwArg(ARG_ANGLE, callExpression)
if (oldAngle === undefined) {
return new Error(
`expected an angle arg, but it was not found. Args were ${allLabels(
callExpression
)}`
)
}
const adjustedXLength = isAngleLiteral(oldAngle)
? Math.abs(xLength)
: xLength // todo make work for variable angle > 180
const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedXLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) {
mutateObjExpProp(firstArg, angleLit, 'angle')
mutateObjExpProp(firstArg, lengthLit, 'length')
}
removeDeterminingArgs(callExpression)
mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateKwArg(ARG_LENGTH_X, callExpression, lengthLit)
return {
modifiedAst: _node,
pathToNode,
}
},
getTag: getTag(),
addTag: addTag(),
getTag: getTagKwArg(),
addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper(
callExp,
@ -2372,7 +2379,7 @@ export const angledLineOfXLength: SketchLineHelper = {
),
}
export const angledLineOfYLength: SketchLineHelper = {
export const angledLineOfYLength: SketchLineHelperKw = {
add: ({
node,
variables,
@ -2424,9 +2431,9 @@ export const angledLineOfYLength: SketchLineHelper = {
if (err(result)) return result
newLine = result.callExp
} else {
newLine = createCallExpression('angledLineOfYLength', [
createArrayExpression([angle, yLength]),
createPipeSubstitution(),
newLine = createCallExpressionStdLibKw('angledLine', null, [
createLabeledArg(ARG_ANGLE, angle),
createLabeledArg(ARG_LENGTH_Y, yLength),
])
}
const { index: callIndex } = splitPathAtPipeExpression(pathToNode)
@ -2444,32 +2451,38 @@ export const angledLineOfYLength: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input
const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode)
const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0)
const yLength = roundOff(to[1] - from[1], 2)
const firstArg = callExpression.arguments?.[0]
const adjustedYLength = isAngleLiteral(firstArg)
const oldAngle = findKwArg(ARG_ANGLE, callExpression)
if (oldAngle === undefined) {
return new Error(
`expected an angle arg, but it was not found. Args were ${allLabels(
callExpression
)}`
)
}
const adjustedYLength = isAngleLiteral(oldAngle)
? Math.abs(yLength)
: yLength // todo make work for variable angle > 180
const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedYLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) {
mutateObjExpProp(firstArg, angleLit, 'angle')
mutateObjExpProp(firstArg, lengthLit, 'length')
}
removeDeterminingArgs(callExpression)
mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateKwArg(ARG_LENGTH_Y, callExpression, lengthLit)
return {
modifiedAst: _node,
pathToNode,
}
},
getTag: getTag(),
addTag: addTag(),
getTag: getTagKwArg(),
addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper(
callExp,
@ -2483,7 +2496,7 @@ export const angledLineOfYLength: SketchLineHelper = {
),
}
export const angledLineToX: SketchLineHelper = {
export const angledLineToX: SketchLineHelperKw = {
add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => {
if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { from, to } = segmentInput
@ -2526,9 +2539,9 @@ export const angledLineToX: SketchLineHelper = {
}
}
const callExp = createCallExpression('angledLineToX', [
createArrayExpression([angle, xArg]),
createPipeSubstitution(),
const callExp = createCallExpressionStdLibKw('angledLineToX', null, [
createLabeledArg(ARG_ANGLE, angle),
createLabeledArg(ARG_END_ABSOLUTE_X, xArg),
])
pipe.body = [...pipe.body, callExp]
return {
@ -2540,30 +2553,28 @@ export const angledLineToX: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input
const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode)
const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0)
const xLength = roundOff(to[0], 2)
const firstArg = callExpression.arguments?.[0]
const adjustedXLength = xLength
const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedXLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) {
mutateObjExpProp(firstArg, angleLit, 'angle')
mutateObjExpProp(firstArg, lengthLit, 'to')
}
removeDeterminingArgs(callExpression)
mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateKwArg(ARG_END_ABSOLUTE_X, callExpression, lengthLit)
return {
modifiedAst: _node,
pathToNode,
}
},
getTag: getTag(),
addTag: addTag(),
getTag: getTagKwArg(),
addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper(
callExp,
@ -2577,7 +2588,7 @@ export const angledLineToX: SketchLineHelper = {
),
}
export const angledLineToY: SketchLineHelper = {
export const angledLineToY: SketchLineHelperKw = {
add: ({ node, pathToNode, segmentInput, replaceExistingCallback }) => {
if (segmentInput.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { from, to } = segmentInput
@ -2622,9 +2633,9 @@ export const angledLineToY: SketchLineHelper = {
}
}
const newLine = createCallExpression('angledLineToY', [
createArrayExpression([angle, yArg]),
createPipeSubstitution(),
const newLine = createCallExpressionStdLibKw('angledLine', null, [
createLabeledArg(ARG_ANGLE, angle),
createLabeledArg(ARG_END_ABSOLUTE_Y, yArg),
])
pipe.body = [...pipe.body, newLine]
return {
@ -2636,30 +2647,28 @@ export const angledLineToY: SketchLineHelper = {
if (input.type !== 'straight-segment') return STRAIGHT_SEGMENT_ERR
const { to, from } = input
const _node = { ...node }
const nodeMeta = getNodeFromPath<CallExpression>(_node, pathToNode)
const nodeMeta = getNodeFromPath<CallExpressionKw>(_node, pathToNode)
if (err(nodeMeta)) return nodeMeta
const { node: callExpression } = nodeMeta
const angle = roundOff(getAngle(from, to), 0)
const xLength = roundOff(to[1], 2)
const firstArg = callExpression.arguments?.[0]
const adjustedXLength = xLength
const angleLit = createLiteral(angle)
const lengthLit = createLiteral(adjustedXLength)
if (!mutateArrExp(firstArg, createArrayExpression([angleLit, lengthLit]))) {
mutateObjExpProp(firstArg, angleLit, 'angle')
mutateObjExpProp(firstArg, lengthLit, 'to')
}
removeDeterminingArgs(callExpression)
mutateKwArg(ARG_ANGLE, callExpression, angleLit)
mutateKwArg(ARG_END_ABSOLUTE_Y, callExpression, lengthLit)
return {
modifiedAst: _node,
pathToNode,
}
},
getTag: getTag(),
addTag: addTag(),
getTag: getTagKwArg(),
addTag: addTagKw(),
getConstraintInfo: (callExp, ...args) =>
commonConstraintInfoHelper(
callExp,
@ -2918,11 +2927,6 @@ export const updateStartProfileAtArgs: SketchLineHelper['updateArgs'] = ({
}
export const sketchLineHelperMap: { [key: string]: SketchLineHelper } = {
angledLine,
angledLineOfXLength,
angledLineOfYLength,
angledLineToX,
angledLineToY,
angledLineThatIntersects,
tangentialArcTo,
arc,
@ -2938,6 +2942,11 @@ export const sketchLineHelperMapKw: { [key: string]: SketchLineHelperKw } = {
yLine,
xLineTo,
yLineTo,
angledLine,
angledLineOfXLength,
angledLineOfYLength,
angledLineToX,
angledLineToY,
} as const
export function changeSketchArguments(
@ -2983,10 +2992,10 @@ export function changeSketchArguments(
})
}
if (fnName in sketchLineHelperMapKw) {
const isAbsolute =
callExpression.type === 'CallExpressionKw' &&
findKwArg(ARG_END_ABSOLUTE, callExpression) !== undefined
const correctFnName = fnNameToTooltip(isAbsolute, fnName)
const correctFnName =
callExpression.type === 'CallExpressionKw'
? fnNameToTooltip(allLabels(callExpression), fnName)
: fnName
if (err(correctFnName)) {
return correctFnName
}
@ -3015,9 +3024,11 @@ export function changeSketchArguments(
* To put it another way, function names don't map cleanly to tooltips, but function names + arguments do.
*/
export function fnNameToTooltip(
isAbsolute: boolean,
argLabels: string[],
fnName: string
): ToolTip | Error {
const isAbsolute =
argLabels.findIndex((label) => label === ARG_END_ABSOLUTE) >= 0
switch (fnName) {
case 'line':
return isAbsolute ? 'lineTo' : 'line'
@ -3028,6 +3039,23 @@ export function fnNameToTooltip(
case 'circleThreePoint':
case 'circle':
return fnName
case 'angledLine': {
const argmap: Record<string, ToolTip> = {
ARG_LENGTH_X: 'angledLineOfXLength',
ARG_LENGTH_Y: 'angledLineOfYLength',
ARG_END_ABSOLUTE_X: 'angledLineToX',
ARG_END_ABSOLUTE_Y: 'angledLineToY',
ARG_LENGTH: 'angledLine',
}
for (const [arg, tooltip] of Object.entries(argmap)) {
if (argLabels.findIndex((label) => label === arg) >= 0) {
return tooltip
}
}
const err = `Unknown angledline arguments, could not map to tooltip. Args were ${argLabels}`
console.error(err)
return new Error(err)
}
default:
const err = `Unknown sketch line function ${fnName}`
console.error(err)
@ -3055,6 +3083,12 @@ export function tooltipToFnName(tooltip: ToolTip): string | Error {
return 'xLine'
case 'yLineTo':
return 'yLine'
case 'angledLine':
case 'angledLineToX':
case 'angledLineToY':
case 'angledLineOfXLength':
case 'angledLineOfYLength':
return 'angledLine'
default:
return new Error(`Unknown tooltip function ${tooltip}`)
}
@ -3092,7 +3126,7 @@ export function getConstraintInfoKw(
return []
}
if (!(fnName in sketchLineHelperMapKw)) return []
const correctFnName = fnNameToTooltip(isAbsolute, fnName)
const correctFnName = fnNameToTooltip(allLabels(callExpression), fnName)
if (err(correctFnName)) {
console.error(correctFnName)
return []
@ -3453,6 +3487,7 @@ export function getTagFromCallExpression(
return new Error(`"${callExp.callee.name.name}" is not a sketch line helper`)
}
<<<<<<< HEAD
function isAngleLiteral(lineArugement: Expr): boolean {
return lineArugement?.type === 'ArrayExpression'
? isLiteralArrayOrStatic(lineArugement.elements[0])
@ -3462,6 +3497,25 @@ function isAngleLiteral(lineArugement: Expr): boolean {
?.value
)
: false
||||||| parent of 27a8a2a50 (Start changing JS codemods)
function isAngleLiteral(lineArugement: Expr): boolean {
return lineArugement?.type === 'ArrayExpression'
? isLiteralArrayOrStatic(lineArugement.elements[0])
: lineArugement?.type === 'ObjectExpression'
? isLiteralArrayOrStatic(
lineArugement.properties.find(({ key }) => key.name === 'angle')?.value
)
: false
=======
function isAngleLiteral(lineArgument: Expr): boolean {
return lineArgument?.type === 'ArrayExpression'
? isLiteralArrayOrStatic(lineArgument.elements[0])
: lineArgument?.type === 'ObjectExpression'
? isLiteralArrayOrStatic(
lineArgument.properties.find(({ key }) => key.name === 'angle')?.value
)
: lineArgument?.type === 'Literal'
>>>>>>> 27a8a2a50 (Start changing JS codemods)
}
type addTagFn = (
@ -3782,7 +3836,7 @@ export function getArgForEnd(lineCall: CallExpressionKw):
return getValuesForXYFns(arg)
}
case 'yLine':
case 'xLine':
case 'xLine': {
const arg = findKwArgAny(DETERMINING_ARGS, lineCall)
const tag = findKwArg(ARG_TAG, lineCall)
if (arg === undefined) {
@ -3790,6 +3844,30 @@ export function getArgForEnd(lineCall: CallExpressionKw):
} else {
return { val: arg, tag }
}
}
case 'angledLine': {
const angle = findKwArg(ARG_ANGLE, lineCall)
if (angle === undefined) {
return new Error(`call to ${name} needs an ${ARG_ANGLE} arg`)
}
const length = findKwArgAny(
[
ARG_LENGTH,
ARG_LENGTH_X,
ARG_LENGTH_Y,
ARG_END_ABSOLUTE_X,
ARG_END_ABSOLUTE_Y,
],
lineCall
)
if (length === undefined) {
return new Error(
`call to ${name} needs an arg like ${ARG_LENGTH}, or ${ARG_END_ABSOLUTE_X} or something`
)
}
const tag = findKwArg(ARG_TAG, lineCall)
return { val: [angle, length], tag }
}
default:
return new Error(`unknown function ${name}`)
}

View File

@ -5,7 +5,12 @@ import {
ARG_END_ABSOLUTE,
ARG_LENGTH,
ARG_TAG,
ARG_ANGLE,
DETERMINING_ARGS,
ARG_END_ABSOLUTE_X,
ARG_END_ABSOLUTE_Y,
ARG_LENGTH_X,
ARG_LENGTH_Y,
} from '@src/lang/constants'
import {
createArrayExpression,
@ -162,6 +167,43 @@ function createCallWrapper(
valueUsedInTransform,
}
}
if (
tooltip === 'angledLine' ||
tooltip === 'angledLineToX' ||
tooltip === 'angledLineToY' ||
tooltip === 'angledLineOfXLength' ||
tooltip === 'angledLineOfYLength'
) {
const args = [createLabeledArg(ARG_ANGLE, val[0])]
const v = val[1]
args.push(
(() => {
switch (tooltip) {
case 'angledLine':
return createLabeledArg(ARG_LENGTH, v)
case 'angledLineToX':
return createLabeledArg(ARG_END_ABSOLUTE_X, v)
case 'angledLineToY':
return createLabeledArg(ARG_END_ABSOLUTE_Y, v)
case 'angledLineOfXLength':
return createLabeledArg(ARG_LENGTH_X, v)
case 'angledLineOfYLength':
return createLabeledArg(ARG_LENGTH_Y, v)
}
})()
)
if (tag) {
args.push(createLabeledArg(ARG_TAG, tag))
}
return {
callExp: createCallExpressionStdLibKw(
'angledLine',
null, // Assumes this is being called in a pipeline, so the first arg is optional and if not given, will become pipeline substitution.
args
),
valueUsedInTransform,
}
}
} else {
// In this branch, `val` is an expression.
const arg = (() => {
@ -1685,8 +1727,7 @@ function getTransformMapPathKw(
}
return false
}
const isAbsolute = findKwArg(ARG_END_ABSOLUTE, sketchFnExp) !== undefined
const tooltip = fnNameToTooltip(isAbsolute, name)
const tooltip = fnNameToTooltip(allLabels(sketchFnExp), name)
if (err(tooltip)) {
return false
}
@ -1717,6 +1758,7 @@ function getTransformMapPathKw(
}
// check what constraints the function has
const isAbsolute = findKwArg(ARG_END_ABSOLUTE, sketchFnExp) !== undefined
const lineInputType = getConstraintType(argForEnd.val, name, isAbsolute)
if (lineInputType) {
const info = transformMap?.[tooltip]?.[lineInputType]?.[constraintType]

View File

@ -2,7 +2,7 @@ import type { Binary as BSONBinary } from 'bson'
import { v4 } from 'uuid'
import type { AnyMachineSnapshot } from 'xstate'
import type { SourceRange } from '@src/lang/wasm'
import type { CallExpressionKw, SourceRange } from '@src/lang/wasm'
import { isDesktop } from '@src/lib/isDesktop'
import type { AsyncFn } from '@src/lib/types'
@ -469,3 +469,7 @@ export function binaryToUuid(
hexValues.slice(10, 16).join(''),
].join('-')
}
export function allLabels(callExpression: CallExpressionKw): string[] {
return callExpression.arguments.map((a) => a.label.name)
}