fix profile start snap bug

This commit is contained in:
Kurt Hutten Irev-Dev
2025-02-11 17:31:49 +11:00
parent 5ae92bcf5c
commit cba2349064
2 changed files with 91 additions and 2 deletions

View File

@ -1348,6 +1348,85 @@ test.describe(`Sketching with offset planes`, () => {
}) })
test.describe('multi-profile sketching', () => { test.describe('multi-profile sketching', () => {
test(`snapToProfile start only works for current profile`, async ({
context,
page,
scene,
toolbar,
editor,
homePage,
}) => {
// We seed the scene with a single offset plane
await context.addInitScript(() => {
localStorage.setItem(
'persistCode',
`sketch001 = startSketchOn('XZ')
profile002 = startProfileAt([40.68, 87.67], sketch001)
|> xLine(239.17, %)
profile003 = startProfileAt([206.63, -56.73], sketch001)
|> xLine(-156.32, %)
`
)
})
await homePage.goToModelingScene()
await expect(
page.getByRole('button', { name: 'Start Sketch' })
).not.toBeDisabled()
const [onSegmentClick] = scene.makeMouseHelpers(604, 349)
const [endOfLowerSegClick, endOfLowerSegMove] = scene.makeMouseHelpers(
697,
360
)
const [profileStartOfHigherSegClick, profileStartOfHigherSegMove] =
scene.makeMouseHelpers(677, 78)
const tanArcLocation = { x: 624, y: 340 } as const
await test.step('enter sketch mode', async () => {
await onSegmentClick({ shouldDbClick: true })
await page.waitForTimeout(600)
})
const codeFromTangentialArc = ` |> tangentialArcTo([39.49, 88.22], %)`
await test.step('check that tangential tool does not snap to other profile starts', async () => {
await toolbar.tangentialArcBtn.click()
await endOfLowerSegMove()
await endOfLowerSegClick()
await profileStartOfHigherSegClick()
await editor.expectEditor.toContain(codeFromTangentialArc)
await editor.expectEditor.not.toContain(
`[profileStartX(%), profileStartY(%)]`
)
})
await test.step('remove tangential arc code to reset', async () => {
await scene.expectPixelColor(TEST_COLORS.WHITE, tanArcLocation, 15)
await editor.replaceCode(codeFromTangentialArc, '')
// check pixel is now gray at tanArcLocation to verify code has executed
await scene.expectPixelColor([26, 26, 26], tanArcLocation, 15)
await editor.expectEditor.not.toContain(
`tangentialArcTo([39.49, 88.22], %)`
)
})
await test.step('check that tangential tool does snap to current profile start', async () => {
await expect
.poll(async () => {
await toolbar.lineBtn.click()
return toolbar.lineBtn.getAttribute('aria-pressed')
})
.toBe('true')
await profileStartOfHigherSegMove()
await endOfLowerSegMove()
await endOfLowerSegClick()
await profileStartOfHigherSegClick()
await editor.expectEditor.toContain('line(end = [-10.82, 144.95])')
await editor.expectEditor.not.toContain(
`[profileStartX(%), profileStartY(%)]`
)
})
})
test('Can add multiple profiles to a sketch (all tool types)', async ({ test('Can add multiple profiles to a sketch (all tool types)', async ({
scene, scene,
toolbar, toolbar,

View File

@ -880,7 +880,7 @@ export class SceneEntities {
let intersection2d = intersectionPoint?.twoD let intersection2d = intersectionPoint?.twoD
const intersectsProfileStart = args.intersects const intersectsProfileStart = args.intersects
.map(({ object }) => getParentGroup(object, [PROFILE_START])) .map(({ object }) => getParentGroup(object, [PROFILE_START]))
.find((a) => a?.name === PROFILE_START) .find(isGroupStartProfileForCurrentProfile(sketchEntryNodePath))
let modifiedAst: Program | Error = structuredClone(kclManager.ast) let modifiedAst: Program | Error = structuredClone(kclManager.ast)
@ -1961,7 +1961,7 @@ export class SceneEntities {
draftInfo && draftInfo &&
intersects intersects
.map(({ object }) => getParentGroup(object, [PROFILE_START])) .map(({ object }) => getParentGroup(object, [PROFILE_START]))
.find((a) => a?.name === PROFILE_START) .find(isGroupStartProfileForCurrentProfile(sketchEntryNodePath))
const intersection2d = intersectsProfileStart const intersection2d = intersectsProfileStart
? new Vector2( ? new Vector2(
intersectsProfileStart.position.x, intersectsProfileStart.position.x,
@ -2841,3 +2841,13 @@ function computeSelectionFromSourceRangeAndAST(
} }
return selection return selection
} }
function isGroupStartProfileForCurrentProfile(sketchEntryNodePath: PathToNode) {
return (group: Group<Object3DEventMap> | null) => {
if (group?.name !== PROFILE_START) return false
const groupExpressionIndex = Number(group.userData.pathToNode[1][0])
const isProfileStartOfCurrentExpr =
groupExpressionIndex === sketchEntryNodePath[1][0]
return isProfileStartOfCurrentExpr
}
}