diff --git a/e2e/playwright/flow-tests.spec.ts b/e2e/playwright/flow-tests.spec.ts
index abb3c973b..bba7f3244 100644
--- a/e2e/playwright/flow-tests.spec.ts
+++ b/e2e/playwright/flow-tests.spec.ts
@@ -4239,6 +4239,130 @@ ${extraLine ? "const myVar = segLen('seg01', part001)" : ''}`
}
}
})
+ test.describe('Testing remove constraints segments', () => {
+ const cases = [
+ {
+ before: `line([22 + 0, 2 + 0], %, 'seg01')`,
+ after: `line([22, 2], %, 'seg01')`,
+ },
+
+ {
+ before: `angledLine([5 + 0, 23.03 + 0], %, 'seg01')`,
+ after: `line([22.94, 2.01], %, 'seg01')`,
+ },
+ {
+ before: `xLine(23 + 0, %, 'seg01')`,
+ after: `line([23, 0], %, 'seg01')`,
+ },
+ {
+ before: `yLine(-8 + 0, %, 'seg01')`,
+ after: `line([0, -8], %, 'seg01')`,
+ },
+ {
+ before: `xLineTo(30 + 0, %, 'seg01')`,
+ after: `line([25, 0], %, 'seg01')`,
+ },
+ {
+ before: `yLineTo(-4 + 0, %, 'seg01')`,
+ after: `line([0, -10], %, 'seg01')`,
+ },
+ {
+ before: `angledLineOfXLength([3 + 0, 30 + 0], %, 'seg01')`,
+ after: `line([30, 1.57], %, 'seg01')`,
+ },
+ {
+ before: `angledLineOfYLength([3 + 0, 1.5 + 0], %, 'seg01')`,
+ after: `line([28.62, 1.5], %, 'seg01')`,
+ },
+ {
+ before: `angledLineToX([3 + 0, 30 + 0], %, 'seg01')`,
+ after: `line([25, 1.31], %, 'seg01')`,
+ },
+ {
+ before: `angledLineToY([3 + 0, 7 + 0], %, 'seg01')`,
+ after: `line([19.08, 1], %, 'seg01')`,
+ },
+ {
+ before: `angledLineOfXLength({ angle: 3 + 0, length: 30 + 0 }, %, 'seg01')`,
+ after: `line([30, 1.57], %, 'seg01')`,
+ },
+ {
+ before: `angledLineOfYLength({ angle: 3 + 0, length: 1.5 + 0 }, %, 'seg01')`,
+ after: `line([28.62, 1.5], %, 'seg01')`,
+ },
+ {
+ before: `angledLineToX({ angle: 3 + 0, to: 30 + 0 }, %, 'seg01')`,
+ after: `line([25, 1.31], %, 'seg01')`,
+ },
+ {
+ before: `angledLineToY({ angle: 3 + 0, to: 7 + 0 }, %, 'seg01')`,
+ after: `line([19.08, 1], %, 'seg01')`,
+ },
+ ]
+
+ for (const { before, after } of cases) {
+ const isObj = before.includes('{ angle: 3')
+ test(`${before.split('(')[0]}${isObj ? '-[obj-input]' : ''}`, async ({
+ page,
+ }) => {
+ await page.addInitScript(
+ async ({ lineToBeDeleted }) => {
+ localStorage.setItem(
+ 'persistCode',
+ `const part001 = startSketchOn('XZ')
+ |> startProfileAt([5, 6], %)
+ |> ${lineToBeDeleted}
+ |> line([-10, -15], %)
+ |> angledLine([-176, segLen('seg01', %)], %)`
+ )
+ },
+ {
+ lineToBeDeleted: before,
+ }
+ )
+ const u = await getUtils(page)
+ await page.setViewportSize({ width: 1200, height: 500 })
+ await page.goto('/')
+ await u.waitForAuthSkipAppStart()
+ await page.waitForTimeout(300)
+
+ await page.getByText(before).click()
+ await page.waitForTimeout(100)
+ await page.getByRole('button', { name: 'Edit Sketch' }).click()
+ await page.waitForTimeout(500)
+
+ await expect(page.getByTestId('segment-overlay')).toHaveCount(3)
+ const segmentToDelete = await u.getBoundingBox(
+ `[data-overlay-index="0"]`
+ )
+
+ const isYLine = before.toLowerCase().includes('yline')
+ const hoverPos = {
+ x: segmentToDelete.x + (isYLine ? 0 : -20),
+ y: segmentToDelete.y + (isYLine ? -20 : 0),
+ }
+ await expect(page.getByText('Added variable')).not.toBeVisible()
+ const ang = isYLine ? 45 : -45
+ const [x, y] = [
+ Math.cos((ang * Math.PI) / 180) * 45,
+ Math.sin((ang * Math.PI) / 180) * 45,
+ ]
+
+ await page.mouse.move(hoverPos.x + x, hoverPos.y + y)
+ await page.mouse.move(hoverPos.x, hoverPos.y, { steps: 5 })
+
+ await expect(page.locator('.cm-content')).toContainText(before)
+
+ await page.getByTestId('overlay-menu').click()
+ await page.getByText('Remove constraints').click()
+
+ await expect(page.locator('.cm-content')).toContainText(after)
+ // check the cursor was left in the correct place after transform
+ await expect(page.locator('.cm-activeLine')).toHaveText('|> ' + after)
+ await expect(page.getByTestId('segment-overlay')).toHaveCount(3)
+ })
+ }
+ })
})
test('First escape in tool pops you out of tool, second exits sketch mode', async ({
page,
diff --git a/src/clientSideScene/ClientSideSceneComp.tsx b/src/clientSideScene/ClientSideSceneComp.tsx
index 7f4e9b3f3..b5419d20d 100644
--- a/src/clientSideScene/ClientSideSceneComp.tsx
+++ b/src/clientSideScene/ClientSideSceneComp.tsx
@@ -420,12 +420,16 @@ const SegmentMenu = ({
verticalPosition === 'top' ? 'bottom-full' : 'top-full'
} z-10 w-36 flex flex-col gap-1 divide-y divide-chalkboard-20 dark:divide-chalkboard-70 align-stretch px-0 py-1 bg-chalkboard-10 dark:bg-chalkboard-100 rounded-sm shadow-lg border border-solid border-chalkboard-20/50 dark:border-chalkboard-80/50`}
>
- {/* */}
+