diff --git a/e2e/playwright/flow-tests.spec.ts b/e2e/playwright/flow-tests.spec.ts index 28a3a718d..c40924f06 100644 --- a/e2e/playwright/flow-tests.spec.ts +++ b/e2e/playwright/flow-tests.spec.ts @@ -3928,6 +3928,55 @@ test.describe('Sketch tests', () => { page.getByRole('button', { name: 'Edit Sketch' }) ).toBeVisible() }) + test('Can delete most of a sketch and the line tool will still work', async ({ + page, + }) => { + const u = await getUtils(page) + await page.addInitScript(async () => { + localStorage.setItem( + 'persistCode', + `const sketch001 = startSketchOn('XZ') + |> startProfileAt([4.61, -14.01], %) + |> line([12.73, -0.09], %) + |> tangentialArcTo([24.95, -5.38], %)` + ) + }) + + await page.setViewportSize({ width: 1200, height: 500 }) + + await u.waitForAuthSkipAppStart() + await page.getByText('tangentialArcTo([24.95, -5.38], %)').click() + + await expect( + page.getByRole('button', { name: 'Edit Sketch' }) + ).toBeEnabled() + await page.getByRole('button', { name: 'Edit Sketch' }).click() + + await page.waitForTimeout(600) // wait for animation + + await page.getByText('tangentialArcTo([24.95, -5.38], %)').click() + await page.keyboard.press('End') + await page.keyboard.down('Shift') + await page.keyboard.press('ArrowUp') + await page.keyboard.press('Home') + await page.keyboard.up('Shift') + await page.keyboard.press('Backspace') + await u.openAndClearDebugPanel() + + await u.expectCmdLog('[data-message-type="execution-done"]', 10_000) + await page.waitForTimeout(100) + + await page.getByRole('button', { name: 'Line' }).click() + await page.waitForTimeout(100) + + await page.mouse.click(700, 200) + + await expect(page.locator('.cm-content')).toHaveText( + `const sketch001 = startSketchOn('XZ') + |> startProfileAt([4.61, -14.01], %) + |> line([0.31, 16.47], %)` + ) + }) test('Can exit selection of face', async ({ page }) => { // Load the app with the code panes await page.addInitScript(async () => { @@ -4317,7 +4366,7 @@ test.describe('Sketch tests', () => { await expect(page.locator('.cm-content')) .toHaveText(`const sketch001 = startSketchOn('XZ') |> startProfileAt([6.44, -12.07], %) - |> line([14.72, 2.01], %) + |> line([14.72, 1.97], %) |> tangentialArcTo([24.95, -5.38], %) |> line([1.97, 2.06], %) |> close(%) @@ -7506,17 +7555,25 @@ test('Basic default modeling and sketch hotkeys work', async ({ page }) => { await page.keyboard.press('e') await expect(page.locator('.cm-content')).toHaveText('//slae') await page.keyboard.press('Meta+/') - await page.waitForTimeout(2000) + await page.waitForTimeout(1000) // Test these hotkeys perform actions when // focus is on the canvas await page.mouse.move(600, 250) await page.mouse.click(600, 250) + + // work-around: to stop "keyboard.press('s')" from typing in the editor even when it should be blurred + await page.getByRole('button', { name: 'Commands ⌘K' }).click() + await page.waitForTimeout(100) + await page.keyboard.press('Escape') + await page.waitForTimeout(100) + // end work-around + // Start a sketch await page.keyboard.press('s') - await page.waitForTimeout(2000) + await page.waitForTimeout(1000) await page.mouse.move(800, 300, { steps: 5 }) await page.mouse.click(800, 300) - await page.waitForTimeout(2000) + await page.waitForTimeout(1000) await expect(lineButton).toHaveAttribute('aria-pressed', 'true', { timeout: 15_000, }) diff --git a/src/lang/queryAst.ts b/src/lang/queryAst.ts index c7579babf..2c437de7b 100644 --- a/src/lang/queryAst.ts +++ b/src/lang/queryAst.ts @@ -51,8 +51,16 @@ export function getNodeFromPath( let successfulPaths: PathToNode = [] let pathsExplored: PathToNode = [] for (const pathItem of path) { - if (typeof currentNode[pathItem[0]] !== 'object') + if (typeof currentNode[pathItem[0]] !== 'object') { + if (stopAtNode) { + return { + node: stopAtNode, + shallowPath: pathsExplored, + deepPath: successfulPaths, + } + } return new Error('not an object') + } currentNode = currentNode?.[pathItem[0]] successfulPaths.push(pathItem) if (!stopAtNode) { diff --git a/src/machines/modelingMachine.ts b/src/machines/modelingMachine.ts index f097610c0..8115a3378 100644 --- a/src/machines/modelingMachine.ts +++ b/src/machines/modelingMachine.ts @@ -258,7 +258,7 @@ const persistedContext: Partial = (typeof window !== export const modelingMachine = createMachine( { - /** @xstate-layout N4IgpgJg5mDOIC5QFkD2EwBsCWA7KAxAMICGuAxlgNoAMAuoqAA6qzYAu2qujIAHogC0ANhoAWAHQB2GgE4ATLNEAOAKwBGAMyzNAGhABPRFNWaJmscOXyp61aplWAvk-1oMOfAQDKYdgAJYLDByTm5aBiQQFjYwniiBBEFlK2l1Gil5UxpreTEpfSMEeTyJYU0reW1hVRTxYRc3dCw8Ql8AgFtUAFcgwPYSdjAI3hiOLnjQROTlGgl5ZUWxDK0ZVVlCxE1VOfXxGlUq2R1NKUaQdxavdv9ybiG+dhGosbjeRJpNhBpzy882vz+XxQDpgXABADyADcwAAnTAkAywZ7MVjjbjvRCfQxY37Nf4SbAQTBgAgAUXBcMCAGs-OQABYo6Jot4JITyYRSCTqDk6NSadSyMTyL6abQSZQ6KX2CwaM6uC741qE4mkilDWE0umM9SRVGxCaYpJ5OZidSiOw5TQ5DJfZbyCQKKQ1HlWLTKc14jzKokk8mPWHdDBM16GtlJexcxQHYSyVRiWrqL7qS3zFKSuPiIVmr1XKAqv1kvgsWFPeijFlhqbsxZpk0ldRiIW1L5SWxlEwWGqzGwJ3ME32kgAiwSGgWCoQmIcrGPDgiOEq0nMy9lkUjEiy+cdkEnEWXXsnUks0eX7yu8tPYDOIZEomAv2unBtn1YQPLF8zEFg5qmErryyaCnMNDCJY2wOFIsg0JoZ74BID5XvSBAjiSY5BCCYJlnqzLPpM-DGCYjqKIcyhNjIix6DiCAJlyxzLDKOygSBsH5gh153Bg-iQBw-gQN0sKtFqiFPuieGJFoChlIKKZSMoMhfuaW72BKShWOImQ0By6gsfBl4Mrp2oAJKqgQyAkLS44YeC-gwqW2DkCQmAiayr5aJoyjmEe1h-qBkrCMmwoOnktRNrMiwLDBCp-Oeen0gZiHGX6ZkWehoLWfSqACQAXvcjnOVW+Fvie6jSGICbKNsOjlKByYnqah6HHstg0DQ2lRUqcFsXFXWJaSRDcLA7CwiQeD+Bl2W5ZgvHYINt7DOWLwzmJiBaK13KyQsFV2LJyhfCaqi7q1J75Ns20NO13qdbF8UMr1xADUNI24DZcKcA5U0QDNAwUPN2Ghi+hVaOau6LBVrXyIKphiHtCwOvkLVyAcYptU0l2sddPUmf1uCDcNo0AIIAELeP4AAa+UA+JYoOg4Fg6GaEN-qoe1KGYUEcuI1ryK1yg6V1N30nd2O409-hEyTACaFPLUVJ7mLJjZyEojXQ1R1prh2qy1KRO3najeYCwLQsPXjz1kFAJLS0aEm7IKsxrFBG4ilRWTA9zZWadBCxlWIfMY7Fxs449o0kvg7CMgt+qidb7mSDsdhyX+AqkZRRQcjYaSHIF3OLHYfvakbWMm6LTBwqXuCfeQ3QIpqn2zT9VvhjyhHlIcUHhZksi7S71hmMINSZNzLVNvI+eIYXfrC8Hz3jdgOXgo5mAGP4jnYFAuCN656uOtm5TeTY9jJo1n7mhp0EqJF+sEvzmOT8Xo22W9i-L6v6+b4DJ7CBIv6LA4xyZKBVOK1yhx22MIEo24vaX0VGjQ2t8+r32erAXAJAmD+HYKgMm78qaiHMP-OSCZDw5GdmnA4JV1C2CbDkD0h55RXxigXeB90g6m0CCgtBGD-BS0jjhaOTcKhzAhhA8BFC1xij2nYL+TYEzxx0DsWQY99JMKnqwsAABHbojl-ChygOHbBK0LBzBqBkRMKQeSKGTFIcUpw-x5Gpn+X2F0DY3wDkXFhJcSDDUwCSJyPD-oy1WJIc0WQlDNUbFoZMcYv72BCq1UCWhHH0Kuow1xd93GjVhGALoMJbiIPYMiPxS1rbEVKinfIxiD7JgqjuJQvZ4aHgFCjGBzj-ZGRMgAJTAIIMAfAQjdCGPot8DgDqxi7nVepSYqLpDKvLTk6xwEgV-HQ5p19WkJRMhxMAXFPoBD4gJfAQkGSDIkg6P8h4KFyU5oKZMLUzAZH7uBWM4EmnRWSePZR3BH7oMwVCTx2ASAACNLaFNwjHY4EoMjeSFIKcoJCtiM3ML+Bx3N1iJJWQw95qTSQMnNlsjBqBfF-SKeGLImkJTRgUHsMRcK3x2AdPclqECKp70UXFfGAB3EaARZ7zwGB9L6c1-B4AAGaoAIBAbgYBCS4ChKgWkEgYDsEEDyyaggRWoEGVUDQ39e7hRzpYZmLthQeUgikfIZVsiNlZRIDlXKxqZTnpNaa9dKBCtwKKggcJYSZQkEwBE7BRWwg6AqvwyqHW8scmq91GqQV8NfFqoKOx3Jdy0usPa2g5hd1AnkcBiwDjLNeejAutqeKP3slouu31XXqvFZK6Vsr5WKsEGW96UbRWasqvMKxO1SKzHATDSS1h0jOmWAoCh1qS0BBbRWgVP03Ueq9T6v1gxA3BqbdOzAbaY1EtBSSzt0Lu01E5HIVWadXbchTMKfugCxQTs5TxcWZN51iolbgKVeAG1SqbYC2Agg+Bbo7eUFSpqMgWDKhsF2a4So5HAcscinJR5ONWcW+9ARH2k2fZ62E3rYS+v9aukNSqf1-oA7GlyhUqigW-rGFI3NKEUJZlkcw4h8hWPtjoAtHUi3j0nWLYmXDMOvvfTKuVX7Q3EYMKRndcaKMVDME2ChYH0h2IKGre5EgfZtg3FSuSd67WPolphxduHl0Bsymu8TALf2SfVYBoJ1Vtr5AhjkUUindx2A3DUXsp89M8XNiSQTdaP2icI4IfzXTbNkYKokSjkgvy2ECcQvav4DqJxPPGAUh5TxIYxfpXj4WjPYaXfh8zoXwtSYrLu+NFRUvLHSP3VqzpJlp0OF-A4UoEw-kob5gIOjw6BbffWkLTa+v0gq4tKrsnwHUYqgA+wGQaW8kkC1Q8ZpyhtgcD17RYJdH0kKzhvDK7SsjZ2+HcbUdyMxbk-MOTFRQL00bHtF0ZQrRayPNzaBhbDa8dLrCculdq6eOdVWrZNahNDcbaG37-37KA9hIIStc1zu8Mu4gKo6RdxCmtAKaC9gGM9wsJ5TuOQTCbZy28vLqH-DQ7BADmuwPBU1uM4dszQbQs04rrDmuCPZ2UGR-4o06PgJY+gukZ5qm06yS-gKYnclIzWoADJ4DxagAlBAcX4BVwSzVohonlTbEeWFW4Fjfx-HIBrNhWqK+V98glEhDK4A4AQTVEVHTribAPDQEUvixjmEecpyN3KnEQ0k7j+kldvtt5ge3jv2DO91JVmTV3BRlHcpBDcCg+StlrKOuTphFAJk+1xw2EetfR4AHKYIAAqoDwPkgg+MIAQH6J4gILA6+atsPStbpx24nFPYgTkHl3K-ghtsDc1hebk7D3FUvUeJCV-8DXuvsAbw-UJYn1Hb4-LcisAI4ZmRu5FGahp4UjXtbt2tQ7p3xyQJ90ZtYGDkL-JTLyHDBJSa5NyCv7H+P0mt-pDgqaRWBbQ8iXIv5FCrRzBWIyT7BZAj7WoAAquK4I-yU0ni5A3y6u9IuKUegypwIE5gCYMYCgDKEuxgtQZQ8Mzo1okEOQqg1q3QFcmCs0pYXUEIuAtag2wW8q+M3giBggTBEqggrB7A7BG8UWlMBif4OqbYEM5U6wQorY2q5oCY2msk+QQo1qnSoQBW+KmA2BuB+h+B6Qfu8Y1g64zcKQ5Bb4mkO4f4HcOwagv42hIQ30FsZeNqqGgkDqUAeADeTe-gmSuh+AAWvheA+BdW0gbcMiTyJirYGOGQBwCwgoxwFQIe6KFOcU5AJIZAgQ-qpIxylgJUlhpgMgmkJ4WQgEEMjoGg9MIEtyf4W2dwMqr03yNkfygKfo4OPBYmSqLRj8ggGCzanRQKEW0aHaJQn4oEg8Zy1oEB8KJujYdiNiGgsYGRX2-MvGAxbRnCvyAkXRpIzOpmBGTaOxpYQxqAIxBxYx-OxK1WpwUkFQMg6QphCxCAYoqQchQoWkR4goaKmx102xiCQRWSqAOSLRIsK+XBwmn6EgwhkJ08ggmS2SXSiJpsWEm+0WaOxUpu0KdhFUAo7xR4H4CWNgKYtQJOLyxeWxVO6JosKqC83iBgMJEOUqCJiCYaE0TJS8HaG40gJ4HGSwsMA+RUGO92UEkEaxjYDB0+32dJIJG6S8rJvR8JVx9JeAzar05azJHav4GmsMNgkodSAUOQ5gVgtg2wLUJJResCtJdqGpM84ak0S8K8OA68KpIm8qHJ6SuAXJjqPJkmr8Eh-+2JxQYo9hGgOwywpE8YR8FCKk9Q726hU+oe8pDpip2p70rpwZnpcJPpUJfpSpQZ7pIZWJUh4ZNRewyxG4dgzWwCWgzGh4kohw2wFgzRIJyCqC7RpMeZIWBZSJXZTAlxf6fJXIBusYqRFQyxe0LGu4lQoydgVp1JdpQJCpvpbC3ZnCEsfZ3p6pnJQ5I5BgepfckKI8Kc2OEi2w8wbop8lJKYHZG56imiU0o2u57J+5vp3SGikao2Ha4oDRnca4cuhqkBK4mOoEhwdB1MtpLSKGGZG5TAnii8WA75apggjpggSFXiPiepbWwoTW58MxQCb4QoXIJJEM5oDUIC1qRAOBmu-giBquBhneZo7mYo0iDgymJFgBJRpwZEigO0SgtF9FMAjFzFf+5ZMsigjYpUI8e4ZolKNyh4ApB4ncQlesmRM+EgdFuBTFauVA8goZFZAoTY3IEEjKX4ogOgylfFalgliwWhcp-MulDF+lLFmgxlMszxXIsYtQ8YYurMoFK0cgdlAlwFfkrK-guAmCwqJAlAPgE4uyYAcV1cbeCIb6gy84ZKwoOgMKzhNC7xnIZgzosYZ8eqCicpZA2AHQgwgknCy6b6aF1VtVQwI5cVlAgytML2tS5S5um4VE-cJUpKPaf4ViGxxeLVdVBynCPSX0gksAsUzVjurVXSwxi1j4khMscoZQxE4C2gFC64wVHxBw5pDSaxmQwSmlgJBcOh7hAW+hXhXKC1IQ3AzedwsIb6sIBAAAYngDNHtsEfdb9FJUaN+KcqYNMqIFGY9lRHJA6MdD8X+NMuuK4SER4fPn9Y7rAPSJAP4HdeFs7ltdbOUfMNuDVl3FdVuEBs2UoIjPdohgqDFRgPAFEIWqDXOLGNEpyGIrGTrMmByLuOPhlppB6GLTpIOBza+CIPyUsrzeVPkF8LnN-NaB6JDVUK1JVWmV1FLYDK1CMg-jnKIFLleYioSccBDEsu2c5WsrdKqLreJMQRphxRBDUOBgLdBCDGsFQmuBuLBchjxlToyXygznOuqg7StA1N-M6HGLYFVNoKKSaMNecnkM2ESVthuqHdWtGhHaRYoGTYodzBQuaJpDDJQWuAjA4MKOsGTtrWufpvxhhuHRNknpHcsPMNJGeYJSzO3faH+HYc5v7blmylTgZs+rnYKOKP3GVMpmoCBAoKKBkEEpaWLeuHJNsFtgVs3RdmGf8Q6KVZpEeJBNoGoMlgmTHTzRRP3NYFtqNuPS3QARxirXGGVNaBUS2C7JBapR6JDPNiuXBYHXahznTkDojmHTnQ-bvVBGzMdOmGoBVFUS7HQWUEehVApKRAcNbpHvobnZbYInIHJmuGIjYesNBuAlYrTEnKcFg54dfuwLg3bPMAQ+UEQ92q2GtCmA-g1KFZxquQXHPo9TFUGo5Lg-GJIFQyYsjYeAkaaGfhQhfjkDQ-PovsvuCKzTvRWaSqaNJD+KROkIfFRAbvMLyPxdVJnj-hwBPfVtIB6PaHURzMSUBPOWBJGNBUgSgZwFohgd8rncHstsQaxgQTBj7lPf3L8X-L+FrVpYbEISwQMGwbFBwRPVYl-JyI2PEqfKXVRDEhphkGvQg2DACTSddATaEWXr4yBCVHJB5lkNzNzO8cMo6KcN2h7nGLejbbdW4XocxU9eMAckEC0e9ZlF9b44ARKLYPGLU57O8T-RKCkI0tDfdkPVkRIKUxjY9ZOj4QJH4XhALuGKZSVK3CYH2joPEYY4kWsCkccFVBNXw+PDkWAHkbAAURPR7B2JKCYJkGtvWbYZkI6Hfk2BYG2BvR04AzxOcQEHsaMSSBPdA004Am6G-lk0UJUTuIoGuHIYzJBY+YWaCaibkr6fkhPZKNBieFzDYDUJUVUjUUKcVfRGPji9PPatyXykvMSypVAppBS-nqKTyF3OMyw8cFRZUIy6wsWey6SxrSUM6Dy6aV-M6NBE6BrRaaKwyc6YGW6WvLs-cYDCS0LVUKcB8xyLJEfIQSmH5UjFkFBaqw-Fmc-Jq+vBK-q2KLJGuByEfsAmtKYL+CdC1P3FYja0guwj2bC57TcxoIa5pL+LOXLAXsc-teILKXXfBeC52cG9uaGzA+AhG7JFG+8WPlGG2HRB6E8ss9pcCU+T+a+advSE61Aoa260PpYoQTYqIqILWeIIG9Tshd4lgKG0FLMMjHJHJJBDSpPQdKOr2jGNkNdcUwXK5WJe5bgwAt-PrrYPM2O3WapeFRpVFTFf4B1WALnfOO5N-JE5tAQkXXaDUN-IeEoKzJ8T7DpFNZwDNZgo1Ue5AxWeaGzNYBuDQbTFmj7ocI6CkEml+BBLcwbC+-VZgnNYNAtbFLnf3F2vASeIfodR6x8cDJaFZeSWNWjcDZjf9TjXjWszC1+95Qkme5RTEunC5lRFBF-CkNAzYLDDKy4C4EAA */ + /** @xstate-layout N4IgpgJg5mDOIC5QFkD2EwBsCWA7KAxAMICGuAxlgNoAMAuoqAA6qzYAu2qujIAHogC0ANhoAWAHQB2GgE4ATLNEAOAKwBGAMyzNAGhABPRFNWaJmscOXyp61aplWAvk-1oMOfAQDKYdgAJYLDByTm5aBiQQFjYwniiBBEFlK2l1Gil5UxpreTEpfSMEeTyJYU0reW1hVRTxYRc3dCw8Ql8AgFtUAFcgwPYSdjAI3hiOLnjQROTlGgl5ZUWxDK0ZVVlCxE1VOfXxGlUq2R1NKUaQdxavdv9ybiG+dhGosbjeRJpNhBpzy882vz+XxQDpgXABADyADcwAAnTAkAywZ7MVjjbjvRCfQxY37Nf4SbAQTBgAgAUXBcMCAGs-OQABYo6Jot4JITyYRSCTqDk6NSadSyMTyL6abQSZQ6KX2CwaM6uC741qE4mkilDWE0umM9SRVGxCaYpJ5OZidSiOw5TQ5DJfZbyCQKKQ1HlWLTKc14jzKokk8mPWHdDBM16GtlJexcxQHYSyVRiWrqL7qS3zFKSuPiIVmr1XKAqv1kvgsWFPeijFlhqbsxZpk0ldRiIW1L5SWxlEwWGqzGwJ3ME32kgAiwSGgWCoQmIcrGPDgiOEq0nMy9lkUjEiy+cdkEnEWXXsnUks0eX7yu8tPYDOIZEomAv2unBtn1YQPLF8zEFg5qmErryyaCnMNDCJY2wOFIsg0JoZ74BID5XvSBAjiSY5BCCYJlnqzLPpM-DGCYjqKIcyhNjIix6DiCAJlyxzLDKOygSBsH5gh153Bg-iQBw-gQN0sKtFqiFPuieGJFoChlIKKZSMoMhfuaW72BKShWOImQ0By6gsfBl4Mrp2oAJKqgQyAkLS44YeC-gwqW2DkCQmAiayr5aJoyjmEe1h-qBkrCMmwoOnktRNrMiwLDBCp-Oeen0gZiHGX6ZkWehoLWfSqACQAXvcjnOVW+Fvie6jSGICbKNsOjlKByYnqah6HHstg0DQ2lRUqcFsXFXWJaSRDcLA7CwiQeD+Bl2W5ZgvHYINt7DOWLwzmJiBaK13KyQsFV2LJyhfCaqi7q1J75Ns20NO13qdbF8UMr1xADUNI24DZcKcA5U0QDNAwUPN2Ghi+hVaOau6LBVrXyIKphiHtCwOvkLVyAcYptU0l2sddPUmf1uCDcNo0AIIAELeP4AAa+UA+JYoOg4Fg6GaEN-qoe1KGYUEcuI1ryK1yg6V1N30nd2O409-hEyTACaFPLUVJ7mLJjZyEojXQ1R1prh2qy1KRO3najeYCwLQsPXjz1kFAJLS0aEm7IKsxrFBG4ilRWTA9zZWadBCxlWIfMY7Fxs449o0kvg7CMgt+qidb7mSDsdhyX+AqkZRRQcjYaSHIF3OLHYfvakbWMm6LTBwqXuCfeQ3QIpqn2zT9VvhjyhHlIcUHhZksi7S71hmMINSZNzLVNvI+eIYXfrC8Hz3jdgOXgo5mAGP4jnYFAuCN656uOtm5TeTY9jJo1n7mhp0EqJF+sEvzmOT8Xo22W9i-L6v6+b4DJ7CBIv6LA4xyZKBVOK1yhx22MIEo24vaX0VGjQ2t8+r32erAXAJAmD+HYKgMm78qaiHMP-OSCZDw5GdmnA4JV1C2CbDkD0h55RXxigXeB90g6m0CCgtBGD-BS0jjhaOTcKhzAhhA8BFC1xij2nYL+TYEzxx0DsWQY99JMKnqwsAABHbojl-ChygOHbBK0LBzBqBkRMKQeSKGTFIcUpw-x5Gpn+X2F0DY3wDkXFhJcSDDUwCSJyPD-oy1WJIc0WQlDNUbFoZMcYv72BCq1UCWhHH0Kuow1xd93GjVhGALoMJbiIPYMiPxS1rbEVKinfIxiD7JgqjuJQvZ4aHgFCjGBzj-ZGRMgAJTAIIMAfAQjdCGPot8DgDqxi7nVepSYqLpDKvLTk6xwEgV-HQ5p19WkJRMhxMAXFPoBD4gJfAQkGSDIkg6P8h4KFyU5oKZMLUzAZH7uBWM4EmnRWSePZR3BH7oMwVCTx2ASAACNLaFNwjHY4EoMjeSFIKcoJCtiM3ML+Bx3N1iJJWQw95qTSQMnNlsjBqBfF-SKeGLImkJTRgUHsMRcK3x2AdPclqECKp70UXFfGAB3EaARZ7zwGB9L6c1-B4AAGaoAIBAbgYBCS4ChKgWkEgYDsEEDyyaggRWoEGVUDQ39e7hRzpYZmLthQeUgikfIZVsiNlZRIDlXKxqZTnpNaa9dKBCtwKKggcJYSZQkEwBE7BRWwg6AqvwyqHW8scmq91GqQV8NfFqoKOx3Jdy0usPa2g5hd1AnkcBiwDjLNeejAutqeKP3slouu31XXqvFZK6Vsr5WKsEGW96UbRWasqvMKxO1SKzHATDSS1h0jOmWAoCh1qS0BBbRWgVP03Ueq9T6v1gxA3BqbdOzAbaY1EtBSSzt0Lu01E5HIVWadXbchTMKfugCxQTs5TxcWZN51iolbgKVeAG1SqbYC2Agg+Bbo7eUFSpqMgWDKhsF2a4So5HAcscinJR5ONWcW+9ARH2k2fZ62E3rYS+v9aukNSqf1-oA7GlyhUqigW-rGFI3NKEUJZlkcw4h8hWPtjoAtHUi3j0nWLYmXDMOvvfTKuVX7Q3EYMKRndcaKMVDME2ChYH0h2IKGre5EgfZtg3FSuSd67WPolphxduHl0Bsymu8TALf2SfVYBoJ1Vtr5AhjkUUindx2A3DUXsp89M8XNiSQTdaP2icI4IfzXTbNkYKokSjkgvy2ECcQvav4DqJxPPGAUh5TxIYxfpXj4WjPYaXfh8zoXwtSYrLu+NFRUvLHSP3VqzpJlp0OF-A4UoEw-kob5gIOjw6BbffWkLTa+v0gq4tKrsnwHUYqgA+wGQaW8kkC1Q8ZpyhtgcD17RYJdH0kKzhvDK7SsjZ2+HcbUdyMxbk-MOTFRQL00bHtF0ZQrRayPNzaBhbDa8dLrCculdq6eOdVWrZNahNDcbaG37-37KA9hIIStc1zu8Mu4gKo6RdxCmtAKaC9gGM9wsJ5TuOQTCbZy28vLqH-DQ7BADmuwPBU1uM4dszQbQs04rrDmuCPZ2UGR-4o06PgJY+gukZ5qm06yS-gKYnclIzWoADJ4DxagAlBAcX4BVwSzVohonlTbEeWFW4Fjfx-HIBrNhWqK+V98glEhDK4A4AQTVEVHTribAPDQEUvixjmEecpyN3KnEQ0k7j+kldvtt5ge3jv2DO91JVmTMXFAlSg97UC8WOStiUG72M5piruVktbyP+Lo8ADlMEAAVUB4HyQQfGEAID9E8QEFgteddQWY0cE82hJSGqKAhjTTMIIrjXAo8nYe4oR61+XqvNfwSwBvD9QlifUdvj8tyKwAjhmZG7kUZqGnhSNe1u3a1DunfHJAn3Rm1gYOQv8lMvIcMElJrk3IM-sf4-SbX+kcFmkrBbQ8iXIP5FCrRzBWIyT7BZDuSqDWoAAquK4I-yU0ni5A3y6u9IuKUegypwIE5gCYMYCgDKEuxgtQZQ8Mzo1okEOQsBE+hs3QFcmCs0pYXUEIuAtag2wW8q+M3gcBggDBEqggzB7ArBG8UWlMBif4OqbYEM5U6wQorY2q5oCY2msk+QQo1qnSoQBWpeGBWBpeOB6Qfu8Y1g64zcKQJBb4mkO4f4HcOwagv4mhIQ30FsM+NqqGgkQQdwFcuSsIb6sIBAAAYngDNHtpktofgMCt-tFlsIFGUKYNMqIBoBoKeogHJA6MdEKFpNMuuE4REa4VHu4VyoJA6lAHgPXo3v4OES4QFqUXgDgXVtIG3DIk8iYq2BjhkAcAsIKMcBUCHuihTnFFoTUW4cEY7rAPSJAP4MMeFs7uIQEjIIItuDVl3MEiAYgKzI6EeEoIjPdv0V9vzOQCSGQIEP6qSMcpYCVGYaYIsVUCUP3itDyKnhoPTCBLcn+Ftt4V8pwr8gJICn6ODlwWJkql8a9IIBgs2n8v8RFtGh2iUJ+KBIPGctaOsQgCeCbo2HYjYhoLGPsVxt9lTqCaWN8jZFCUCqSMzqZgRk2kSUqhCb8f8uSfzsStVqcFJBUDIOkEYaiWKKkDIVkX+EeIKGigcddLxt4SLBklkqgDkhKdPHXoCSJvKoIXKabIIJktkl0qqU9FhKvjEcUMVKbtCtYRVAKKiUeB+AljYCmLUCTi8vifzOKYgvahNAvN4gYBwcJp+hICqYgmGq6XykvB2huNICeBxksLDKkUVBjvdlBJBDiY2LQaHgSXatqQ-K9OWu6Z6RDlKr6ekrgM2hme9EGfMYLmAhprDDYJKHUgFDkOYFYLYNsC1BaZ9g6WKYSc6Sqm6UvCvDgOvNmUCT6agIIGmQWV2YGZJq-GIdERIQaeKC6DsMsKRPGEfBQipPUO9qobzHQY6R2fmS9HZMWS-H2ewYqd6XmZKQWRukvGFieXCSVHsJiRuHYM1sAloMxoeH3lqhYJ8c6cgqgiSaTAOUqbmcOaOUIewuCcOXwMGVyAbnnr0cintCxruJUKMnYE2fabAruamX+ewiSRLMBeeWBX6f+UwFBYIAYB2qYC9moQoCnNjhItsPMG6KfLaSmL+fueopolNKNkRSFhedPN0hopGqNh2uKG8Z3GuHLg8W+CuJjqBIcNQdTK2dhe2bhfuUwJ4ovFgPxcqSRfmYIFpV4j4tRW1sKE1ufIiUAm+EKFyBaRDOaA1CAtakQJgZrv4HAarpgHMTOTLN5u5mKNIg4MpjZb-lcacGRIoDtEoK5e5TAJ5d5V-nqbOSnpIO7kQcKGaJSjcoeKGQeJ3DFXrAMZPhIG5VgV5WrlQPIH5UaAKE2NyBBIyl+KIDoLlRFQVdFYsBoTuddOVR5ZVT5VQJoLVeGByVyLGLUPGGLqzLJeFflVFdJX5Kyv4LgJgsKiQJQD4BOLsmABtdXK3giG+oMvOGSsKDoDCg4TQqiZyGYM6LGGfHquPsmWQNgB0IMIJJwsum+npVKq9e9UMBRRtZQIMrTC9rUuUubpuFRP3CVKSj2n+FYnibAv9R9Qcpwj0l9J4bFL9RIKjYDRCbALFKDWueAlEkcBQuuLJdaAdBUA0jiZkGsS4AqGtRgPAFEIWilTLCIDnksmIsuTrMmExnBpkPdYoBYCkDpIOFzUaCICGXzWxuVPkF8LnN-NaB6AkVUK1M9SVQLDLU3K1CMjfjnKIFLhIg6HGYPD-NBGItavAvra5AQRpkFRBDUOBkLdBCDGsFQmuBuKpS0ihnauOTOi6qDtGg7YDA1N-M6HGLYFVNoFGSaHDecnkM2GaVthugznOuqhHeJAoDuMRMcNzBQuaJpDDGQWuAjA4MKOsGTsmThQ+vxhhjnRNknitEKIItJJCudZYYoMsBpv-spmOtBFtgZs+rne3fORnspmoCBAoKKBkEEo2R6AQnJNsFtgVi3RdvqcKQ6PdZpEeJBL3rJa7HBbGJyF3MypUFtqNuPa3T-hxmrXGGVNaJpNsHvmjopflR6JDPNlhQHTxlThznTkDojtneHffTvVBGzMdOmGoBVFkHtNQWUEehVApKRAcMXjPhPcUKmNzPHWPt2l8CFI6EzLYkOhrVg4UefuwDgxDF3PMHIHJoQ6cK2GtCmDfg1HIOOr1QXNPoUWtUGo5HQ-GJIEnFQb+CmIeO0aaEfhQifjkFQ6XhIBXv4NXrXuzdvalTsKaNJD+KROkIfFRAbvMLyJFdVPnR-hwDgymHgQrPaC8RzOaUBKhWBJGMpfAYgZwFoqgd8jg8HstgQaxrgTBj7lPeAoKX-L+DraKQXAIUwQMCwbFGwTY1Yl-JyI2PEqfGXVRDEgPVphRBFOIHkSMVHv4yBCVHJB5lkNzNzKicMtHV0VWbJC1NufXddDMZEW4ZOp4SENwE3ncH4XCP47-hKLYPGDU57KiT-RKCkI0kkfdv7chuPJ0wUcoz0wcnUXhALmNeEmUNsCYH2joG0cYx0WsN0ccFVMjQA-pKswFso2MaEVMXc2ACM4TvYI5TEunC5lRFBF-CkNAzYLDM6EmbrYcccUgmcTYx7B2JKCYJkGtq+VYZkI6Ffk2BYG2Ovbw4Axpd8T8mSSSDY9A46BUC1R6E-jk0UOiQXf-DIYzIpZxZeVUdKbKXkpoyjjvZKNBj3ppDYDUOiVUhDCS1LlYvRBDEs7lmynuUy8He6TY1y7uDyyUCC8dELQw2lpc05dfdi5ThpUy9eUUFowEgq1AryyqwBFMssF-M6DbUCyibpjq1K3q9PC6Y6t2ceWvNsyyYDCaz3qcHCxyLJEfHgSmJNUjFkEpYyy6wa72Z6-K3lVAv62uByB-W+BaGrb+CdC1P3FYlG6wmRYBUS57VcxoP65pL+MhXLH3Yc+AtaH2I60UTxKOWwgBZwhLEWzA+AqWy01kKieK1GG2HRB6E8hK4MY2wEM29xVoqNvG9y1UEmwAkG1Mo4LMqIqIM+cUw206Zpdpd4lgEW0FLMMjHJHJJBDSoKMxaOr2jGNkMVbE+PP1QlYNXQwAt-PrrYHM+ey+Qtcm0tbFY66tetZta85A7OfOO5N-NE5tAQsXXaDUN-IeEoKzLyT7DpPjZ9Zgt9SB0a9bEBimhuJQbTFmj7ocI6CkEml+BBNcwSOh+jZgpjYNNjdqDg-3F2tASeLvpTam2aY1ZzOArYIjczU4EAA */ id: 'Modeling', tsTypes: {} as import('./modelingMachine.typegen').Typegen0, @@ -529,7 +529,7 @@ export const modelingMachine = createMachine( always: [ { target: 'normal', - cond: 'is editing existing sketch', + cond: 'has made first point', actions: 'set up draft line', }, 'No Points', @@ -859,6 +859,24 @@ export const modelingMachine = createMachine( }, { guards: { + 'has made first point': ({ sketchDetails }) => { + if (!sketchDetails?.sketchPathToNode) return false + const variableDeclaration = getNodeFromPath( + kclManager.ast, + sketchDetails.sketchPathToNode, + 'VariableDeclarator' + ) + if (err(variableDeclaration)) return false + if (variableDeclaration.node.type !== 'VariableDeclarator') return false + const pipeExpression = variableDeclaration.node.init + if (pipeExpression.type !== 'PipeExpression') return false + const hasStartSketchOn = pipeExpression.body.some( + (item) => + item.type === 'CallExpression' && + item.callee.name === 'startSketchOn' + ) + return hasStartSketchOn && pipeExpression.body.length > 1 + }, 'is editing existing sketch': ({ sketchDetails }) => isEditingExistingSketch({ sketchDetails }), 'Can make selection horizontal': ({ selectionRanges }) => {