Update KCL in JS project
This commit is contained in:
		@ -19,7 +19,7 @@ length001 = timesFive(1) * 5
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([20, 10], %)
 | 
			
		||||
  |> line(end = [10, 10])
 | 
			
		||||
  |> angledLine([-45, length001], %)
 | 
			
		||||
  |> angledLine(angle = -45, length = length001)
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
revolve001 = revolve(sketch001, axis = "X")
 | 
			
		||||
@ -38,7 +38,7 @@ extrude001 = extrude(sketch002, length = 10)
 | 
			
		||||
 | 
			
		||||
const FEATURE_TREE_SKETCH_CODE = `sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([0, 0], %)
 | 
			
		||||
  |> angledLine([0, 4], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 4, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       2
 | 
			
		||||
 | 
			
		||||
@ -105,80 +105,80 @@ test.describe('Point-and-click tests', () => {
 | 
			
		||||
        toolbar: ToolbarFixture,
 | 
			
		||||
        scene: SceneFixture
 | 
			
		||||
      ) =>
 | 
			
		||||
      async ({
 | 
			
		||||
        clickCoords,
 | 
			
		||||
        cameraPos,
 | 
			
		||||
        cameraTarget,
 | 
			
		||||
        beforeChamferSnippet,
 | 
			
		||||
        afterChamferSelectSnippet,
 | 
			
		||||
        afterRectangle1stClickSnippet,
 | 
			
		||||
        afterRectangle2ndClickSnippet,
 | 
			
		||||
        beforeChamferSnippetEnd,
 | 
			
		||||
      }: {
 | 
			
		||||
        clickCoords: { x: number; y: number }
 | 
			
		||||
        cameraPos: { x: number; y: number; z: number }
 | 
			
		||||
        cameraTarget: { x: number; y: number; z: number }
 | 
			
		||||
        beforeChamferSnippet: string
 | 
			
		||||
        afterChamferSelectSnippet: string
 | 
			
		||||
        afterRectangle1stClickSnippet: string
 | 
			
		||||
        afterRectangle2ndClickSnippet: string
 | 
			
		||||
        beforeChamferSnippetEnd?: string
 | 
			
		||||
      }) => {
 | 
			
		||||
        const [clickChamfer] = scene.makeMouseHelpers(
 | 
			
		||||
          clickCoords.x,
 | 
			
		||||
          clickCoords.y
 | 
			
		||||
        )
 | 
			
		||||
        const [rectangle1stClick] = scene.makeMouseHelpers(573, 149)
 | 
			
		||||
        const [rectangle2ndClick, rectangle2ndMove] = scene.makeMouseHelpers(
 | 
			
		||||
          598,
 | 
			
		||||
          380,
 | 
			
		||||
          { steps: 5 }
 | 
			
		||||
        )
 | 
			
		||||
        async ({
 | 
			
		||||
          clickCoords,
 | 
			
		||||
          cameraPos,
 | 
			
		||||
          cameraTarget,
 | 
			
		||||
          beforeChamferSnippet,
 | 
			
		||||
          afterChamferSelectSnippet,
 | 
			
		||||
          afterRectangle1stClickSnippet,
 | 
			
		||||
          afterRectangle2ndClickSnippet,
 | 
			
		||||
          beforeChamferSnippetEnd,
 | 
			
		||||
        }: {
 | 
			
		||||
          clickCoords: { x: number; y: number }
 | 
			
		||||
          cameraPos: { x: number; y: number; z: number }
 | 
			
		||||
          cameraTarget: { x: number; y: number; z: number }
 | 
			
		||||
          beforeChamferSnippet: string
 | 
			
		||||
          afterChamferSelectSnippet: string
 | 
			
		||||
          afterRectangle1stClickSnippet: string
 | 
			
		||||
          afterRectangle2ndClickSnippet: string
 | 
			
		||||
          beforeChamferSnippetEnd?: string
 | 
			
		||||
        }) => {
 | 
			
		||||
          const [clickChamfer] = scene.makeMouseHelpers(
 | 
			
		||||
            clickCoords.x,
 | 
			
		||||
            clickCoords.y
 | 
			
		||||
          )
 | 
			
		||||
          const [rectangle1stClick] = scene.makeMouseHelpers(573, 149)
 | 
			
		||||
          const [rectangle2ndClick, rectangle2ndMove] = scene.makeMouseHelpers(
 | 
			
		||||
            598,
 | 
			
		||||
            380,
 | 
			
		||||
            { steps: 5 }
 | 
			
		||||
          )
 | 
			
		||||
 | 
			
		||||
        await scene.moveCameraTo(cameraPos, cameraTarget)
 | 
			
		||||
          await scene.moveCameraTo(cameraPos, cameraTarget)
 | 
			
		||||
 | 
			
		||||
        await test.step('check chamfer selection changes cursor position', async () => {
 | 
			
		||||
          await expect(async () => {
 | 
			
		||||
            // sometimes initial click doesn't register
 | 
			
		||||
          await test.step('check chamfer selection changes cursor position', async () => {
 | 
			
		||||
            await expect(async () => {
 | 
			
		||||
              // sometimes initial click doesn't register
 | 
			
		||||
              await clickChamfer()
 | 
			
		||||
              // await editor.expectActiveLinesToBe([beforeChamferSnippet.slice(-5)])
 | 
			
		||||
              await editor.expectActiveLinesToBe([
 | 
			
		||||
                beforeChamferSnippetEnd || beforeChamferSnippet.slice(-5),
 | 
			
		||||
              ])
 | 
			
		||||
            }).toPass({ timeout: 15_000, intervals: [500] })
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
          await test.step('starting a new and selecting a chamfer should animate to the new sketch and possible break up the initial chamfer if it had one than more tag', async () => {
 | 
			
		||||
            await toolbar.startSketchPlaneSelection()
 | 
			
		||||
            await clickChamfer()
 | 
			
		||||
            // await editor.expectActiveLinesToBe([beforeChamferSnippet.slice(-5)])
 | 
			
		||||
            await editor.expectActiveLinesToBe([
 | 
			
		||||
              beforeChamferSnippetEnd || beforeChamferSnippet.slice(-5),
 | 
			
		||||
            ])
 | 
			
		||||
          }).toPass({ timeout: 15_000, intervals: [500] })
 | 
			
		||||
        })
 | 
			
		||||
            // timeout wait for engine animation is unavoidable
 | 
			
		||||
            await page.waitForTimeout(1000)
 | 
			
		||||
            await editor.expectEditor.toContain(afterChamferSelectSnippet)
 | 
			
		||||
          })
 | 
			
		||||
          await test.step('make sure a basic sketch can be added', async () => {
 | 
			
		||||
            await toolbar.rectangleBtn.click()
 | 
			
		||||
            await rectangle1stClick()
 | 
			
		||||
            await editor.expectEditor.toContain(afterRectangle1stClickSnippet)
 | 
			
		||||
            await rectangle2ndMove({
 | 
			
		||||
              pixelDiff: 50,
 | 
			
		||||
            })
 | 
			
		||||
            await rectangle2ndClick()
 | 
			
		||||
            await editor.expectEditor.toContain(afterRectangle2ndClickSnippet, {
 | 
			
		||||
              shouldNormalise: true,
 | 
			
		||||
            })
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
        await test.step('starting a new and selecting a chamfer should animate to the new sketch and possible break up the initial chamfer if it had one than more tag', async () => {
 | 
			
		||||
          await toolbar.startSketchPlaneSelection()
 | 
			
		||||
          await clickChamfer()
 | 
			
		||||
          // timeout wait for engine animation is unavoidable
 | 
			
		||||
          await page.waitForTimeout(1000)
 | 
			
		||||
          await editor.expectEditor.toContain(afterChamferSelectSnippet)
 | 
			
		||||
        })
 | 
			
		||||
        await test.step('make sure a basic sketch can be added', async () => {
 | 
			
		||||
          await toolbar.rectangleBtn.click()
 | 
			
		||||
          await rectangle1stClick()
 | 
			
		||||
          await editor.expectEditor.toContain(afterRectangle1stClickSnippet)
 | 
			
		||||
          await rectangle2ndMove({
 | 
			
		||||
            pixelDiff: 50,
 | 
			
		||||
          await test.step('Clean up so that `_sketchOnAChamfer` util can be called again', async () => {
 | 
			
		||||
            await toolbar.exitSketch()
 | 
			
		||||
          })
 | 
			
		||||
          await rectangle2ndClick()
 | 
			
		||||
          await editor.expectEditor.toContain(afterRectangle2ndClickSnippet, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          await test.step('Check there is no errors after code created in previous steps executes', async () => {
 | 
			
		||||
            await editor.expectState({
 | 
			
		||||
              activeLines: ['@settings(defaultLengthUnit = in)'],
 | 
			
		||||
              highlightedCode: '',
 | 
			
		||||
              diagnostics: [],
 | 
			
		||||
            })
 | 
			
		||||
          })
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        await test.step('Clean up so that `_sketchOnAChamfer` util can be called again', async () => {
 | 
			
		||||
          await toolbar.exitSketch()
 | 
			
		||||
        })
 | 
			
		||||
        await test.step('Check there is no errors after code created in previous steps executes', async () => {
 | 
			
		||||
          await editor.expectState({
 | 
			
		||||
            activeLines: ['@settings(defaultLengthUnit = in)'],
 | 
			
		||||
            highlightedCode: '',
 | 
			
		||||
            diagnostics: [],
 | 
			
		||||
          })
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
        }
 | 
			
		||||
    test('works on all edge selections and can break up multi edges in a chamfer array', async ({
 | 
			
		||||
      context,
 | 
			
		||||
      page,
 | 
			
		||||
@ -261,7 +261,7 @@ test.describe('Point-and-click tests', () => {
 | 
			
		||||
        clickCoords: { x: 677, y: 87 },
 | 
			
		||||
        cameraPos: { x: -6200, y: 1500, z: 6200 },
 | 
			
		||||
        cameraTarget: { x: 8300, y: 1100, z: 4800 },
 | 
			
		||||
        beforeChamferSnippet: `angledLine([0, 268.43], %, $rectangleSegmentA001)chamfer(
 | 
			
		||||
        beforeChamferSnippet: `angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)chamfer(
 | 
			
		||||
         length = 30,
 | 
			
		||||
         tags = [
 | 
			
		||||
           getNextAdjacentEdge(yo),
 | 
			
		||||
@ -302,7 +302,7 @@ test.describe('Point-and-click tests', () => {
 | 
			
		||||
          `@settings(defaultLengthUnit = in)
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag]
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
@ -320,14 +320,14 @@ extrude001 = extrude(sketch001, length = 100)
 | 
			
		||||
  |> chamfer(length = 30, tags = [getNextAdjacentEdge(yo)], tag = $seg06)
 | 
			
		||||
sketch005 = startSketchOn(extrude001, seg06)
 | 
			
		||||
profile004=startProfileAt([-23.43,19.69], sketch005)
 | 
			
		||||
  |> angledLine([0, 9.1], %, $rectangleSegmentA005)
 | 
			
		||||
  |> angledLine([segAng(rectangleSegmentA005) - 90, 84.07], %)
 | 
			
		||||
  |> angledLine([segAng(rectangleSegmentA005), -segLen(rectangleSegmentA005)], %)
 | 
			
		||||
  |> angledLine(angle = 0, length = 9.1, tag = $rectangleSegmentA005)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA005) - 90, length = 84.07)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA005), length = -segLen(rectangleSegmentA005))
 | 
			
		||||
  |> line(endAbsolute=[profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
sketch004 = startSketchOn(extrude001, seg05)
 | 
			
		||||
profile003 = startProfileAt([82.57, 322.96], sketch004)
 | 
			
		||||
  |> angledLine([0, 11.16], %, $rectangleSegmentA004)
 | 
			
		||||
  |> angledLine(angle = 0, length = 11.16, tag = $rectangleSegmentA004)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA004) - 90,
 | 
			
		||||
       103.07
 | 
			
		||||
@ -340,7 +340,7 @@ profile003 = startProfileAt([82.57, 322.96], sketch004)
 | 
			
		||||
  |> close()
 | 
			
		||||
sketch003 = startSketchOn(extrude001, seg04)
 | 
			
		||||
profile002 = startProfileAt([-209.64, 255.28], sketch003)
 | 
			
		||||
  |> angledLine([0, 11.56], %, $rectangleSegmentA003)
 | 
			
		||||
  |> angledLine(angle = 0, length = 11.56, tag = $rectangleSegmentA003)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003) - 90,
 | 
			
		||||
       106.84
 | 
			
		||||
@ -353,7 +353,7 @@ profile002 = startProfileAt([-209.64, 255.28], sketch003)
 | 
			
		||||
  |> close()
 | 
			
		||||
sketch002 = startSketchOn(extrude001, seg03)
 | 
			
		||||
profile001 = startProfileAt([205.96, 254.59], sketch002)
 | 
			
		||||
  |> angledLine([0, 11.39], %, $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine(angle = 0, length = 11.39, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       105.26
 | 
			
		||||
@ -422,7 +422,7 @@ profile001 = startProfileAt([205.96, 254.59], sketch002)
 | 
			
		||||
        `@settings(defaultLengthUnit = in)
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %)
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
@ -450,7 +450,7 @@ chamf = chamfer(
 | 
			
		||||
     )
 | 
			
		||||
sketch002 = startSketchOn(extrude001, seg03)
 | 
			
		||||
profile001 = startProfileAt([205.96, 254.59], sketch002)
 | 
			
		||||
  |> angledLine([0, 11.39], %, $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine(angle = 0, length = 11.39, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       105.26
 | 
			
		||||
@ -3433,8 +3433,8 @@ sweep001 = sweep(sketch001, path = sketch002)
 | 
			
		||||
      const initialCode = `
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
|> startProfileAt([-100.0, 100.0], %)
 | 
			
		||||
|> angledLine([0, 200.0], %, $rectangleSegmentA001)
 | 
			
		||||
|> angledLine([segAng(rectangleSegmentA001) - 90, 200], %, $rectangleSegmentB001)
 | 
			
		||||
|> angledLine(angle = 0, length = 200.0, tag = $rectangleSegmentA001)
 | 
			
		||||
|> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 200, tag = $rectangleSegmentB001)
 | 
			
		||||
|> angledLine([
 | 
			
		||||
segAng(rectangleSegmentA001),
 | 
			
		||||
-segLen(rectangleSegmentA001)
 | 
			
		||||
@ -3444,7 +3444,7 @@ segAng(rectangleSegmentA001),
 | 
			
		||||
extrude001 = extrude(sketch001, length = 200)
 | 
			
		||||
sketch002 = startSketchOn(extrude001, rectangleSegmentA001)
 | 
			
		||||
|> startProfileAt([-66.77, 84.81], %)
 | 
			
		||||
|> angledLine([180, 27.08], %, $rectangleSegmentA002)
 | 
			
		||||
|> angledLine(angle = 180, length = 27.08, tag = $rectangleSegmentA002)
 | 
			
		||||
|> angledLine([
 | 
			
		||||
segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
27.8
 | 
			
		||||
@ -3519,19 +3519,20 @@ segAng(rectangleSegmentA002),
 | 
			
		||||
      toolbar,
 | 
			
		||||
      cmdBar,
 | 
			
		||||
    }) => {
 | 
			
		||||
      const initialCode = `sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([-102.57, 101.72], %)
 | 
			
		||||
  |> angledLine([0, 202.6], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       202.6
 | 
			
		||||
     ], %, $rectangleSegmentB001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001),
 | 
			
		||||
       -segLen(rectangleSegmentA001)
 | 
			
		||||
     ], %, $rectangleSegmentC001)
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
      const initialCode = `
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
|> startProfileAt([-102.57, 101.72], %)
 | 
			
		||||
|> angledLine(angle = 0, length = 202.6, tag = $rectangleSegmentA001)
 | 
			
		||||
|> angledLine([
 | 
			
		||||
segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
202.6
 | 
			
		||||
], %, $rectangleSegmentB001)
 | 
			
		||||
|> angledLine([
 | 
			
		||||
segAng(rectangleSegmentA001),
 | 
			
		||||
-segLen(rectangleSegmentA001)
 | 
			
		||||
], %, $rectangleSegmentC001)
 | 
			
		||||
|> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
|> close()
 | 
			
		||||
extrude001 = extrude(sketch001, length = 50)
 | 
			
		||||
sketch002 = startSketchOn(extrude001, rectangleSegmentA001)
 | 
			
		||||
  |> circle(center = [-11.34, 10.0], radius = 8.69)
 | 
			
		||||
@ -3549,7 +3550,7 @@ sketch002 = startSketchOn(extrude001, rectangleSegmentA001)
 | 
			
		||||
      await page.getByText(codeToSelecton).click()
 | 
			
		||||
      await toolbar.revolveButton.click()
 | 
			
		||||
      await page.getByText('Edge', { exact: true }).click()
 | 
			
		||||
      const lineCodeToSelection = `|> angledLine([0, 202.6], %, $rectangleSegmentA001)`
 | 
			
		||||
      const lineCodeToSelection = `|> angledLine(angle = 0, length = 202.6, tag = $rectangleSegmentA001)`
 | 
			
		||||
      await page.getByText(lineCodeToSelection).click()
 | 
			
		||||
      await cmdBar.progressCmdBar()
 | 
			
		||||
      await cmdBar.progressCmdBar()
 | 
			
		||||
@ -3605,22 +3606,26 @@ sketch002 = startSketchOn(extrude001, rectangleSegmentA001)
 | 
			
		||||
      toolbar,
 | 
			
		||||
      cmdBar,
 | 
			
		||||
    }) => {
 | 
			
		||||
      const initialCode = `sketch002 = startSketchOn(XY)
 | 
			
		||||
  |> startProfileAt([-2.02, 1.79], %)
 | 
			
		||||
  |> xLine(length = 2.6)
 | 
			
		||||
sketch001 = startSketchOn(-XY)
 | 
			
		||||
  |> startProfileAt([-0.48, 1.25], %)
 | 
			
		||||
  |> angledLine([0, 2.38], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([segAng(rectangleSegmentA001) - 90, 2.4], %, $rectangleSegmentB001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001),
 | 
			
		||||
       -segLen(rectangleSegmentA001)
 | 
			
		||||
     ], %, $rectangleSegmentC001)
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude001 = extrude(sketch001, length = 5)
 | 
			
		||||
sketch003 = startSketchOn(extrude001, 'START')
 | 
			
		||||
  |> circle(center = [-0.69, 0.56], radius = 0.28)
 | 
			
		||||
      const initialCode = `
 | 
			
		||||
    sketch002 = startSketchOn(XY)
 | 
			
		||||
      |> startProfileAt([-2.02, 1.79], %)
 | 
			
		||||
      |> xLine(length = 2.6)
 | 
			
		||||
    sketch001 = startSketchOn('-XY')
 | 
			
		||||
      |> startProfileAt([-0.48, 1.25], %)
 | 
			
		||||
      |> angledLine(angle = 0, length = 2.38, tag = $rectangleSegmentA001)
 | 
			
		||||
      |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 2.4, tag = $rectangleSegmentB001)
 | 
			
		||||
      |> angledLine([
 | 
			
		||||
        segAng(rectangleSegmentA001),
 | 
			
		||||
          -segLen(rectangleSegmentA001)
 | 
			
		||||
      ], %, $rectangleSegmentC001)
 | 
			
		||||
      |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
      |> close()
 | 
			
		||||
    extrude001 = extrude(sketch001, length = 5)
 | 
			
		||||
    sketch003 = startSketchOn(extrude001, 'START')
 | 
			
		||||
      |> circle(
 | 
			
		||||
        center = [-0.69, 0.56],
 | 
			
		||||
        radius = 0.28
 | 
			
		||||
      )
 | 
			
		||||
`
 | 
			
		||||
 | 
			
		||||
      await context.addInitScript((initialCode) => {
 | 
			
		||||
 | 
			
		||||
@ -41,7 +41,7 @@ sketch002 = startSketchOn(XZ)
 | 
			
		||||
extrude002 = extrude(sketch002, length = 50)
 | 
			
		||||
sketch003 = startSketchOn(XY)
 | 
			
		||||
  |> startProfileAt([52.92, 157.81], %)
 | 
			
		||||
  |> angledLine([0, 176.4], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 176.4, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       53.4
 | 
			
		||||
 | 
			
		||||
@ -22,7 +22,7 @@ sketch002 = startSketchOn(XZ)
 | 
			
		||||
extrude002 = extrude(sketch002, length = 50)
 | 
			
		||||
sketch003 = startSketchOn(XY)
 | 
			
		||||
  |> startProfileAt([52.92, 157.81], %)
 | 
			
		||||
  |> angledLine([0, 176.4], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 176.4, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       53.4
 | 
			
		||||
 | 
			
		||||
@ -68,7 +68,7 @@ test.describe('Regression tests', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        'persistCode',
 | 
			
		||||
        `sketch001 = startSketchOn(XY)
 | 
			
		||||
  |> startProfileAt([82.33, 238.21], %)
 | 
			
		||||
  |> angledLine([0, 288.63], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 288.63, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       197.97
 | 
			
		||||
@ -257,7 +257,7 @@ extrude001 = extrude(sketch001, length = 50)
 | 
			
		||||
          'persistCode',
 | 
			
		||||
          `exampleSketch = startSketchOn("XZ")
 | 
			
		||||
      |> startProfileAt([0, 0], %)
 | 
			
		||||
      |> angledLine({ angle: 50, length: 45 }, %)
 | 
			
		||||
      |> angledLine(angle = 50, length = 45 )
 | 
			
		||||
      |> yLine(endAbsolute = 0)
 | 
			
		||||
      |> close()
 | 
			
		||||
      |>
 | 
			
		||||
@ -313,7 +313,7 @@ extrude001 = extrude(sketch001, length = 50)
 | 
			
		||||
      await expect(page.locator('.cm-content'))
 | 
			
		||||
        .toContainText(`exampleSketch = startSketchOn("XZ")
 | 
			
		||||
      |> startProfileAt([0, 0], %)
 | 
			
		||||
      |> angledLine({ angle: 50, length: 45 }, %)
 | 
			
		||||
      |> angledLine(angle = 50, length = 45 )
 | 
			
		||||
      |> yLine(endAbsolute = 0)
 | 
			
		||||
      |> close()
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -1960,8 +1960,8 @@ profile003 = startProfileAt([206.63, -56.73], sketch001)
 | 
			
		||||
      )
 | 
			
		||||
      await crnRect1point2()
 | 
			
		||||
      await editor.expectEditor.toContain(
 | 
			
		||||
        `|> angledLine([0, 2.37], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([segAng(rectangleSegmentA001) - 90, 7.8], %)
 | 
			
		||||
        `|> angledLine(angle = 0, length = 2.37, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) - 90, length = 7.8)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001),
 | 
			
		||||
       -segLen(rectangleSegmentA001)
 | 
			
		||||
@ -1978,7 +1978,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001)
 | 
			
		||||
      await crnRect2point2()
 | 
			
		||||
      await page.waitForTimeout(300)
 | 
			
		||||
      await editor.expectEditor.toContain(
 | 
			
		||||
        `|> angledLine([0, 5.49], %, $rectangleSegmentA002)
 | 
			
		||||
        `|> angledLine(angle = 0, length = 5.49, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       4.14
 | 
			
		||||
@ -2003,7 +2003,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001)
 | 
			
		||||
      await cntrRect1point2()
 | 
			
		||||
      await page.waitForTimeout(300)
 | 
			
		||||
      await editor.expectEditor.toContain(
 | 
			
		||||
        `|> angledLine([0, 7.06], %, $rectangleSegmentA003)
 | 
			
		||||
        `|> angledLine(angle = 0, length = 7.06, tag = $rectangleSegmentA003)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003) + 90,
 | 
			
		||||
       4.34
 | 
			
		||||
@ -2025,7 +2025,7 @@ profile003 = startProfileAt([206.63, -56.73], sketch001)
 | 
			
		||||
      await cntrRect2point2()
 | 
			
		||||
      await page.waitForTimeout(300)
 | 
			
		||||
      await editor.expectEditor.toContain(
 | 
			
		||||
        `|> angledLine([0, 3.12], %, $rectangleSegmentA004)
 | 
			
		||||
        `|> angledLine(angle = 0, length = 3.12, tag = $rectangleSegmentA004)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA004) + 90,
 | 
			
		||||
       6.24
 | 
			
		||||
@ -2187,7 +2187,7 @@ profile001 = startProfileAt([6.24, 4.54], sketch001)
 | 
			
		||||
  |> line(end = [8.61, 0.74])
 | 
			
		||||
  |> line(end = [10.99, -5.22])
 | 
			
		||||
profile002 = startProfileAt([11.19, 5.02], sketch001)
 | 
			
		||||
  |> angledLine([0, 10.78], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 10.78, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       4.14
 | 
			
		||||
@ -2264,7 +2264,7 @@ profile004 = circleThreePoint(sketch001, p1 = [13.44, -6.8], p2 = [13.39, -2.07]
 | 
			
		||||
        await rectDragTo()
 | 
			
		||||
        await page.mouse.up()
 | 
			
		||||
        await editor.expectEditor.toContain(
 | 
			
		||||
          `angledLine([-7, 10.27], %, $rectangleSegmentA001)`
 | 
			
		||||
          `angledLine(angle = -7, length = 10.27, tag = $rectangleSegmentA001)`
 | 
			
		||||
        )
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
@ -2304,7 +2304,7 @@ profile004 = circleThreePoint(sketch001, p1 = [13.44, -6.8], p2 = [13.39, -2.07]
 | 
			
		||||
        await page.waitForTimeout(100)
 | 
			
		||||
        await rectEnd()
 | 
			
		||||
        await editor.expectEditor.toContain(
 | 
			
		||||
          `|> angledLine([180, 1.97], %, $rectangleSegmentA002)
 | 
			
		||||
          `|> angledLine(angle = 180, length = 1.97, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) + 90,
 | 
			
		||||
       3.89
 | 
			
		||||
@ -2333,7 +2333,7 @@ profile001 = startProfileAt([6.24, 4.54], sketch001)
 | 
			
		||||
  |> line(end = [8.61, 0.74])
 | 
			
		||||
  |> line(end = [10.99, -5.22])
 | 
			
		||||
profile002 = startProfileAt([11.19, 5.02], sketch001)
 | 
			
		||||
  |> angledLine([0, 10.78], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 10.78, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       4.14
 | 
			
		||||
@ -2375,7 +2375,7 @@ profile003 = circle(sketch001, center = [6.92, -4.2], radius = 3.16)
 | 
			
		||||
        await page.waitForTimeout(600)
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      await test.step('select and delete code for a profile', async () => {})
 | 
			
		||||
      await test.step('select and delete code for a profile', async () => { })
 | 
			
		||||
      await page.getByText('close()').click()
 | 
			
		||||
      await page.keyboard.down('Shift')
 | 
			
		||||
      for (let i = 0; i < 11; i++) {
 | 
			
		||||
@ -2442,7 +2442,7 @@ profile001 = startProfileAt([-63.43, 193.08], sketch001)
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
profile003 = startProfileAt([16.79, 38.24], sketch001)
 | 
			
		||||
  |> angledLine([0, 182.82], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 182.82, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       105.71
 | 
			
		||||
@ -2666,7 +2666,7 @@ profile002 = startProfileAt([0.75, 13.46], sketch002)
 | 
			
		||||
  |> line(end = [4.52, 3.79])
 | 
			
		||||
  |> line(end = [5.98, -2.81])
 | 
			
		||||
profile003 = startProfileAt([3.19, 13.3], sketch002)
 | 
			
		||||
  |> angledLine([0, 6.64], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 6.64, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       2.81
 | 
			
		||||
@ -2714,7 +2714,7 @@ profile010 = circle(
 | 
			
		||||
  radius = 2.67
 | 
			
		||||
)
 | 
			
		||||
profile011 = startProfileAt([5.07, -6.39], sketch003)
 | 
			
		||||
  |> angledLine([0, 4.54], %, $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine(angle = 0, length = 4.54, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       4.17
 | 
			
		||||
@ -2871,7 +2871,7 @@ loft([profile001, profile002])
 | 
			
		||||
      )
 | 
			
		||||
      await rect1Crn2()
 | 
			
		||||
      await editor.expectEditor.toContain(
 | 
			
		||||
        `angledLine([0, 113.01], %, $rectangleSegmentA001)`
 | 
			
		||||
        `angledLine(angle = 0, length = 113.01, tag = $rectangleSegmentA001)`
 | 
			
		||||
      )
 | 
			
		||||
    }
 | 
			
		||||
  )
 | 
			
		||||
@ -2942,7 +2942,7 @@ loft([profile001, profile002])
 | 
			
		||||
    )
 | 
			
		||||
    await rect1Crn2()
 | 
			
		||||
    await editor.expectEditor.toContain(
 | 
			
		||||
      `angledLine([0, 106.42], %, $rectangleSegmentA001)`
 | 
			
		||||
      `angledLine(angle = 0, length = 106.42], tag = $rectangleSegmentA001)`
 | 
			
		||||
    )
 | 
			
		||||
    await page.waitForTimeout(100)
 | 
			
		||||
  })
 | 
			
		||||
 | 
			
		||||
@ -56,7 +56,7 @@ test(
 | 
			
		||||
    // And you will need to have the KittyCAD CLI installed
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    await context.addInitScript(async () => {
 | 
			
		||||
      ;(window as any).playwrightSkipFilePicker = true
 | 
			
		||||
      ; (window as any).playwrightSkipFilePicker = true
 | 
			
		||||
      localStorage.setItem(
 | 
			
		||||
        'persistCode',
 | 
			
		||||
        `topAng = 25
 | 
			
		||||
@ -81,7 +81,7 @@ part001 = startSketchOn(-XZ)
 | 
			
		||||
        offset = -armThick,
 | 
			
		||||
        intersectTag = seg04
 | 
			
		||||
      }, %)
 | 
			
		||||
  |> angledLineToY([segAng(seg04, %) + 180, turns::ZERO], %)
 | 
			
		||||
  |> angledLine(angle = segAng(seg04, %) + 180, endAbsoluteY = turns::ZERO)
 | 
			
		||||
  |> angledLineToY({
 | 
			
		||||
        angle = -bottomAng,
 | 
			
		||||
        to = -totalHeightHalf - armThick,
 | 
			
		||||
@ -93,7 +93,7 @@ part001 = startSketchOn(-XZ)
 | 
			
		||||
        offset = -armThick,
 | 
			
		||||
        intersectTag = seg02
 | 
			
		||||
      }, %)
 | 
			
		||||
  |> angledLineToY([segAng(seg02, %) + 180, -baseHeight], %)
 | 
			
		||||
  |> angledLine(angle = segAng(seg02, %) + 180, endAbsoluteY = -baseHeight)
 | 
			
		||||
  |> xLine(endAbsolute = turns::ZERO)
 | 
			
		||||
  |> close()
 | 
			
		||||
  |> extrude(length = 4)`
 | 
			
		||||
 | 
			
		||||
@ -1,5 +1,11 @@
 | 
			
		||||
{
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
  "original_source_code": "sketch001 = startSketchOn('XZ')\nprofile001 = startProfileAt([57.81, 250.51], sketch001)\n  |> line(end = [121.13, 56.63], tag = $seg02)\n  |> line(end = [83.37, -34.61], tag = $seg01)\n  |> line(end = [19.66, -116.4])\n  |> line(end = [-221.8, -41.69])\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude001 = extrude(profile001, length = 200)\nsketch002 = startSketchOn('XZ')\n  |> startProfileAt([-73.64, -42.89], %)\n  |> xLine(length = 173.71)\n  |> line(end = [-22.12, -94.4])\n  |> xLine(length = -156.98)\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude002 = extrude(sketch002, length = 50)\nsketch003 = startSketchOn(XY)\n  |> startProfileAt([52.92, 157.81], %)\n  |> angledLine([0, 176.4], %, $rectangleSegmentA001)\n  |> angledLine([\n       segAng(rectangleSegmentA001) - 90,\n       53.4\n     ], %, $rectangleSegmentB001)\n  |> angledLine([\n       segAng(rectangleSegmentA001),\n       -segLen(rectangleSegmentA001)\n     ], %, $rectangleSegmentC001)\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude003 = extrude(sketch003, length = 20)\n",
 | 
			
		||||
||||||| parent of bcbec9f87 (Update KCL in JS project)
 | 
			
		||||
  "original_source_code": "sketch001 = startSketchOn('XZ')\nprofile001 = startProfileAt([57.81, 250.51], sketch001)\n  |> line(end = [121.13, 56.63], tag = $seg02)\n  |> line(end = [83.37, -34.61], tag = $seg01)\n  |> line(end = [19.66, -116.4])\n  |> line(end = [-221.8, -41.69])\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude001 = extrude(profile001, length = 200)\nsketch002 = startSketchOn('XZ')\n  |> startProfileAt([-73.64, -42.89], %)\n  |> xLine(length = 173.71)\n  |> line(end = [-22.12, -94.4])\n  |> xLine(length = -156.98)\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude002 = extrude(sketch002, length = 50)\nsketch003 = startSketchOn('XY')\n  |> startProfileAt([52.92, 157.81], %)\n  |> angledLine([0, 176.4], %, $rectangleSegmentA001)\n  |> angledLine([\n       segAng(rectangleSegmentA001) - 90,\n       53.4\n     ], %, $rectangleSegmentB001)\n  |> angledLine([\n       segAng(rectangleSegmentA001),\n       -segLen(rectangleSegmentA001)\n     ], %, $rectangleSegmentC001)\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude003 = extrude(sketch003, length = 20)\n",
 | 
			
		||||
=======
 | 
			
		||||
  "original_source_code": "sketch001 = startSketchOn('XZ')\nprofile001 = startProfileAt([57.81, 250.51], sketch001)\n  |> line(end = [121.13, 56.63], tag = $seg02)\n  |> line(end = [83.37, -34.61], tag = $seg01)\n  |> line(end = [19.66, -116.4])\n  |> line(end = [-221.8, -41.69])\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude001 = extrude(profile001, length = 200)\nsketch002 = startSketchOn('XZ')\n  |> startProfileAt([-73.64, -42.89], %)\n  |> xLine(length = 173.71)\n  |> line(end = [-22.12, -94.4])\n  |> xLine(length = -156.98)\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude002 = extrude(sketch002, length = 50)\nsketch003 = startSketchOn('XY')\n  |> startProfileAt([52.92, 157.81], %)\n  |> angledLine(angle = 0, 176.4], %, $rectangleSegmentA001)\n  |> angledLine([\n       segAng(rectangleSegmentA001) - 90,\n       53.4\n     ], %, length = $rectangleSegmentB001)\n  |> angledLine([\n       segAng(rectangleSegmentA001),\n       -segLen(rectangleSegmentA001)\n     , tag = $rectangleSegmentC001)\n  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])\n  |> close()\nextrude003 = extrude(sketch003, length = 20)\n",
 | 
			
		||||
>>>>>>> bcbec9f87 (Update KCL in JS project)
 | 
			
		||||
  "prompt": "make this neon green please, use #39FF14",
 | 
			
		||||
  "source_ranges": [
 | 
			
		||||
    {
 | 
			
		||||
 | 
			
		||||
@ -83,15 +83,15 @@ export const TEST_SETTINGS_CORRUPTED = {
 | 
			
		||||
export const TEST_CODE_GIZMO = `part001 = startSketchOn(XZ)
 | 
			
		||||
|> startProfileAt([20, 0], %)
 | 
			
		||||
|> line(end = [7.13, 4 + 0])
 | 
			
		||||
|> angledLine({ angle: 3 + 0, length: 3.14 + 0 }, %)
 | 
			
		||||
|> angledLine(angle = 3 + 0, length = 3.14 + 0 )
 | 
			
		||||
|> line(endAbsolute = [20.14 + 0, -0.14 + 0])
 | 
			
		||||
|> xLine(endAbsolute = 29 + 0)
 | 
			
		||||
|> yLine(length = -3.14 + 0, tag = $a)
 | 
			
		||||
|> xLine(length = 1.63)
 | 
			
		||||
|> angledLineOfXLength({ angle: 3 + 0, length: 3.14 }, %)
 | 
			
		||||
|> angledLineOfYLength({ angle: 30, length: 3 + 0 }, %)
 | 
			
		||||
|> angledLineToX({ angle: 22.14 + 0, to: 12 }, %)
 | 
			
		||||
|> angledLineToY({ angle: 30, to: 11.14 }, %)
 | 
			
		||||
|> angledLine(angle = 3 + 0, lengthX = 3.14 )
 | 
			
		||||
|> angledLine(angle = 30, lengthY = 3 + 0 )
 | 
			
		||||
|> angledLine(angle = 22.14 + 0, endAbsoluteX = 12)
 | 
			
		||||
|> angledLine(angle = 30, endAbsoluteY = 11.14)
 | 
			
		||||
|> angledLineThatIntersects({
 | 
			
		||||
  angle: 3.14,
 | 
			
		||||
  intersectTag: a,
 | 
			
		||||
 | 
			
		||||
@ -58,7 +58,13 @@ test.describe('Testing constraints', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
      .click()
 | 
			
		||||
 | 
			
		||||
    await expect(page.locator('.cm-content')).toHaveText(
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
      `length001 = 20sketch001 = startSketchOn(XY)  |> startProfileAt([-10, -10], %)  |> line(end = [20, 0])  |> angledLine([90, length001], %)  |> xLine(length = -20)`
 | 
			
		||||
||||||| parent of bcbec9f87 (Update KCL in JS project)
 | 
			
		||||
      `length001 = 20sketch001 = startSketchOn('XY')  |> startProfileAt([-10, -10], %)  |> line(end = [20, 0])  |> angledLine([90, length001], %)  |> xLine(length = -20)`
 | 
			
		||||
=======
 | 
			
		||||
      `length001 = 20sketch001 = startSketchOn('XY')  |> startProfileAt([-10, -10], %)  |> line(end = [20, 0])  |> angledLine(angle = 90, length = length001)  |> xLine(length = -20)`
 | 
			
		||||
>>>>>>> bcbec9f87 (Update KCL in JS project)
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
    // Make sure we didn't pop out of sketch mode.
 | 
			
		||||
@ -87,7 +93,7 @@ test.describe('Testing constraints', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
    |> startProfileAt([-7.54, -26.74], %)
 | 
			
		||||
    |> line(end = [74.36, 130.4], tag = $seg01)
 | 
			
		||||
    |> line(end = [78.92, -120.11])
 | 
			
		||||
    |> angledLine([segAng(seg01), yo], %)
 | 
			
		||||
    |> angledLine(angle = segAng(seg01), length = yo)
 | 
			
		||||
    |> line(end = [41.19, 58.97 + 5])
 | 
			
		||||
  part002 = startSketchOn(XZ)
 | 
			
		||||
    |> startProfileAt([299.05, 120], %)
 | 
			
		||||
@ -152,7 +158,7 @@ test.describe('Testing constraints', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        |> startProfileAt([-7.54, -26.74], %)
 | 
			
		||||
        |> line(end = [74.36, 130.4], tag = $seg01)
 | 
			
		||||
        |> line(end = [78.92, -120.11])
 | 
			
		||||
        |> angledLine([segAng(seg01), 78.33], %)
 | 
			
		||||
        |> angledLine(angle = segAng(seg01), length = 78.33)
 | 
			
		||||
        |> line(end = [51.19, 48.97])
 | 
			
		||||
      part002 = startSketchOn(XZ)
 | 
			
		||||
        |> startProfileAt([299.05, 231.45], %)
 | 
			
		||||
@ -542,7 +548,7 @@ test.describe('Testing constraints', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        // checking activeLines assures the cursors are where they should be
 | 
			
		||||
        const codeAfter = [
 | 
			
		||||
          '|> line(end = [74.36, 130.4], tag = $seg01)',
 | 
			
		||||
          `|> angledLine([${value}, 78.33], %)`,
 | 
			
		||||
          `|> angledLine(angle = ${value}, length = 78.33)`,
 | 
			
		||||
        ]
 | 
			
		||||
        if (axisSelect) codeAfter.shift()
 | 
			
		||||
 | 
			
		||||
@ -831,11 +837,11 @@ part002 = startSketchOn(XZ)
 | 
			
		||||
  test.describe('Two segment - no modal constraints', () => {
 | 
			
		||||
    const cases = [
 | 
			
		||||
      {
 | 
			
		||||
        codeAfter: `|> angledLine([83, segLen(seg01)], %)`,
 | 
			
		||||
        codeAfter: `|> angledLine(angle = 83, length = segLen(seg01))`,
 | 
			
		||||
        constraintName: 'Equal Length',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        codeAfter: `|> angledLine([segAng(seg01), 78.33], %)`,
 | 
			
		||||
        codeAfter: `|> angledLine(angle = segAng(seg01), length = 78.33)`,
 | 
			
		||||
        constraintName: 'Parallel',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
@ -1150,7 +1156,7 @@ test.describe('Electron constraint tests', () => {
 | 
			
		||||
        await clickOnFirstSegmentLabel()
 | 
			
		||||
        await cmdBar.progressCmdBar()
 | 
			
		||||
        await editor.expectEditor.toContain('length001 = 15.3')
 | 
			
		||||
        await editor.expectEditor.toContain('|> angledLine([9, length001], %)')
 | 
			
		||||
        await editor.expectEditor.toContain('|> angledLine(angle = 9, length = length001)')
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      await test.step('Double click again and expect failure', async () => {
 | 
			
		||||
 | 
			
		||||
@ -259,7 +259,7 @@ test.describe(`Testing gizmo, fixture-based`, () => {
 | 
			
		||||
        `@settings(defaultLengthUnit = in)
 | 
			
		||||
        const sketch002 = startSketchOn(XZ)
 | 
			
		||||
          |> startProfileAt([-108.83, -57.48], %)
 | 
			
		||||
          |> angledLine([0, 105.13], %, $rectangleSegmentA001)
 | 
			
		||||
          |> angledLine(angle = 0, length = 105.13, tag = $rectangleSegmentA001)
 | 
			
		||||
          |> angledLine([
 | 
			
		||||
               segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
               77.9
 | 
			
		||||
 | 
			
		||||
@ -26,90 +26,90 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
     */
 | 
			
		||||
    const _clickConstrained =
 | 
			
		||||
      (page: Page, editor: EditorFixture) =>
 | 
			
		||||
      async ({
 | 
			
		||||
        hoverPos,
 | 
			
		||||
        constraintType,
 | 
			
		||||
        expectBeforeUnconstrained,
 | 
			
		||||
        expectAfterUnconstrained,
 | 
			
		||||
        expectFinal,
 | 
			
		||||
        ang = 45,
 | 
			
		||||
        steps = 10,
 | 
			
		||||
        locator,
 | 
			
		||||
      }: {
 | 
			
		||||
        hoverPos: { x: number; y: number }
 | 
			
		||||
        constraintType:
 | 
			
		||||
        async ({
 | 
			
		||||
          hoverPos,
 | 
			
		||||
          constraintType,
 | 
			
		||||
          expectBeforeUnconstrained,
 | 
			
		||||
          expectAfterUnconstrained,
 | 
			
		||||
          expectFinal,
 | 
			
		||||
          ang = 45,
 | 
			
		||||
          steps = 10,
 | 
			
		||||
          locator,
 | 
			
		||||
        }: {
 | 
			
		||||
          hoverPos: { x: number; y: number }
 | 
			
		||||
          constraintType:
 | 
			
		||||
          | 'horizontal'
 | 
			
		||||
          | 'vertical'
 | 
			
		||||
          | 'tangentialWithPrevious'
 | 
			
		||||
          | LineInputsType
 | 
			
		||||
        expectBeforeUnconstrained: string
 | 
			
		||||
        expectAfterUnconstrained: string
 | 
			
		||||
        expectFinal: string
 | 
			
		||||
        ang?: number
 | 
			
		||||
        steps?: number
 | 
			
		||||
        locator?: string
 | 
			
		||||
      }) => {
 | 
			
		||||
        await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
          expectBeforeUnconstrained: string
 | 
			
		||||
          expectAfterUnconstrained: string
 | 
			
		||||
          expectFinal: string
 | 
			
		||||
          ang?: number
 | 
			
		||||
          steps?: number
 | 
			
		||||
          locator?: string
 | 
			
		||||
        }) => {
 | 
			
		||||
          await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
 | 
			
		||||
        await page.mouse.move(0, 0)
 | 
			
		||||
        await page.waitForTimeout(1000)
 | 
			
		||||
        let x = 0,
 | 
			
		||||
          y = 0
 | 
			
		||||
        x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
        y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
        await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
          await page.mouse.move(0, 0)
 | 
			
		||||
          await page.waitForTimeout(1000)
 | 
			
		||||
          let x = 0,
 | 
			
		||||
            y = 0
 | 
			
		||||
          x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
          y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
          await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
 | 
			
		||||
        await editor.expectEditor.toContain(expectBeforeUnconstrained, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
        const constrainedLocator = page.locator(
 | 
			
		||||
          `[data-constraint-type="${constraintType}"][data-is-constrained="true"]`
 | 
			
		||||
        )
 | 
			
		||||
        await expect(constrainedLocator).toBeVisible()
 | 
			
		||||
        await constrainedLocator.hover()
 | 
			
		||||
        await expect(
 | 
			
		||||
          await page.getByTestId('constraint-symbol-popover').count()
 | 
			
		||||
        ).toBeGreaterThan(0)
 | 
			
		||||
        await constrainedLocator.click()
 | 
			
		||||
        await editor.expectEditor.toContain(expectAfterUnconstrained, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        await page.mouse.move(0, 0)
 | 
			
		||||
        await page.waitForTimeout(1000)
 | 
			
		||||
        x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
        y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
        await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
 | 
			
		||||
        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()
 | 
			
		||||
        ).toBeGreaterThan(0)
 | 
			
		||||
        await unconstrainedLocator.click()
 | 
			
		||||
        await expect(
 | 
			
		||||
          page.getByTestId('cmd-bar-arg-value').getByRole('textbox')
 | 
			
		||||
        ).toBeFocused()
 | 
			
		||||
        await page
 | 
			
		||||
          .getByRole('button', {
 | 
			
		||||
            name: 'arrow right Continue',
 | 
			
		||||
          await editor.expectEditor.toContain(expectBeforeUnconstrained, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
          .click()
 | 
			
		||||
        await expect(page.locator('.cm-content')).toContainText(expectFinal)
 | 
			
		||||
        await editor.expectEditor.toContain(expectFinal, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
        await editor.expectEditor.toContain(expectFinal, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
          const constrainedLocator = page.locator(
 | 
			
		||||
            `[data-constraint-type="${constraintType}"][data-is-constrained="true"]`
 | 
			
		||||
          )
 | 
			
		||||
          await expect(constrainedLocator).toBeVisible()
 | 
			
		||||
          await constrainedLocator.hover()
 | 
			
		||||
          await expect(
 | 
			
		||||
            await page.getByTestId('constraint-symbol-popover').count()
 | 
			
		||||
          ).toBeGreaterThan(0)
 | 
			
		||||
          await constrainedLocator.click()
 | 
			
		||||
          await editor.expectEditor.toContain(expectAfterUnconstrained, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
          await page.mouse.move(0, 0)
 | 
			
		||||
          await page.waitForTimeout(1000)
 | 
			
		||||
          x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
          y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
          await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
 | 
			
		||||
          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()
 | 
			
		||||
          ).toBeGreaterThan(0)
 | 
			
		||||
          await unconstrainedLocator.click()
 | 
			
		||||
          await expect(
 | 
			
		||||
            page.getByTestId('cmd-bar-arg-value').getByRole('textbox')
 | 
			
		||||
          ).toBeFocused()
 | 
			
		||||
          await page
 | 
			
		||||
            .getByRole('button', {
 | 
			
		||||
              name: 'arrow right Continue',
 | 
			
		||||
            })
 | 
			
		||||
            .click()
 | 
			
		||||
          await expect(page.locator('.cm-content')).toContainText(expectFinal)
 | 
			
		||||
          await editor.expectEditor.toContain(expectFinal, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
          await editor.expectEditor.toContain(expectFinal, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Clicks on an unconstrained element
 | 
			
		||||
@ -122,85 +122,85 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
     */
 | 
			
		||||
    const _clickUnconstrained =
 | 
			
		||||
      (page: Page, editor: EditorFixture) =>
 | 
			
		||||
      async ({
 | 
			
		||||
        hoverPos,
 | 
			
		||||
        constraintType,
 | 
			
		||||
        expectBeforeUnconstrained,
 | 
			
		||||
        expectAfterUnconstrained,
 | 
			
		||||
        expectFinal,
 | 
			
		||||
        ang = 45,
 | 
			
		||||
        steps = 5,
 | 
			
		||||
        locator,
 | 
			
		||||
      }: {
 | 
			
		||||
        hoverPos: { x: number; y: number }
 | 
			
		||||
        constraintType:
 | 
			
		||||
        async ({
 | 
			
		||||
          hoverPos,
 | 
			
		||||
          constraintType,
 | 
			
		||||
          expectBeforeUnconstrained,
 | 
			
		||||
          expectAfterUnconstrained,
 | 
			
		||||
          expectFinal,
 | 
			
		||||
          ang = 45,
 | 
			
		||||
          steps = 5,
 | 
			
		||||
          locator,
 | 
			
		||||
        }: {
 | 
			
		||||
          hoverPos: { x: number; y: number }
 | 
			
		||||
          constraintType:
 | 
			
		||||
          | 'horizontal'
 | 
			
		||||
          | 'vertical'
 | 
			
		||||
          | 'tangentialWithPrevious'
 | 
			
		||||
          | LineInputsType
 | 
			
		||||
        expectBeforeUnconstrained: string
 | 
			
		||||
        expectAfterUnconstrained: string
 | 
			
		||||
        expectFinal: string
 | 
			
		||||
        ang?: number
 | 
			
		||||
        steps?: number
 | 
			
		||||
        locator?: string
 | 
			
		||||
      }) => {
 | 
			
		||||
        await page.mouse.move(0, 0)
 | 
			
		||||
        await page.waitForTimeout(1000)
 | 
			
		||||
        let x = 0,
 | 
			
		||||
          y = 0
 | 
			
		||||
        x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
        y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
        await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
          expectBeforeUnconstrained: string
 | 
			
		||||
          expectAfterUnconstrained: string
 | 
			
		||||
          expectFinal: string
 | 
			
		||||
          ang?: number
 | 
			
		||||
          steps?: number
 | 
			
		||||
          locator?: string
 | 
			
		||||
        }) => {
 | 
			
		||||
          await page.mouse.move(0, 0)
 | 
			
		||||
          await page.waitForTimeout(1000)
 | 
			
		||||
          let x = 0,
 | 
			
		||||
            y = 0
 | 
			
		||||
          x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
          y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
          await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
 | 
			
		||||
        await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
        await editor.expectEditor.toContain(expectBeforeUnconstrained, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
        const unconstrainedLocator = page.locator(
 | 
			
		||||
          `[data-constraint-type="${constraintType}"][data-is-constrained="false"]`
 | 
			
		||||
        )
 | 
			
		||||
        await unconstrainedLocator.hover()
 | 
			
		||||
        await expect(
 | 
			
		||||
          await page.getByTestId('constraint-symbol-popover').count()
 | 
			
		||||
        ).toBeGreaterThan(0)
 | 
			
		||||
        await unconstrainedLocator.click()
 | 
			
		||||
        await expect(
 | 
			
		||||
          page.getByTestId('cmd-bar-arg-value').getByRole('textbox')
 | 
			
		||||
        ).toBeFocused()
 | 
			
		||||
        await page
 | 
			
		||||
          .getByRole('button', {
 | 
			
		||||
            name: 'arrow right Continue',
 | 
			
		||||
          await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
          await editor.expectEditor.toContain(expectBeforeUnconstrained, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
          .click()
 | 
			
		||||
        await editor.expectEditor.toContain(expectAfterUnconstrained, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
        await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
          const unconstrainedLocator = page.locator(
 | 
			
		||||
            `[data-constraint-type="${constraintType}"][data-is-constrained="false"]`
 | 
			
		||||
          )
 | 
			
		||||
          await unconstrainedLocator.hover()
 | 
			
		||||
          await expect(
 | 
			
		||||
            await page.getByTestId('constraint-symbol-popover').count()
 | 
			
		||||
          ).toBeGreaterThan(0)
 | 
			
		||||
          await unconstrainedLocator.click()
 | 
			
		||||
          await expect(
 | 
			
		||||
            page.getByTestId('cmd-bar-arg-value').getByRole('textbox')
 | 
			
		||||
          ).toBeFocused()
 | 
			
		||||
          await page
 | 
			
		||||
            .getByRole('button', {
 | 
			
		||||
              name: 'arrow right Continue',
 | 
			
		||||
            })
 | 
			
		||||
            .click()
 | 
			
		||||
          await editor.expectEditor.toContain(expectAfterUnconstrained, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
          await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
 | 
			
		||||
        await page.mouse.move(0, 0)
 | 
			
		||||
        await page.waitForTimeout(1000)
 | 
			
		||||
        x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
        y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
        await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
          await page.mouse.move(0, 0)
 | 
			
		||||
          await page.waitForTimeout(1000)
 | 
			
		||||
          x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
          y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
          await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
 | 
			
		||||
        const constrainedLocator = page.locator(
 | 
			
		||||
          `[data-constraint-type="${constraintType}"][data-is-constrained="true"]`
 | 
			
		||||
        )
 | 
			
		||||
        await expect(constrainedLocator).toBeVisible()
 | 
			
		||||
        await constrainedLocator.hover()
 | 
			
		||||
        await expect(
 | 
			
		||||
          await page.getByTestId('constraint-symbol-popover').count()
 | 
			
		||||
        ).toBeGreaterThan(0)
 | 
			
		||||
        await constrainedLocator.click()
 | 
			
		||||
        await editor.expectEditor.toContain(expectFinal, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
          const constrainedLocator = page.locator(
 | 
			
		||||
            `[data-constraint-type="${constraintType}"][data-is-constrained="true"]`
 | 
			
		||||
          )
 | 
			
		||||
          await expect(constrainedLocator).toBeVisible()
 | 
			
		||||
          await constrainedLocator.hover()
 | 
			
		||||
          await expect(
 | 
			
		||||
            await page.getByTestId('constraint-symbol-popover').count()
 | 
			
		||||
          ).toBeGreaterThan(0)
 | 
			
		||||
          await constrainedLocator.click()
 | 
			
		||||
          await editor.expectEditor.toContain(expectFinal, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
    test.setTimeout(120000)
 | 
			
		||||
    test('for segments [line, angledLine, xLineTo]', async ({
 | 
			
		||||
      page,
 | 
			
		||||
@ -214,16 +214,16 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
      part001 = startSketchOn(XZ)
 | 
			
		||||
        |> startProfileAt([5 + 0, 20 + 0], %)
 | 
			
		||||
        |> line(end = [0.5, -14 + 0])
 | 
			
		||||
        |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, length = 32 + 0 )
 | 
			
		||||
        |> line(endAbsolute = [5 + 33, 20 + 11.5 + 0])
 | 
			
		||||
        |> xLine(endAbsolute = 5 + 9 - 5)
 | 
			
		||||
        |> yLine(endAbsolute = 20 + -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 = 5 + 26 }, %)
 | 
			
		||||
        |> angledLineToY({ angle = 89, to = 20 + 9.14 + 0 }, %)
 | 
			
		||||
        |> angledLine(angle = 181 + 0, xLength = 23.14)
 | 
			
		||||
        |> angledLine(angle = -91, yLength = 19 + 0)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, endAbsoluteX =  5 + 26)
 | 
			
		||||
        |> angledLine(angle = 89, endAbsoluteY =  20 + 9.14 + 0)
 | 
			
		||||
        |> angledLineThatIntersects({
 | 
			
		||||
        angle = 4.14,
 | 
			
		||||
        intersectTag = a,
 | 
			
		||||
@ -307,10 +307,10 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        hoverPos: { x: angledLine.x, y: angledLine.y },
 | 
			
		||||
        constraintType: 'angle',
 | 
			
		||||
        expectBeforeUnconstrained:
 | 
			
		||||
          'angledLine({ angle = 3 + 0, length = 32 + 0 }, %)',
 | 
			
		||||
          'angledLine(angle = 3 + 0, length = 32 + 0)',
 | 
			
		||||
        expectAfterUnconstrained:
 | 
			
		||||
          'angledLine({ angle = 3, length = 32 + 0 }, %)',
 | 
			
		||||
        expectFinal: 'angledLine({ angle = angle001, length = 32 + 0 }, %)',
 | 
			
		||||
          'angledLine(angle = 3, length = 32 + 0)',
 | 
			
		||||
        expectFinal: 'angledLine(angle = angle001, length = 32 + 0)',
 | 
			
		||||
        ang: ang + 180,
 | 
			
		||||
        locator: '[data-overlay-toolbar-index="1"]',
 | 
			
		||||
      })
 | 
			
		||||
@ -319,10 +319,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"]',
 | 
			
		||||
      })
 | 
			
		||||
@ -392,7 +392,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
    part001 = startSketchOn(XZ)
 | 
			
		||||
      |> startProfileAt([0, 0], %)
 | 
			
		||||
      |> line(end = [0.5, yRel001])
 | 
			
		||||
      |> angledLine({ angle = angle001, length = len001 }, %)
 | 
			
		||||
      |> angledLine(angle = angle001, length = len001 )
 | 
			
		||||
      |> line(endAbsolute = [33, yAbs001])
 | 
			
		||||
      |> xLine(endAbsolute = xAbs002)
 | 
			
		||||
      |> yLine(endAbsolute = -10.77, tag = $a)
 | 
			
		||||
@ -465,7 +465,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
      part001 = startSketchOn(XZ)
 | 
			
		||||
        |> startProfileAt([0, 0], %)
 | 
			
		||||
        |> line(end = [0.5, -14 + 0])
 | 
			
		||||
        |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, length = 32 + 0 )
 | 
			
		||||
        |> line(endAbsolute = [33, 11.5 + 0])
 | 
			
		||||
        |> xLine(endAbsolute = 9 - 5)
 | 
			
		||||
        |> yLine(endAbsolute = -10.77, tag = $a)
 | 
			
		||||
@ -473,8 +473,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        |> 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 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, endAbsoluteX =  26)
 | 
			
		||||
        |> angledLine(angle = 89, endAbsoluteY =  9.14 + 0)
 | 
			
		||||
        |> angledLineThatIntersects({
 | 
			
		||||
        angle = 4.14,
 | 
			
		||||
        intersectTag = a,
 | 
			
		||||
@ -597,7 +597,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
      part001 = startSketchOn(XZ)
 | 
			
		||||
        |> startProfileAt([0, 0], %)
 | 
			
		||||
        |> line(end = [0.5, -14 + 0])
 | 
			
		||||
        |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, length = 32 + 0 )
 | 
			
		||||
        |> line(endAbsolute = [33, 11.5 + 0])
 | 
			
		||||
        |> xLine(endAbsolute = 9 - 5)
 | 
			
		||||
        |> yLine(endAbsolute = -10.77, tag = $a)
 | 
			
		||||
@ -605,8 +605,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        |> 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 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, endAbsoluteX =  26)
 | 
			
		||||
        |> angledLine(angle = 89, endAbsoluteY =  9.14 + 0)
 | 
			
		||||
        |> angledLineThatIntersects({
 | 
			
		||||
        angle = 4.14,
 | 
			
		||||
        intersectTag = a,
 | 
			
		||||
@ -614,11 +614,177 @@ 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')
 | 
			
		||||
        })
 | 
			
		||||
        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:
 | 
			
		||||
            'angledLine(angle = 3 + 0, endAbsoluteX =  26)',
 | 
			
		||||
          expectAfterUnconstrained: 'angledLine(angle = 3, endAbsoluteX =  26)',
 | 
			
		||||
          expectFinal: 'angledLine(angle = angle001, endAbsoluteX =  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:
 | 
			
		||||
            'angledLine(angle = angle001, endAbsoluteX =  26)',
 | 
			
		||||
          expectAfterUnconstrained:
 | 
			
		||||
            'angledLine(angle = angle001, endAbsoluteX =  xAbs001)',
 | 
			
		||||
          expectFinal: 'angledLine(angle = angle001, endAbsoluteX =  26)',
 | 
			
		||||
          ang: ang + 180,
 | 
			
		||||
          locator: '[data-overlay-toolbar-index="9"]',
 | 
			
		||||
        })
 | 
			
		||||
 | 
			
		||||
        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({
 | 
			
		||||
          hoverPos: { x: angledLineToY.x, y: angledLineToY.y },
 | 
			
		||||
          constraintType: 'angle',
 | 
			
		||||
          expectBeforeUnconstrained:
 | 
			
		||||
            'angledLine(angle = 89, endAbsoluteY =  9.14 + 0)',
 | 
			
		||||
          expectAfterUnconstrained:
 | 
			
		||||
            'angledLine(angle = angle002, endAbsoluteY =  9.14 + 0)',
 | 
			
		||||
          expectFinal: 'angledLine(angle = 89, endAbsoluteY =  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:
 | 
			
		||||
            'angledLine(angle = 89, endAbsoluteY =  9.14 + 0)',
 | 
			
		||||
          expectAfterUnconstrained:
 | 
			
		||||
            'angledLine(angle = 89, endAbsoluteY =  9.14)',
 | 
			
		||||
          expectFinal: 'angledLine(angle = 89, endAbsoluteY =  yAbs001)',
 | 
			
		||||
          ang: ang + 180,
 | 
			
		||||
          locator: '[data-overlay-toolbar-index="10"]',
 | 
			
		||||
        })
 | 
			
		||||
>>>>>>> bcbec9f87 (Update KCL in JS project)
 | 
			
		||||
 | 
			
		||||
      await homePage.goToModelingScene()
 | 
			
		||||
 | 
			
		||||
@ -759,7 +925,7 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
      part001 = startSketchOn(XZ)
 | 
			
		||||
        |> startProfileAt([0, 0], %)
 | 
			
		||||
        |> line(end = [0.5, -14 + 0])
 | 
			
		||||
        |> angledLine({ angle = 3 + 0, length = 32 + 0 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, length = 32 + 0 )
 | 
			
		||||
        |> line(endAbsolute = [33, 11.5 + 0])
 | 
			
		||||
        |> xLine(endAbsolute = 9 - 5)
 | 
			
		||||
        |> yLine(endAbsolute = -10.77, tag = $a)
 | 
			
		||||
@ -767,8 +933,8 @@ test.describe('Testing segment overlays', { tag: ['@skipWin'] }, () => {
 | 
			
		||||
        |> 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 }, %)
 | 
			
		||||
        |> angledLine(angle = 3 + 0, endAbsoluteX =  26)
 | 
			
		||||
        |> angledLine(angle = 89, endAbsoluteY =  9.14 + 0)
 | 
			
		||||
        |> angledLineThatIntersects({
 | 
			
		||||
        angle = 4.14,
 | 
			
		||||
        intersectTag = a,
 | 
			
		||||
@ -1033,47 +1199,47 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
  test.describe('Testing deleting a segment', () => {
 | 
			
		||||
    const _deleteSegmentSequence =
 | 
			
		||||
      (page: Page, editor: EditorFixture) =>
 | 
			
		||||
      async ({
 | 
			
		||||
        hoverPos,
 | 
			
		||||
        codeToBeDeleted,
 | 
			
		||||
        stdLibFnName,
 | 
			
		||||
        ang = 45,
 | 
			
		||||
        steps = 6,
 | 
			
		||||
        locator,
 | 
			
		||||
      }: {
 | 
			
		||||
        hoverPos: { x: number; y: number }
 | 
			
		||||
        codeToBeDeleted: string
 | 
			
		||||
        stdLibFnName: string
 | 
			
		||||
        ang?: number
 | 
			
		||||
        steps?: number
 | 
			
		||||
        locator?: string
 | 
			
		||||
      }) => {
 | 
			
		||||
        await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
        async ({
 | 
			
		||||
          hoverPos,
 | 
			
		||||
          codeToBeDeleted,
 | 
			
		||||
          stdLibFnName,
 | 
			
		||||
          ang = 45,
 | 
			
		||||
          steps = 6,
 | 
			
		||||
          locator,
 | 
			
		||||
        }: {
 | 
			
		||||
          hoverPos: { x: number; y: number }
 | 
			
		||||
          codeToBeDeleted: string
 | 
			
		||||
          stdLibFnName: string
 | 
			
		||||
          ang?: number
 | 
			
		||||
          steps?: number
 | 
			
		||||
          locator?: string
 | 
			
		||||
        }) => {
 | 
			
		||||
          await expect(page.getByText('Added variable')).not.toBeVisible()
 | 
			
		||||
 | 
			
		||||
        await page.mouse.move(0, 0)
 | 
			
		||||
        await page.waitForTimeout(1000)
 | 
			
		||||
        let x = 0,
 | 
			
		||||
          y = 0
 | 
			
		||||
        x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
        y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
        await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
        await page.mouse.move(x, y)
 | 
			
		||||
          await page.mouse.move(0, 0)
 | 
			
		||||
          await page.waitForTimeout(1000)
 | 
			
		||||
          let x = 0,
 | 
			
		||||
            y = 0
 | 
			
		||||
          x = hoverPos.x + Math.cos(ang * deg) * 32
 | 
			
		||||
          y = hoverPos.y - Math.sin(ang * deg) * 32
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
          await wiggleMove(page, x, y, 20, 30, ang, 10, 5, locator)
 | 
			
		||||
          await page.mouse.move(x, y)
 | 
			
		||||
 | 
			
		||||
        await editor.expectEditor.toContain(codeToBeDeleted, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
          await editor.expectEditor.toContain(codeToBeDeleted, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
 | 
			
		||||
        await page
 | 
			
		||||
          .locator(`[data-stdlib-fn-name="${stdLibFnName}"]`)
 | 
			
		||||
          .first()
 | 
			
		||||
          .click()
 | 
			
		||||
        await page.getByText('Delete Segment').click()
 | 
			
		||||
          await page
 | 
			
		||||
            .locator(`[data-stdlib-fn-name="${stdLibFnName}"]`)
 | 
			
		||||
            .first()
 | 
			
		||||
            .click()
 | 
			
		||||
          await page.getByText('Delete Segment').click()
 | 
			
		||||
 | 
			
		||||
        await editor.expectEditor.not.toContain(codeToBeDeleted, {
 | 
			
		||||
          shouldNormalise: true,
 | 
			
		||||
        })
 | 
			
		||||
      }
 | 
			
		||||
          await editor.expectEditor.not.toContain(codeToBeDeleted, {
 | 
			
		||||
            shouldNormalise: true,
 | 
			
		||||
          })
 | 
			
		||||
        }
 | 
			
		||||
    test('all segment types', async ({
 | 
			
		||||
      page,
 | 
			
		||||
      editor,
 | 
			
		||||
@ -1084,6 +1250,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      await page.addInitScript(async () => {
 | 
			
		||||
        localStorage.setItem(
 | 
			
		||||
          'persistCode',
 | 
			
		||||
<<<<<<< HEAD
 | 
			
		||||
          `@settings(defaultLengthUnit = in)
 | 
			
		||||
part001 = startSketchOn(XZ)
 | 
			
		||||
  |>startProfileAt([0, 0], %)
 | 
			
		||||
@ -1114,7 +1281,48 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
       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])
 | 
			
		||||
      |> 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 }, %)
 | 
			
		||||
      |> angledLine(angle = 3 + 0, endAbsoluteX =  26)
 | 
			
		||||
      |> angledLine(angle = 89, endAbsoluteY =  9.14 + 0)
 | 
			
		||||
      |> angledLineThatIntersects({
 | 
			
		||||
     angle = 4.14,
 | 
			
		||||
     intersectTag = a,
 | 
			
		||||
     offset = 9
 | 
			
		||||
         }, %)
 | 
			
		||||
      |> tangentialArcTo([3.14 + 13, 1.14], %)
 | 
			
		||||
>>>>>>> bcbec9f87 (Update KCL in JS project)
 | 
			
		||||
          `
 | 
			
		||||
        )
 | 
			
		||||
        localStorage.setItem('disableAxis', 'true')
 | 
			
		||||
      })
 | 
			
		||||
@ -1137,7 +1345,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      let segmentToDelete
 | 
			
		||||
 | 
			
		||||
      const getOverlayByIndex = (index: number) =>
 | 
			
		||||
        u.getBoundingBox(`[data-overlay-index="${index}"]`)
 | 
			
		||||
        u.getBoundingBox(`[data - overlay - index="${index}"]`)
 | 
			
		||||
 | 
			
		||||
      segmentToDelete = await getOverlayByIndex(14)
 | 
			
		||||
      let ang = await u.getAngle('[data-overlay-index="14"]')
 | 
			
		||||
@ -1147,10 +1355,10 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      await deleteSegmentSequence({
 | 
			
		||||
        hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
 | 
			
		||||
        codeToBeDeleted: `arc({
 | 
			
		||||
       radius = 9.03,
 | 
			
		||||
       angleStart = 40.27,
 | 
			
		||||
       angleEnd = -38.05
 | 
			
		||||
     }, %)`,
 | 
			
		||||
            radius = 9.03,
 | 
			
		||||
            angleStart = 40.27,
 | 
			
		||||
            angleEnd = -38.05
 | 
			
		||||
          }, %)`,
 | 
			
		||||
        stdLibFnName: 'arc',
 | 
			
		||||
        ang: ang + 180,
 | 
			
		||||
        steps: 6,
 | 
			
		||||
@ -1161,9 +1369,9 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      await deleteSegmentSequence({
 | 
			
		||||
        hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
 | 
			
		||||
        codeToBeDeleted: `arcTo({
 | 
			
		||||
       interior = [16.25, 5.12],
 | 
			
		||||
       end = [21.61, 4.15]
 | 
			
		||||
     }, %)`,
 | 
			
		||||
            interior =[16.25, 5.12],
 | 
			
		||||
            end =[21.61, 4.15]
 | 
			
		||||
          }, %)`,
 | 
			
		||||
        stdLibFnName: 'arcTo',
 | 
			
		||||
        ang: ang,
 | 
			
		||||
        steps: 6,
 | 
			
		||||
@ -1185,10 +1393,10 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      await deleteSegmentSequence({
 | 
			
		||||
        hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
 | 
			
		||||
        codeToBeDeleted: `angledLineThatIntersects({
 | 
			
		||||
      angle = 4.14,
 | 
			
		||||
      intersectTag = a,
 | 
			
		||||
      offset = 9
 | 
			
		||||
        }, %)`,
 | 
			
		||||
            angle = 4.14,
 | 
			
		||||
            intersectTag = a,
 | 
			
		||||
            offset = 9
 | 
			
		||||
          }, %)`,
 | 
			
		||||
        stdLibFnName: 'angledLineThatIntersects',
 | 
			
		||||
        ang: ang + 180,
 | 
			
		||||
        steps: 7,
 | 
			
		||||
@ -1199,7 +1407,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      ang = await u.getAngle('[data-overlay-index="10"]')
 | 
			
		||||
      await deleteSegmentSequence({
 | 
			
		||||
        hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
 | 
			
		||||
        codeToBeDeleted: 'angledLineToY({ angle = 89, to = 9.14 + 0 }, %)',
 | 
			
		||||
        codeToBeDeleted: 'angledLine(angle = 89, endAbsoluteY =  9.14 + 0)',
 | 
			
		||||
        stdLibFnName: 'angledLineToY',
 | 
			
		||||
        ang: ang + 180,
 | 
			
		||||
        locator: '[data-overlay-toolbar-index="10"]',
 | 
			
		||||
@ -1209,7 +1417,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      ang = await u.getAngle('[data-overlay-index="9"]')
 | 
			
		||||
      await deleteSegmentSequence({
 | 
			
		||||
        hoverPos: { x: segmentToDelete.x, y: segmentToDelete.y },
 | 
			
		||||
        codeToBeDeleted: 'angledLineToX({ angle = 3 + 0, to = 26 }, %)',
 | 
			
		||||
        codeToBeDeleted: 'angledLine(angle = 3 + 0, endAbsoluteX =  26)',
 | 
			
		||||
        stdLibFnName: 'angledLineToX',
 | 
			
		||||
        ang: ang + 180,
 | 
			
		||||
        locator: '[data-overlay-toolbar-index="9"]',
 | 
			
		||||
@ -1314,7 +1522,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      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 }, %)',
 | 
			
		||||
        codeToBeDeleted: 'angledLine(angle = 3 + 0, length = 32 + 0 )',
 | 
			
		||||
        stdLibFnName: 'angledLine',
 | 
			
		||||
        ang: ang + 180,
 | 
			
		||||
        locator: '[data-overlay-toolbar-index="1"]',
 | 
			
		||||
@ -1335,25 +1543,25 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
  test.describe('Testing delete with dependent segments', () => {
 | 
			
		||||
    const cases = [
 | 
			
		||||
      'line(end = [22, 2], tag = $seg01)',
 | 
			
		||||
      'angledLine([5, 23.03], %, $seg01)',
 | 
			
		||||
      'angledLine(angle = 5, length = 23.03, tag = $seg01)',
 | 
			
		||||
      'xLine(length = 23, tag = $seg01)',
 | 
			
		||||
      'yLine(length = -8, tag = $seg01)',
 | 
			
		||||
      'xLine(endAbsolute = 30, tag = $seg01)',
 | 
			
		||||
      'yLine(endAbsolute = -4, tag = $seg01)',
 | 
			
		||||
      'angledLineOfXLength([3, 30], %, $seg01)',
 | 
			
		||||
      'angledLine(angle = 3, lengthX = 30, tag = $seg01)',
 | 
			
		||||
      'angledLineOfXLength({ angle = 3, length = 30 }, %, $seg01)',
 | 
			
		||||
      'angledLineOfYLength([3, 1.5], %, $seg01)',
 | 
			
		||||
      'angledLine(angle = 3, lengthY = 1.5, tag = $seg01)',
 | 
			
		||||
      'angledLineOfYLength({ angle = 3, length = 1.5 }, %, $seg01)',
 | 
			
		||||
      'angledLineToX([3, 30], %, $seg01)',
 | 
			
		||||
      'angledLineToX({ angle = 3, to = 30 }, %, $seg01)',
 | 
			
		||||
      'angledLineToY([3, 7], %, $seg01)',
 | 
			
		||||
      'angledLineToY({ angle = 3, to = 7 }, %, $seg01)',
 | 
			
		||||
      'angledLine(angle = 3, endAbsoluteX = 30, tag = $seg01)',
 | 
			
		||||
      'angledLine(angle = 3, endAbsoluteX =  30, tag = $seg01)',
 | 
			
		||||
      'angledLine(angle = 3, endAbsoluteY = 7, tag = $seg01)',
 | 
			
		||||
      'angledLine(angle = 3, endAbsoluteY =  7, tag = $seg01)',
 | 
			
		||||
    ]
 | 
			
		||||
    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 }) => {
 | 
			
		||||
@ -1362,10 +1570,16 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
                `@settings(defaultLengthUnit = in)
 | 
			
		||||
        part001 = startSketchOn(XZ)
 | 
			
		||||
          |> startProfileAt([5, 6], %)
 | 
			
		||||
          |> ${lineToBeDeleted}
 | 
			
		||||
          |> ${ lineToBeDeleted }
 | 
			
		||||
          |> line(end = [-10, -15])
 | 
			
		||||
          |> angledLine([-176, segLen(seg01)], %)
 | 
			
		||||
        ${extraLine ? 'myVar = segLen(seg01)' : ''}`
 | 
			
		||||
<<<<<<< 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)': '' }`
 | 
			
		||||
              )
 | 
			
		||||
            },
 | 
			
		||||
            {
 | 
			
		||||
@ -1403,7 +1617,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')
 | 
			
		||||
@ -1477,7 +1691,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      },
 | 
			
		||||
 | 
			
		||||
      {
 | 
			
		||||
        before: `angledLine([5 + 0, 23.03 + 0], %, $seg01)`,
 | 
			
		||||
        before: `angledLine(angle = 5 + 0, length = 23.03 + 0, tag = $seg01)`,
 | 
			
		||||
        after: `line(end = [22.94, 2.01], tag = $seg01)`,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
@ -1505,18 +1719,18 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
        after: `line(end = [28.62, 1.5], tag = $seg01)`,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        before: `angledLineToX({ angle = 3 + 0, to = 30 + 0 }, %, $seg01)`,
 | 
			
		||||
        before: `angledLine(angle = 3 + 0, endAbsoluteX = 30 + 0, tag = $seg01)`,
 | 
			
		||||
        after: `line(end = [25, 1.31], tag = $seg01)`,
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        before: `angledLineToY({ angle = 3 + 0, to = 7 + 0 }, %, $seg01)`,
 | 
			
		||||
        before: `angledLine(angle = 3 + 0, endAbsoluteY = 7 + 0, tag = $seg01)`,
 | 
			
		||||
        after: `line(end = [19.08, 1], tag = $seg01)`,
 | 
			
		||||
      },
 | 
			
		||||
    ]
 | 
			
		||||
 | 
			
		||||
    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,
 | 
			
		||||
@ -1527,10 +1741,10 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
              'persistCode',
 | 
			
		||||
              `@settings(defaultLengthUnit = in)
 | 
			
		||||
      part001 = startSketchOn(XZ)
 | 
			
		||||
        |> startProfileAt([5, 6], %)
 | 
			
		||||
        |> ${lineToBeDeleted}
 | 
			
		||||
        |> line(end = [-10, -15])
 | 
			
		||||
        |> angledLine([-176, segLen(seg01)], %)`
 | 
			
		||||
          |> startProfileAt([5, 6], %)
 | 
			
		||||
          |> ${ lineToBeDeleted }
 | 
			
		||||
          |> line(end = [-10, -15])
 | 
			
		||||
        |> angledLine(angle = -176, length = segLen(seg01))`
 | 
			
		||||
            )
 | 
			
		||||
          },
 | 
			
		||||
          {
 | 
			
		||||
@ -1552,7 +1766,7 @@ 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"]`)
 | 
			
		||||
        const hoverPos = await u.getBoundingBox(`[data - overlay - index="0"]`)
 | 
			
		||||
        let ang = await u.getAngle('[data-overlay-index="0"]')
 | 
			
		||||
        ang += 180
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -320,9 +320,9 @@ part009 = startSketchOn(XY)
 | 
			
		||||
  |> line(end = [0, -1])
 | 
			
		||||
  |> line(end = [-thickness, 0])
 | 
			
		||||
  |> line(end = [0, 1])
 | 
			
		||||
  |> angledLineToX({ angle = 120, to = pipeSmallDia }, %)
 | 
			
		||||
  |> angledLine(angle = 120, endAbsoluteX =  pipeSmallDia)
 | 
			
		||||
  |> line(end = [0, pipeLength])
 | 
			
		||||
  |> angledLineToX({ angle = 60, to = pipeLargeDia }, %)
 | 
			
		||||
  |> angledLine(angle = 60, endAbsoluteX =  pipeLargeDia)
 | 
			
		||||
  |> close()
 | 
			
		||||
rev = revolve(part009, axis = 'y')
 | 
			
		||||
sketch006 = startSketchOn(XY)
 | 
			
		||||
@ -332,7 +332,7 @@ profile001 = circle(
 | 
			
		||||
  radius = 17.96
 | 
			
		||||
)
 | 
			
		||||
profile002 = startProfileAt([86.92, -63.81], sketch006)
 | 
			
		||||
  |> angledLine([0, 63.81], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 63.81, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       17.05
 | 
			
		||||
@ -471,7 +471,7 @@ yo = startProfileAt([4.83, 12.56], part001)
 | 
			
		||||
  |> line(end = [15.1, 2.48])
 | 
			
		||||
  |> line(end = [3.15, -9.85], tag = $seg01)
 | 
			
		||||
  |> line(end = [-15.17, -4.1])
 | 
			
		||||
  |> angledLine([segAng(seg01), 12.35], %, $seg02)
 | 
			
		||||
  |> angledLine(angle = segAng(seg01), length = 12.35, tag = $seg02)
 | 
			
		||||
  |> line(end = [-13.02, 10.03])
 | 
			
		||||
  |> close()
 | 
			
		||||
yoo = extrude(yo, length = 4)
 | 
			
		||||
@ -484,7 +484,7 @@ profile002 = startProfileAt([-11.08, 2.39], sketch002)
 | 
			
		||||
  |> close()
 | 
			
		||||
extrude001 = extrude(profile002, length = 15)
 | 
			
		||||
profile001 = startProfileAt([7.49, 9.96], sketch001)
 | 
			
		||||
  |> angledLine([0, 5.05], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 5.05, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       4.81
 | 
			
		||||
@ -537,15 +537,15 @@ profile001 = startProfileAt([7.49, 9.96], sketch001)
 | 
			
		||||
part001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([20, 0], %)
 | 
			
		||||
  |> line(end = [7.13, 4 + 0])
 | 
			
		||||
  |> angledLine({ angle = 3 + 0, length = 3.14 + 0 }, %)
 | 
			
		||||
  |> angledLine(angle = 3 + 0, length = 3.14 + 0 )
 | 
			
		||||
  |> line(endAbsolute = [20.14 + 0, -0.14 + 0])
 | 
			
		||||
  |> xLine(endAbsolute = 29 + 0)
 | 
			
		||||
  |> yLine(length = -3.14 + 0, tag = $a)
 | 
			
		||||
  |> xLine(length = 1.63)
 | 
			
		||||
  |> angledLineOfXLength({ angle = 3 + 0, length = 3.14 }, %)
 | 
			
		||||
  |> angledLineOfYLength({ angle = 30, length = 3 + 0 }, %)
 | 
			
		||||
  |> angledLineToX({ angle = 22.14 + 0, to = 12 }, %)
 | 
			
		||||
  |> angledLineToY({ angle = 30, to = 11.14 }, %)
 | 
			
		||||
  |> angledLine(angle = 22.14 + 0, endAbsoluteX =  12)
 | 
			
		||||
  |> angledLine(angle = 30, endAbsoluteY =  11.14)
 | 
			
		||||
  |> angledLineThatIntersects({
 | 
			
		||||
        angle = 3.14,
 | 
			
		||||
        intersectTag = a,
 | 
			
		||||
@ -735,13 +735,13 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      'straightSegmentEdge',
 | 
			
		||||
      straightSegmentEdge,
 | 
			
		||||
      `angledLineToY({angle=30,to=11.14},%)`,
 | 
			
		||||
      'angledLineToY({ angle = 30, to = 11.14 }, %)'
 | 
			
		||||
      'angledLine(angle = 30, endAbsoluteY =  11.14)'
 | 
			
		||||
    )
 | 
			
		||||
    await checkCodeAtHoverPosition(
 | 
			
		||||
      'straightSegmentOppositeEdge',
 | 
			
		||||
      straightSegmentOppositeEdge,
 | 
			
		||||
      `angledLineToY({angle=30,to=11.14},%)`,
 | 
			
		||||
      'angledLineToY({ angle = 30, to = 11.14 }, %)'
 | 
			
		||||
      'angledLine(angle = 30, endAbsoluteY =  11.14)'
 | 
			
		||||
    )
 | 
			
		||||
    await checkCodeAtHoverPosition(
 | 
			
		||||
      'straightSegmentAdjacentEdge',
 | 
			
		||||
@ -756,7 +756,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
    await u.codeLocator.fill(`@settings(defaultLengthUnit = in)
 | 
			
		||||
    sketch001 = startSketchOn(XZ)
 | 
			
		||||
    |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag]
 | 
			
		||||
    |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
    |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
    |> angledLine([
 | 
			
		||||
     segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
     217.26
 | 
			
		||||
@ -961,7 +961,7 @@ part001 = startSketchOn(XZ)
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        pos: [816, 244],
 | 
			
		||||
        expectedCode: 'angledLine([segAng(seg01), yo], %)',
 | 
			
		||||
        expectedCode: 'angledLine(angle = segAng(seg01), length = yo)',
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        pos: [1107, 161],
 | 
			
		||||
 | 
			
		||||
@ -1 +1 @@
 | 
			
		||||
part001 = startSketchOn('XY')yo = startProfileAt([4.83, 12.56], part001)  |> line(end = [15.1, 2.48])  |> line(end = [3.15, -9.85], tag = $seg01)  |> line(end = [-15.17, -4.1])  |> angledLine([segAng(seg01), 12.35], %, $seg02)  |> line(end = [-13.02, 10.03])  |> close()sketch002 = startSketchOn({  plane = {    origin = { x = 7.49, y = 2.4, z = 0 },    xAxis = { x = -0.3, y = 0.95, z = 0 },    yAxis = { x = 0, y = 0, z = 1 },    zAxis = { x = 0.95, y = 0.3, z = 0 }  }})sketch001 = startSketchOn({  plane = {    origin = { x = 0, y = 0, z = 4 },    xAxis = { x = 1, y = 0, z = 0 },    yAxis = { x = 0, y = 1, z = 0 },    zAxis = { x = 0, y = 0, z = 1 }  }})profile002 = startProfileAt([-11.08, 2.39], sketch002)  |> line(end = [4.89, 0.9])  |> line(end = [-0.61, -2.41])  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])  |> close()extrude001 = extrude(profile002, length = 15)profile001 = startProfileAt([7.49, 9.96], sketch001)  |> angledLine([0, 5.05], %, $rectangleSegmentA001)  |> angledLine([       segAng(rectangleSegmentA001) - 90,       4.81     ], %)  |> angledLine([       segAng(rectangleSegmentA001),       -segLen(rectangleSegmentA001)     ], %)  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])  |> close()
 | 
			
		||||
part001 = startSketchOn('XY')yo = startProfileAt([4.83, 12.56], part001)  |> line(end = [15.1, 2.48])  |> line(end = [3.15, -9.85], tag = $seg01)  |> line(end = [-15.17, -4.1])  |> angledLine(angle = segAng(seg01), 12.35], %, $seg02)  |> line(end = [-13.02, 10.03])  |> close()sketch002 = startSketchOn({  plane = {    origin = { x = 7.49, y = 2.4, z = 0 },    xAxis = { x = -0.3, y = 0.95, z = 0 },    yAxis = { x = 0, y = 0, z = 1 },    zAxis = { x = 0.95, y = 0.3, z = 0 }  }})sketch001 = startSketchOn({  plane = {    origin = { x = 0, y = 0, z = 4 },    xAxis = { x = 1, y = 0, z = 0 },    yAxis = { x = 0, y = 1, z = 0 },    zAxis = { x = 0, y = 0, z = 1 }  }})profile002 = startProfileAt([-11.08, 2.39], sketch002)  |> line(end = [4.89, 0.9])  |> line(end = [-0.61, -2.41])  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])  |> close()extrude001 = extrude(profile002, length = 15)profile001 = startProfileAt([7.49, 9.96], sketch001)  |> angledLine(angle = 0, length = 5.05, tag = $rectangleSegmentA001)  |> angledLine([       segAng(rectangleSegmentA001) - 90,       4.81     ], %)  |> angledLine([       segAng(rectangleSegmentA001), length =       -segLen(rectangleSegmentA001)     )  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])  |> close()
 | 
			
		||||
@ -45,7 +45,7 @@ test(
 | 
			
		||||
    // And you will need to have the KittyCAD CLI installed
 | 
			
		||||
    const u = await getUtils(page)
 | 
			
		||||
    await page.addInitScript(async () => {
 | 
			
		||||
      ;(window as any).playwrightSkipFilePicker = true
 | 
			
		||||
      ; (window as any).playwrightSkipFilePicker = true
 | 
			
		||||
      localStorage.setItem(
 | 
			
		||||
        'persistCode',
 | 
			
		||||
        `topAng = 25
 | 
			
		||||
@ -59,10 +59,11 @@ part001 = startSketchOn(-XZ)
 | 
			
		||||
|> startProfileAt([0, 0], %)
 | 
			
		||||
|> yLine(length = baseHeight)
 | 
			
		||||
|> xLine(length = baseLen)
 | 
			
		||||
|> angledLineToY({
 | 
			
		||||
|> angledLine(
 | 
			
		||||
      angle = topAng,
 | 
			
		||||
      to = totalHeightHalf,
 | 
			
		||||
    }, %, $seg04)
 | 
			
		||||
      endAbsoluteY = totalHeightHalf,
 | 
			
		||||
      tag = $seg04,
 | 
			
		||||
   )
 | 
			
		||||
|> xLine(endAbsolute = totalLen, tag = $seg03)
 | 
			
		||||
|> yLine(length = -armThick, tag = $seg01)
 | 
			
		||||
|> angledLineThatIntersects({
 | 
			
		||||
@ -70,11 +71,12 @@ part001 = startSketchOn(-XZ)
 | 
			
		||||
      offset = -armThick,
 | 
			
		||||
      intersectTag = seg04
 | 
			
		||||
    }, %)
 | 
			
		||||
|> angledLineToY([segAng(seg04) + 180, turns::ZERO], %)
 | 
			
		||||
|> angledLineToY({
 | 
			
		||||
|> angledLine(angle = segAng(seg04) + 180, endAbsoluteY = turns::ZERO)
 | 
			
		||||
|> angledLine(
 | 
			
		||||
      angle = -bottomAng,
 | 
			
		||||
      to = -totalHeightHalf - armThick,
 | 
			
		||||
    }, %, $seg02)
 | 
			
		||||
      endAbsoluteY = -totalHeightHalf - armThick,
 | 
			
		||||
      tag = $seg02,
 | 
			
		||||
   )
 | 
			
		||||
|> xLine(endAbsolute = segEndX(seg03) + 0)
 | 
			
		||||
|> yLine(length = -segLen(seg01))
 | 
			
		||||
|> angledLineThatIntersects({
 | 
			
		||||
@ -82,7 +84,7 @@ part001 = startSketchOn(-XZ)
 | 
			
		||||
      offset = -armThick,
 | 
			
		||||
      intersectTag = seg02
 | 
			
		||||
    }, %)
 | 
			
		||||
|> angledLineToY([segAng(seg02) + 180, -baseHeight], %)
 | 
			
		||||
|> angledLine(angle = segAng(seg02) + 180, endAbsoluteY = -baseHeight)
 | 
			
		||||
|> xLine(endAbsolute = turns::ZERO)
 | 
			
		||||
|> close()
 | 
			
		||||
|> extrude(length = 4)`
 | 
			
		||||
 | 
			
		||||
@ -187,7 +187,7 @@ fn lipFace(plane) {
 | 
			
		||||
         angleEnd = 45.0,
 | 
			
		||||
         radius = 0.500000
 | 
			
		||||
       }, %, $arc000)
 | 
			
		||||
    // |> angledLineOfYLength({ angle: -45, length: lipStep5 }, %)
 | 
			
		||||
    // |> angledLine(angle = -45, lengthY = lipStep5 )
 | 
			
		||||
    |> line(end = [1.046447, -1.046447], tag = $line001)
 | 
			
		||||
    |> yLine(length = -lipStep4)
 | 
			
		||||
    |> angledLine(angle = -45, lengthY = lipStep3)
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
@settings(defaultLengthUnit = in)
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %)
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
 | 
			
		||||
@ -1,7 +1,7 @@
 | 
			
		||||
@settings(defaultLengthUnit = in)
 | 
			
		||||
sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag]
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
 | 
			
		||||
@ -647,7 +647,7 @@ const planeYZfl = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001fl = startSketchOn(planeXZfl)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001fl) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -663,7 +663,7 @@ const extrude001fl = extrude(sketch001fl, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002fl = startSketchOn(planeYZfl)
 | 
			
		||||
  |> startProfileAt([-bendRad - thickness, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002fl)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002fl) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -699,7 +699,7 @@ const extrude003fl = extrude(sketch003fl, length = railHeight * 1.75)
 | 
			
		||||
// EIA-310-D standard hole pattern
 | 
			
		||||
const sketch004fl = startSketchOn(extrude002fl, 'START')
 | 
			
		||||
  |> startProfileAt([0.72 + originStart[1], originStart[2] + 0.15], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA003fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA003fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003fl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -720,7 +720,7 @@ const extrude004fl = extrude(sketch004fl, length = -thickness)
 | 
			
		||||
// EIA-310-D standard hole pattern
 | 
			
		||||
const sketch005fl = startSketchOn(extrude002fl, 'START')
 | 
			
		||||
  |> startProfileAt([0.72 + originStart[1],originStart[2] +  0.15 + .62], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA004fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA004fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA004fl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -744,7 +744,7 @@ const sketch006fl = startSketchOn(extrude002fl, 'START')
 | 
			
		||||
       0.72 + originStart[1],
 | 
			
		||||
      originStart[2] + 0.15 + 0.62 + 0.50
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA005fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA005fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA005fl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -765,7 +765,7 @@ const extrude006fl = extrude(sketch006fl, length = -thickness)
 | 
			
		||||
// EIA-310-D standard hole pattern
 | 
			
		||||
const sketch007fl = startSketchOn(extrude001fl, 'START')
 | 
			
		||||
  |> startProfileAt([-1.45 - originStart[0], originStart[2] + 0.15], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA006fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA006fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA006fl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -786,7 +786,7 @@ const extrude007fl = extrude(sketch007fl, length = -thickness)
 | 
			
		||||
// EIA-310-D standard hole pattern
 | 
			
		||||
const sketch008fl = startSketchOn(extrude001fl, 'START')
 | 
			
		||||
  |> startProfileAt([-1.45 - originStart[0],originStart[2] + 0.15 + 0.62], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA007fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA007fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA007fl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -810,7 +810,7 @@ const sketch009fl = startSketchOn(extrude001fl, 'START')
 | 
			
		||||
       -1.45 - originStart[0],
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.5
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA008fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA008fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA008fl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -924,7 +924,7 @@ const planeYZfr = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001fr = startSketchOn(planeXZfr)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001fr) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -940,7 +940,7 @@ const extrude001fr = extrude(sketch001fr, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002fr = startSketchOn(planeYZfr)
 | 
			
		||||
  |> startProfileAt([0.89, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002fr)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002fr) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -981,7 +981,7 @@ const sketch004fr = startSketchOn(extrude002fr, 'START')
 | 
			
		||||
       -0.35 + originStart[1] + width - 2,
 | 
			
		||||
       originStart[2] + 0.15
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA003fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA003fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003fr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1005,7 +1005,7 @@ const sketch005fr = startSketchOn(extrude002fr, 'START')
 | 
			
		||||
       -0.35 + originStart[1] + width - 2,
 | 
			
		||||
       originStart[2] + 0.15 + .62
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA004fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA004fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA004fr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1029,7 +1029,7 @@ const sketch006fr = startSketchOn(extrude002fr, 'START')
 | 
			
		||||
       -0.35 + originStart[1] + width - 2,
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.50
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA005fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA005fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA005fr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1053,7 +1053,7 @@ const sketch007fr = startSketchOn(extrude001fr, 'START')
 | 
			
		||||
       -1.45 - originStart[0],
 | 
			
		||||
       originStart[2] + 0.15
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA006fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA006fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA006fr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1077,7 +1077,7 @@ const sketch008fr = startSketchOn(extrude001fr, 'START')
 | 
			
		||||
       -1.45 - originStart[0],
 | 
			
		||||
       originStart[2] + 0.15 + 0.62
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA007fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA007fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA007fr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1101,7 +1101,7 @@ const sketch009fr = startSketchOn(extrude001fr, 'START')
 | 
			
		||||
       -1.45 - originStart[0],
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.5
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA008fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA008fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA008fr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1218,7 +1218,7 @@ const planeYZrr = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001rr = startSketchOn(planeXZrr)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001rr) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1234,7 +1234,7 @@ const extrude001rr = extrude(sketch001rr, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002rr = startSketchOn(planeYZrr)
 | 
			
		||||
  |> startProfileAt([0.89, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002rr)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002rr) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1275,7 +1275,7 @@ const sketch004rr = startSketchOn(extrude002rr, 'START')
 | 
			
		||||
       -0.35 + originStart[1] + width - 2,
 | 
			
		||||
       originStart[2] + 0.15
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA003rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA003rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003rr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1299,7 +1299,7 @@ const sketch005rr = startSketchOn(extrude002rr, 'START')
 | 
			
		||||
       -0.35 + originStart[1] + width - 2,
 | 
			
		||||
       originStart[2] + 0.15 + .62
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA004rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA004rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA004rr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1323,7 +1323,7 @@ const sketch006rr = startSketchOn(extrude002rr, 'START')
 | 
			
		||||
       -0.35 + originStart[1] + width - 2,
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.50
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA005rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA005rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA005rr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1347,7 +1347,7 @@ const sketch007rr = startSketchOn(extrude001rr, 'START')
 | 
			
		||||
       -originStart[0]-serverDepth+1.7,
 | 
			
		||||
       originStart[2] + 0.15
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA006rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA006rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA006rr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1371,7 +1371,7 @@ const sketch008rr = startSketchOn(extrude001rr, 'START')
 | 
			
		||||
       -originStart[0]-serverDepth+1.7,
 | 
			
		||||
       originStart[2] + 0.15 + 0.62
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA007rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA007rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA007rr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1395,7 +1395,7 @@ const sketch009rr = startSketchOn(extrude001rr, 'START')
 | 
			
		||||
       -originStart[0]-serverDepth+1.7,
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.5
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA008rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA008rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA008rr) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1511,7 +1511,7 @@ const planeYZrl = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001rl = startSketchOn(planeXZrl)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001rl) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1527,7 +1527,7 @@ const extrude001rl = extrude(sketch001rl, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002rl = startSketchOn(planeYZrl)
 | 
			
		||||
  |> startProfileAt([-bendRad - thickness, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002rl)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002rl) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1568,7 +1568,7 @@ const sketch004rl = startSketchOn(extrude002rl, 'START')
 | 
			
		||||
       -1.38 + 2 + thickness + originStart[1],
 | 
			
		||||
       originStart[2] + 0.15
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA003rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA003rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003rl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1592,7 +1592,7 @@ const sketch005rl = startSketchOn(extrude002rl, 'START')
 | 
			
		||||
       -1.38 + 2 + thickness + originStart[1],
 | 
			
		||||
       originStart[2] + 0.15 + .62
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA004rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA004rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA004rl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1616,7 +1616,7 @@ const sketch006rl = startSketchOn(extrude002rl, 'START')
 | 
			
		||||
       -1.38 + 2 + thickness + originStart[1],
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.50
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA005rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA005rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA005rl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1640,7 +1640,7 @@ const sketch007rl = startSketchOn(extrude001rl, 'START')
 | 
			
		||||
       1.75 - originStart[0] - serverDepth,
 | 
			
		||||
       originStart[2] + 0.15
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA006rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA006rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA006rl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1664,7 +1664,7 @@ const sketch008rl = startSketchOn(extrude001rl, 'START')
 | 
			
		||||
       1.75 - originStart[0] - serverDepth,
 | 
			
		||||
       originStart[2] + 0.15 + 0.62
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA007rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA007rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA007rl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1688,7 +1688,7 @@ const sketch009rl = startSketchOn(extrude001rl, 'START')
 | 
			
		||||
       1.75 - originStart[0] - serverDepth,
 | 
			
		||||
       originStart[2] + 0.15 + 0.62 + 0.5
 | 
			
		||||
     ], %)
 | 
			
		||||
  |> angledLine([0, -0.375], %, $rectangleSegmentA008rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = -0.375, tag = $rectangleSegmentA008rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA008rl) - 90,
 | 
			
		||||
       0.375
 | 
			
		||||
@ -1796,8 +1796,8 @@ fn streamServer = (serverPos) => {
 | 
			
		||||
 | 
			
		||||
  const sketch001s = startSketchOn(planeXYs)
 | 
			
		||||
    |> startProfileAt([1 + 1.2, 1], %)
 | 
			
		||||
    |> angledLine([0, 17.2], %, $rectangleSegmentA001)
 | 
			
		||||
    |> angledLine([segAng(rectangleSegmentA001) + 90, 29], %, $rectangleSegmentB001)
 | 
			
		||||
    |> angledLine(angle = 0, length = 17.2, tag = $rectangleSegmentA001)
 | 
			
		||||
    |> angledLine(angle = segAng(rectangleSegmentA001) + 90, length = 29, tag = $rectangleSegmentB001)
 | 
			
		||||
    |> angledLine([
 | 
			
		||||
         segAng(rectangleSegmentA001),
 | 
			
		||||
         -segLen(rectangleSegmentA001)
 | 
			
		||||
 | 
			
		||||
@ -653,7 +653,7 @@ const planeYZfl = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001fl = startSketchOn(planeXZfl)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001fl)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001fl) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -669,7 +669,7 @@ const extrude001fl = extrude(sketch001fl, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002fl = startSketchOn(planeYZfl)
 | 
			
		||||
  |> startProfileAt([-bendRad - thickness, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002fl)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002fl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002fl) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -804,7 +804,7 @@ const planeYZfr = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001fr = startSketchOn(planeXZfr)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001fr)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001fr) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -820,7 +820,7 @@ const extrude001fr = extrude(sketch001fr, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002fr = startSketchOn(planeYZfr)
 | 
			
		||||
  |> startProfileAt([0.89, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002fr)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002fr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002fr) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -954,7 +954,7 @@ const planeYZrr = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001rr = startSketchOn(planeXZrr)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001rr)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001rr) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -970,7 +970,7 @@ const extrude001rr = extrude(sketch001rr, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002rr = startSketchOn(planeYZrr)
 | 
			
		||||
  |> startProfileAt([0.89, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002rr)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002rr)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002rr) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1103,7 +1103,7 @@ const planeYZrl = {
 | 
			
		||||
// Base flange
 | 
			
		||||
const sketch001rl = startSketchOn(planeXZrl)
 | 
			
		||||
  |> startProfileAt([bendRad + thickness, 0], %)
 | 
			
		||||
  |> angledLine([0, 2 - bendRad - thickness], %, $rectangleSegmentA001rl)
 | 
			
		||||
  |> angledLine(angle = 0, length = 2 - bendRad - thickness, tag = $rectangleSegmentA001rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001rl) + 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1119,7 +1119,7 @@ const extrude001rl = extrude(sketch001rl, length = thickness)
 | 
			
		||||
// First flange
 | 
			
		||||
const sketch002rl = startSketchOn(planeYZrl)
 | 
			
		||||
  |> startProfileAt([-bendRad - thickness, 0], %)
 | 
			
		||||
  |> angledLine([180, 0.89 - bendRad - thickness], %, $rectangleSegmentA002rl)
 | 
			
		||||
  |> angledLine(angle = 180, length = 0.89 - bendRad - thickness, tag = $rectangleSegmentA002rl)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002rl) - 90,
 | 
			
		||||
       railHeight * 1.75
 | 
			
		||||
@ -1243,8 +1243,8 @@ fn streamServer = (serverPos) => {
 | 
			
		||||
 | 
			
		||||
  const sketch001s = startSketchOn(planeXYs)
 | 
			
		||||
    |> startProfileAt([1 + 1.2, 1], %)
 | 
			
		||||
    |> angledLine([0, 17.2], %, $rectangleSegmentA001)
 | 
			
		||||
    |> angledLine([segAng(rectangleSegmentA001) + 90, 29], %, $rectangleSegmentB001)
 | 
			
		||||
    |> angledLine(angle = 0, length = 17.2, tag = $rectangleSegmentA001)
 | 
			
		||||
    |> angledLine(angle = segAng(rectangleSegmentA001) + 90, length = 29, tag = $rectangleSegmentB001)
 | 
			
		||||
    |> angledLine([
 | 
			
		||||
         segAng(rectangleSegmentA001),
 | 
			
		||||
         -segLen(rectangleSegmentA001)
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
const sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag]
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
@ -22,7 +22,7 @@ const extrude001 = extrude(sketch001, length = 100)
 | 
			
		||||
 | 
			
		||||
const sketch003 = startSketchOn(extrude001, seg04)
 | 
			
		||||
   |> startProfileAt([-69.1, 277.34], %)
 | 
			
		||||
   |> angledLine([0, 41.48], %, $rectangleSegmentA003)
 | 
			
		||||
   |> angledLine(angle = 0, length = 41.48, tag = $rectangleSegmentA003)
 | 
			
		||||
   |> angledLine([
 | 
			
		||||
        segAng(rectangleSegmentA003) - 90,
 | 
			
		||||
        104.8
 | 
			
		||||
@ -35,7 +35,7 @@ const sketch003 = startSketchOn(extrude001, seg04)
 | 
			
		||||
   |> close()
 | 
			
		||||
const sketch002 = startSketchOn(extrude001, seg03)
 | 
			
		||||
  |> startProfileAt([159.25, 278.35], %)
 | 
			
		||||
  |> angledLine([0, 40.82], %, $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine(angle = 0, length = 40.82, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       132.27
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
const sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag]
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
@ -22,7 +22,7 @@ const extrude001 = extrude(sketch001, length = 100)
 | 
			
		||||
 | 
			
		||||
const sketch003 = startSketchOn(extrude001, seg04)
 | 
			
		||||
   |> startProfileAt([-69.1, 277.34], %)
 | 
			
		||||
   |> angledLine([0, 41.48], %, $rectangleSegmentA003)
 | 
			
		||||
   |> angledLine(angle = 0, length = 41.48, tag = $rectangleSegmentA003)
 | 
			
		||||
   |> angledLine([
 | 
			
		||||
        segAng(rectangleSegmentA003) - 90,
 | 
			
		||||
        104.8
 | 
			
		||||
@ -35,7 +35,7 @@ const sketch003 = startSketchOn(extrude001, seg04)
 | 
			
		||||
   |> close()
 | 
			
		||||
const sketch002 = startSketchOn(extrude001, seg03)
 | 
			
		||||
  |> startProfileAt([159.25, 278.35], %)
 | 
			
		||||
  |> angledLine([0, 40.82], %, $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine(angle = 0, length = 40.82, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       132.27
 | 
			
		||||
 | 
			
		||||
@ -1,6 +1,6 @@
 | 
			
		||||
sketch002 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([-108.83, -57.48], %)
 | 
			
		||||
  |> angledLine([0, 105.13], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 105.13, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       77.9
 | 
			
		||||
 | 
			
		||||
@ -1203,7 +1203,7 @@ fn o(c_x, c_y) {
 | 
			
		||||
         angle_start = 45 + a,
 | 
			
		||||
         angle_end = 225 - a
 | 
			
		||||
       }, %)
 | 
			
		||||
    |> angledLine([45, o_r - i_r], %)
 | 
			
		||||
    |> angledLine(angle = 45, length = o_r - i_r)
 | 
			
		||||
    |> arc({
 | 
			
		||||
         radius = i_r,
 | 
			
		||||
         angle_start = 225 - a,
 | 
			
		||||
@ -1219,7 +1219,7 @@ fn o(c_x, c_y) {
 | 
			
		||||
         angle_start = 225 + a,
 | 
			
		||||
         angle_end = 360 + 45 - a
 | 
			
		||||
       }, %)
 | 
			
		||||
    |> angledLine([225, o_r - i_r], %)
 | 
			
		||||
    |> angledLine(angle = 225, length = o_r - i_r)
 | 
			
		||||
    |> arc({
 | 
			
		||||
         radius = i_r,
 | 
			
		||||
         angle_start = 45 - a,
 | 
			
		||||
 | 
			
		||||
@ -5344,7 +5344,7 @@ description: Result of parsing gridfinity-bins-stacking-lip.kcl
 | 
			
		||||
                              "type": "NonCodeNode",
 | 
			
		||||
                              "value": {
 | 
			
		||||
                                "type": "blockComment",
 | 
			
		||||
                                "value": "|> angledLineOfYLength({ angle: -45, length: lipStep5 }, %)",
 | 
			
		||||
                                "value": "|> angledLine(angle = -45, lengthY = lipStep5 )",
 | 
			
		||||
                                "style": "line"
 | 
			
		||||
                              }
 | 
			
		||||
                            }
 | 
			
		||||
 | 
			
		||||
@ -322,11 +322,11 @@ yo = 5 + 6
 | 
			
		||||
part001 = startSketchOn(XY)
 | 
			
		||||
|> startProfileAt([-1.2, 4.83], %)
 | 
			
		||||
|> line(end = [2.8, 0])
 | 
			
		||||
|> angledLine([100 + 100, 3.09], %)
 | 
			
		||||
|> angledLine([abc, 3.09], %)
 | 
			
		||||
|> angledLine([def(yo), 3.09], %)
 | 
			
		||||
|> angledLine([ghi(%), 3.09], %)
 | 
			
		||||
|> angledLine([jkl(yo) + 2, 3.09], %)
 | 
			
		||||
|> angledLine(angle = 100 + 100, length = 3.09)
 | 
			
		||||
|> angledLine(angle = abc, length = 3.09)
 | 
			
		||||
|> angledLine(angle = def(yo), length = 3.09)
 | 
			
		||||
|> angledLine(angle = ghi(%), length = 3.09)
 | 
			
		||||
|> angledLine(angle = jkl(yo) + 2, length = 3.09)
 | 
			
		||||
yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
  it('should move a binary expression into a new variable', async () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -340,7 +340,7 @@ yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
    )
 | 
			
		||||
    const newCode = recast(modifiedAst)
 | 
			
		||||
    expect(newCode).toContain(`newVar = 100 + 100`)
 | 
			
		||||
    expect(newCode).toContain(`angledLine([newVar, 3.09], %)`)
 | 
			
		||||
    expect(newCode).toContain(`angledLine(angle = newVar, length = 3.09)`)
 | 
			
		||||
  })
 | 
			
		||||
  it('should move a value into a new variable', async () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -368,7 +368,7 @@ yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
    )
 | 
			
		||||
    const newCode = recast(modifiedAst)
 | 
			
		||||
    expect(newCode).toContain(`newVar = def(yo)`)
 | 
			
		||||
    expect(newCode).toContain(`angledLine([newVar, 3.09], %)`)
 | 
			
		||||
    expect(newCode).toContain(`angledLine(angle = newVar, length = 3.09)`)
 | 
			
		||||
  })
 | 
			
		||||
  it('should move a binary expression with call expression into a new variable', async () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -382,7 +382,7 @@ yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
    )
 | 
			
		||||
    const newCode = recast(modifiedAst)
 | 
			
		||||
    expect(newCode).toContain(`newVar = jkl(yo) + 2`)
 | 
			
		||||
    expect(newCode).toContain(`angledLine([newVar, 3.09], %)`)
 | 
			
		||||
    expect(newCode).toContain(`angledLine(angle = newVar, length = 3.09)`)
 | 
			
		||||
  })
 | 
			
		||||
  it('should move a identifier into a new variable', async () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -600,7 +600,7 @@ ${!replace1 ? `  |> ${line}\n` : ''}  |> angledLine([-65, ${
 | 
			
		||||
      !replace1 ? 'segLen(a)' : replace1
 | 
			
		||||
    }], %)
 | 
			
		||||
  |> line(end = [306.21, 198.87])
 | 
			
		||||
  |> angledLine([65, ${!replace2 ? 'segAng(a)' : replace2}], %)
 | 
			
		||||
  |> angledLine(angle = 65, length = ${!replace2 ? 'segAng(a)' : replace2})
 | 
			
		||||
  |> line(end = [-963.39, -154.67])
 | 
			
		||||
`
 | 
			
		||||
    test.each([
 | 
			
		||||
@ -616,7 +616,7 @@ ${!replace1 ? `  |> ${line}\n` : ''}  |> angledLine([-65, ${
 | 
			
		||||
      ['xLineTo', 'xLine(endAbsolute = 198.85, tag = $a)', ['162.14', '180']],
 | 
			
		||||
      [
 | 
			
		||||
        'angledLine',
 | 
			
		||||
        'angledLine({ angle: 45.5, length: 198.85 }, %, $a)',
 | 
			
		||||
        'angledLine(angle = 45.5, length = 198.85 , tag = $a)',
 | 
			
		||||
        ['198.85', '45.5'],
 | 
			
		||||
      ],
 | 
			
		||||
      [
 | 
			
		||||
@ -631,12 +631,12 @@ ${!replace1 ? `  |> ${line}\n` : ''}  |> angledLine([-65, ${
 | 
			
		||||
      ],
 | 
			
		||||
      [
 | 
			
		||||
        'angledLineToX',
 | 
			
		||||
        'angledLineToX({ angle = 45.5, to = 198.85 }, %, $a)',
 | 
			
		||||
        'angledLine(angle = 45.5, endAbsoluteX =  198.85, tag = $a)',
 | 
			
		||||
        ['231.33', '134.5'],
 | 
			
		||||
      ],
 | 
			
		||||
      [
 | 
			
		||||
        'angledLineToY',
 | 
			
		||||
        'angledLineToY({ angle = 45.5, to = 198.85 }, %, $a)',
 | 
			
		||||
        'angledLine(angle = 45.5, endAbsoluteY =  198.85, tag = $a)',
 | 
			
		||||
        ['134.51', '45.5'],
 | 
			
		||||
      ],
 | 
			
		||||
      [
 | 
			
		||||
@ -674,7 +674,7 @@ describe('Testing removeSingleConstraintInfo', () => {
 | 
			
		||||
    const code = `part001 = startSketchOn(-XZ)
 | 
			
		||||
  |> startProfileAt([0, 0], %)
 | 
			
		||||
  |> line(end = [3 + 0, 4 + 0])
 | 
			
		||||
  |> angledLine({ angle = 3 + 0, length = 3.14 + 0 }, %)
 | 
			
		||||
  |> angledLine(angle = 3 + 0, length = 3.14 + 0 )
 | 
			
		||||
  |> line(endAbsolute = [6.14 + 0, 3.14 + 0])
 | 
			
		||||
  |> xLine(/*xAbs*/ endAbsolute = 8 + 0)
 | 
			
		||||
  |> yLine(/*yAbs*/ endAbsolute = 5 + 0)
 | 
			
		||||
@ -682,8 +682,8 @@ describe('Testing removeSingleConstraintInfo', () => {
 | 
			
		||||
  |> xLine(/*xRel*/ length = 3.14 + 0)
 | 
			
		||||
  |> angledLineOfXLength({ angle = 3 + 0, length = 3.14 + 0 }, %)
 | 
			
		||||
  |> angledLineOfYLength({ angle = 30 + 0, length = 3 + 0 }, %)
 | 
			
		||||
  |> angledLineToX({ angle = 12.14 + 0, to = 12 + 0 }, %)
 | 
			
		||||
  |> angledLineToY({ angle = 30 + 0, to = 10.14 + 0 }, %)
 | 
			
		||||
  |> angledLine(angle = 12.14 + 0, endAbsoluteX =  12 + 0)
 | 
			
		||||
  |> angledLine(angle = 30 + 0, endAbsoluteY =  10.14 + 0)
 | 
			
		||||
  |> angledLineThatIntersects({
 | 
			
		||||
        angle = 3.14 + 0,
 | 
			
		||||
        intersectTag = a,
 | 
			
		||||
@ -693,7 +693,7 @@ describe('Testing removeSingleConstraintInfo', () => {
 | 
			
		||||
    test.each([
 | 
			
		||||
      [' line(end = [3 + 0, 4])', 'arrayIndex', 1, ''],
 | 
			
		||||
      [
 | 
			
		||||
        'angledLine({ angle = 3, length = 3.14 + 0 }, %)',
 | 
			
		||||
        'angledLine(angle = 3, length = 3.14 + 0 )',
 | 
			
		||||
        'objectProperty',
 | 
			
		||||
        'angle',
 | 
			
		||||
        '',
 | 
			
		||||
@ -716,13 +716,13 @@ describe('Testing removeSingleConstraintInfo', () => {
 | 
			
		||||
        '',
 | 
			
		||||
      ],
 | 
			
		||||
      [
 | 
			
		||||
        'angledLineToX({ angle = 12.14 + 0, to = 12 }, %)',
 | 
			
		||||
        'angledLine(angle = 12.14 + 0, endAbsoluteX =  12)',
 | 
			
		||||
        'objectProperty',
 | 
			
		||||
        'to',
 | 
			
		||||
        '',
 | 
			
		||||
      ],
 | 
			
		||||
      [
 | 
			
		||||
        'angledLineToY({ angle = 30, to = 10.14 + 0 }, %)',
 | 
			
		||||
        'angledLine(angle = 30, endAbsoluteY =  10.14 + 0)',
 | 
			
		||||
        'objectProperty',
 | 
			
		||||
        'angle',
 | 
			
		||||
        '',
 | 
			
		||||
@ -784,17 +784,17 @@ describe('Testing removeSingleConstraintInfo', () => {
 | 
			
		||||
  describe('with array notation', () => {
 | 
			
		||||
    const code = `part001 = startSketchOn(-XZ)
 | 
			
		||||
  |> startProfileAt([0, 0], %)
 | 
			
		||||
  |> angledLine([3.14 + 0, 3.14 + 0], %)
 | 
			
		||||
  |> angledLineOfXLength([3 + 0, 3.14 + 0], %)
 | 
			
		||||
  |> angledLineOfYLength([30 + 0, 3 + 0], %)
 | 
			
		||||
  |> angledLineToX([12.14 + 0, 12 + 0], %)
 | 
			
		||||
  |> angledLineToY([30 + 0, 10.14 + 0], %)`
 | 
			
		||||
  |> angledLine(angle = 3.14 + 0, length = 3.14 + 0)
 | 
			
		||||
  |> angledLine(angle = 3 + 0, lengthX = 3.14 + 0)
 | 
			
		||||
  |> angledLine(angle = 30 + 0, lengthY = 3 + 0)
 | 
			
		||||
  |> angledLine(angle = 12.14 + 0, endAbsoluteX = 12 + 0)
 | 
			
		||||
  |> angledLine(angle = 30 + 0, endAbsoluteY = 10.14 + 0)`
 | 
			
		||||
    test.each([
 | 
			
		||||
      ['angledLine([3, 3.14 + 0], %)', 'arrayIndex', 0],
 | 
			
		||||
      ['angledLineOfXLength([3, 3.14 + 0], %)', 'arrayIndex', 0],
 | 
			
		||||
      ['angledLineOfYLength([30 + 0, 3], %)', 'arrayIndex', 1],
 | 
			
		||||
      ['angledLineToX([12.14 + 0, 12], %)', 'arrayIndex', 1],
 | 
			
		||||
      ['angledLineToY([30, 10.14 + 0], %)', 'arrayIndex', 0],
 | 
			
		||||
      ['angledLine(angle = 3, length = 3.14 + 0)', 'arrayIndex', 0],
 | 
			
		||||
      ['angledLine(angle = 3, lengthX = 3.14 + 0)', 'arrayIndex', 0],
 | 
			
		||||
      ['angledLine(angle = 30 + 0, lengthY = 3)', 'arrayIndex', 1],
 | 
			
		||||
      ['angledLine(angle = 12.14 + 0, endAbsoluteX = 12)', 'arrayIndex', 1],
 | 
			
		||||
      ['angledLine(angle = 30, endAbsoluteY = 10.14 + 0)', 'arrayIndex', 0],
 | 
			
		||||
    ])('stdlib fn: %s', async (expectedFinish, key, value) => {
 | 
			
		||||
      const ast = assertParse(code)
 | 
			
		||||
 | 
			
		||||
@ -896,7 +896,7 @@ sketch003 = startSketchOn(XZ)
 | 
			
		||||
    //   |> startProfileAt([-12.55, 2.89], %)
 | 
			
		||||
    //   |> line(end = [3.02, 1.9])
 | 
			
		||||
    //   |> line(end = [1.82, -1.49], tag = $seg02)
 | 
			
		||||
    //   |> angledLine([-86, segLen(seg02)], %)
 | 
			
		||||
    //   |> angledLine(angle = -86, length = segLen(seg02))
 | 
			
		||||
    //   |> line(end = [-3.97, -0.53])
 | 
			
		||||
    //   |> line(end = [0.3, 0.84])
 | 
			
		||||
    //   |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
@ -923,7 +923,7 @@ sketch003 = startSketchOn(XZ)
 | 
			
		||||
    //   |> startProfileAt([-12.55, 2.89], %)
 | 
			
		||||
    //   |> line(end = [3.02, 1.9])
 | 
			
		||||
    //   |> line(end = [1.82, -1.49], tag = $seg02)
 | 
			
		||||
    //   |> angledLine([-86, segLen(seg02)], %)
 | 
			
		||||
    //   |> angledLine(angle = -86, length = segLen(seg02))
 | 
			
		||||
    //   |> line(end = [-3.97, -0.53])
 | 
			
		||||
    //   |> line(end = [0.3, 0.84])
 | 
			
		||||
    //   |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
@ -952,7 +952,7 @@ sketch003 = startSketchOn(XZ)
 | 
			
		||||
    //   |> startProfileAt([-12.55, 2.89], %)
 | 
			
		||||
    //   |> line(end = [3.02, 1.9])
 | 
			
		||||
    //   |> line(end = [1.82, -1.49], tag = $seg02)
 | 
			
		||||
    //   |> angledLine([-86, segLen(seg02)], %)
 | 
			
		||||
    //   |> angledLine(angle = -86, length = segLen(seg02))
 | 
			
		||||
    //   |> line(end = [-3.97, -0.53])
 | 
			
		||||
    //   |> line(end = [0.3, 0.84])
 | 
			
		||||
    //   |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
@ -979,7 +979,7 @@ sketch003 = startSketchOn(XZ)
 | 
			
		||||
    //   |> startProfileAt([-12.55, 2.89], %)
 | 
			
		||||
    //   |> line(end = [3.02, 1.9])
 | 
			
		||||
    //   |> line(end = [1.82, -1.49], tag = $seg02)
 | 
			
		||||
    //   |> angledLine([-86, segLen(seg02)], %)
 | 
			
		||||
    //   |> angledLine(angle = -86, length = segLen(seg02))
 | 
			
		||||
    //   |> line(end = [-3.97, -0.53])
 | 
			
		||||
    //   |> line(end = [0.3, 0.84])
 | 
			
		||||
    //   |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
 | 
			
		||||
@ -77,11 +77,11 @@ describe('testing argIsNotIdentifier', () => {
 | 
			
		||||
  const code = `part001 = startSketchOn(XY)
 | 
			
		||||
|> startProfileAt([-1.2, 4.83], %)
 | 
			
		||||
|> line(end = [2.8, 0])
 | 
			
		||||
|> angledLine([100 + 100, 3.09], %)
 | 
			
		||||
|> angledLine([abc, 3.09], %)
 | 
			
		||||
|> angledLine([def('yo'), 3.09], %)
 | 
			
		||||
|> angledLine([ghi(%), 3.09], %)
 | 
			
		||||
|> angledLine([jkl('yo') + 2, 3.09], %)
 | 
			
		||||
|> angledLine(angle = 100 + 100, length = 3.09)
 | 
			
		||||
|> angledLine(angle = abc, length = 3.09)
 | 
			
		||||
|> angledLine(angle = def('yo'), length = 3.09)
 | 
			
		||||
|> angledLine(angle = ghi(%), length = 3.09)
 | 
			
		||||
|> angledLine(angle = jkl('yo') + 2, length = 3.09)
 | 
			
		||||
yo = 5 + 6
 | 
			
		||||
yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
  it('find a safe binaryExpression', () => {
 | 
			
		||||
@ -98,7 +98,7 @@ yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
    const replaced = result.replacer(structuredClone(ast), 'replaceName')
 | 
			
		||||
    if (err(replaced)) throw replaced
 | 
			
		||||
    const outCode = recast(replaced.modifiedAst)
 | 
			
		||||
    expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`)
 | 
			
		||||
    expect(outCode).toContain(`angledLine(angle = replaceName, length = 3.09)`)
 | 
			
		||||
  })
 | 
			
		||||
  it('find a safe Identifier', () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -126,7 +126,7 @@ yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
    const replaced = result.replacer(structuredClone(ast), 'replaceName')
 | 
			
		||||
    if (err(replaced)) throw replaced
 | 
			
		||||
    const outCode = recast(replaced.modifiedAst)
 | 
			
		||||
    expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`)
 | 
			
		||||
    expect(outCode).toContain(`angledLine(angle = replaceName, length = 3.09)`)
 | 
			
		||||
  })
 | 
			
		||||
  it('find an UNsafe CallExpression, as it has a PipeSubstitution', () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -185,7 +185,7 @@ yo2 = hmm([identifierGuy + 5])`
 | 
			
		||||
    if (err(replaced)) throw replaced
 | 
			
		||||
    const { modifiedAst } = replaced
 | 
			
		||||
    const outCode = recast(modifiedAst)
 | 
			
		||||
    expect(outCode).toContain(`angledLine([replaceName, 3.09], %)`)
 | 
			
		||||
    expect(outCode).toContain(`angledLine(angle = replaceName, length = 3.09)`)
 | 
			
		||||
  })
 | 
			
		||||
  it('find a safe BinaryExpression within a CallExpression', () => {
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
@ -381,9 +381,9 @@ describe('testing hasExtrudeSketch', () => {
 | 
			
		||||
part001 = startSketchOn(XY)
 | 
			
		||||
  |> startProfileAt([-1.41, 3.46], %)
 | 
			
		||||
  |> line(end = [19.49, 1.16], tag = $seg01)
 | 
			
		||||
  |> angledLine([-35, length001], %)
 | 
			
		||||
  |> angledLine(angle = -35, length = length001)
 | 
			
		||||
  |> line(end = [-3.22, -7.36])
 | 
			
		||||
  |> angledLine([-175, segLen(seg01)], %)`
 | 
			
		||||
  |> angledLine(angle = -175, length = segLen(seg01))`
 | 
			
		||||
    const ast = assertParse(exampleCode)
 | 
			
		||||
 | 
			
		||||
    const execState = await enginelessExecutor(ast)
 | 
			
		||||
@ -401,9 +401,9 @@ part001 = startSketchOn(XY)
 | 
			
		||||
part001 = startSketchOn(XY)
 | 
			
		||||
  |> startProfileAt([-1.41, 3.46], %)
 | 
			
		||||
  |> line(end = [19.49, 1.16], tag = $seg01)
 | 
			
		||||
  |> angledLine([-35, length001], %)
 | 
			
		||||
  |> angledLine(angle = -35, length = length001)
 | 
			
		||||
  |> line(end = [-3.22, -7.36])
 | 
			
		||||
  |> angledLine([-175, segLen(seg01)], %)
 | 
			
		||||
  |> angledLine(angle = -175, length = segLen(seg01))
 | 
			
		||||
  |> extrude(length = 1)`
 | 
			
		||||
    const ast = assertParse(exampleCode)
 | 
			
		||||
 | 
			
		||||
@ -438,9 +438,9 @@ describe('Testing findUsesOfTagInPipe', () => {
 | 
			
		||||
|> startProfileAt([68.12, 156.65], %)
 | 
			
		||||
|> line(end = [306.21, 198.82])
 | 
			
		||||
|> line(end = [306.21, 198.85], tag = $seg01)
 | 
			
		||||
|> angledLine([-65, segLen(seg01)], %)
 | 
			
		||||
|> angledLine(angle = -65, length = segLen(seg01))
 | 
			
		||||
|> line(end = [306.21, 198.87])
 | 
			
		||||
|> angledLine([65, segLen(seg01)], %)`
 | 
			
		||||
|> angledLine(angle = 65, length = segLen(seg01))`
 | 
			
		||||
  it('finds the current segment', async () => {
 | 
			
		||||
    const ast = assertParse(exampleCode)
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -273,7 +273,7 @@ describe('testing addTagForSketchOnFace', () => {
 | 
			
		||||
    it(`can break up chamfers in order to add tags - ${desc}`, async () => {
 | 
			
		||||
      const genCode = (insertCode: string) => `sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([75.8, 317.2], %) // [$startCapTag, $EndCapTag]
 | 
			
		||||
  |> angledLine([0, 268.43], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 268.43, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001) - 90,
 | 
			
		||||
       217.26
 | 
			
		||||
@ -701,16 +701,16 @@ describe('testing getConstraintInfo', () => {
 | 
			
		||||
    const code = `const part001 = startSketchOn(-XZ)
 | 
			
		||||
    |> startProfileAt([0, 0], %)
 | 
			
		||||
    |> line(end = [3, 4])
 | 
			
		||||
    |> angledLine([3.14, 3.14], %)
 | 
			
		||||
    |> angledLine(angle = 3.14, length = 3.14)
 | 
			
		||||
    |> line(endAbsolute = [6.14, 3.14])
 | 
			
		||||
    |> xLine(endAbsolute = 8)
 | 
			
		||||
    |> yLine(endAbsolute = 5)
 | 
			
		||||
    |> yLine(length = 3.14, tag = $a)
 | 
			
		||||
    |> xLine(length = 3.14)
 | 
			
		||||
    |> angledLineOfXLength([3.14, 3.14], %)
 | 
			
		||||
    |> angledLineOfYLength([30, 3], %)
 | 
			
		||||
    |> angledLineToX([12, 12], %)
 | 
			
		||||
    |> angledLineToY([30, 10], %)
 | 
			
		||||
    |> angledLine(angle = 3.14, lengthX = 3.14)
 | 
			
		||||
    |> angledLine(angle = 30, lengthY = 3)
 | 
			
		||||
    |> angledLine(angle = 12, endAbsoluteX = 12)
 | 
			
		||||
    |> angledLine(angle = 30, endAbsoluteY = 10)
 | 
			
		||||
    |> angledLineThatIntersects({
 | 
			
		||||
         angle = 3.14,
 | 
			
		||||
         intersectTag = a,
 | 
			
		||||
@ -858,7 +858,7 @@ describe('testing getConstraintInfo', () => {
 | 
			
		||||
    const code = `const part001 = startSketchOn(-XZ)
 | 
			
		||||
    |> startProfileAt([0, 0], %)
 | 
			
		||||
    |> line(end = [3 + 0, 4 + 0])
 | 
			
		||||
    |> angledLine({ angle = 3.14 + 0, length = 3.14 + 0 }, %)
 | 
			
		||||
    |> angledLine(angle = 3.14 + 0, length = 3.14 + 0 )
 | 
			
		||||
    |> line(endAbsolute = [6.14 + 0, 3.14 + 0])
 | 
			
		||||
    |> xLine(endAbsolute = 8 + 0)
 | 
			
		||||
    |> yLine(endAbsolute = 5 + 0)
 | 
			
		||||
@ -866,8 +866,8 @@ describe('testing getConstraintInfo', () => {
 | 
			
		||||
    |> xLine(length = 3.14 + 0)
 | 
			
		||||
    |> angledLineOfXLength({ angle = 3.14 + 0, length = 3.14 + 0 }, %)
 | 
			
		||||
    |> angledLineOfYLength({ angle = 30 + 0, length = 3 + 0 }, %)
 | 
			
		||||
    |> angledLineToX({ angle = 12.14 + 0, to = 12 + 0 }, %)
 | 
			
		||||
    |> angledLineToY({ angle = 30 + 0, to = 10.14 + 0 }, %)
 | 
			
		||||
    |> angledLine(angle = 12.14 + 0, endAbsoluteX =  12 + 0)
 | 
			
		||||
    |> angledLine(angle = 30 + 0, endAbsoluteY =  10.14 + 0)
 | 
			
		||||
    |> angledLineThatIntersects({
 | 
			
		||||
         angle = 3.14 + 0,
 | 
			
		||||
         intersectTag = a,
 | 
			
		||||
 | 
			
		||||
@ -74,22 +74,22 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
    `  |> startProfileAt([0, 0], %)`,
 | 
			
		||||
    `  |> line(endAbsolute = [1, 1], tag = $abc1)`,
 | 
			
		||||
    `  |> line(end = [-2.04, -0.7], tag = $abc2)`,
 | 
			
		||||
    `  |> angledLine({ angle = 157, length = 1.69 }, %, $abc3)`,
 | 
			
		||||
    `  |> angledLine(angle = 157, length = 1.69 , tag = $abc3)`,
 | 
			
		||||
    `  |> angledLineOfXLength({ angle = 217, length = 0.86 }, %, $abc4)`,
 | 
			
		||||
    `  |> angledLineOfYLength({ angle = 104, length = 1.58 }, %, $abc5)`,
 | 
			
		||||
    `  |> angledLineToX({ angle = 55, to = -2.89 }, %, $abc6)`,
 | 
			
		||||
    `  |> angledLineToY({ angle = 330, to = 2.53 }, %, $abc7)`,
 | 
			
		||||
    `  |> angledLine(angle = 55, endAbsoluteX =  -2.89, tag = $abc6)`,
 | 
			
		||||
    `  |> angledLine(angle = 330, endAbsoluteY =  2.53, tag = $abc7)`,
 | 
			
		||||
    `  |> xLine(length = 1.47, tag = $abc8)`,
 | 
			
		||||
    `  |> yLine(length = 1.57, tag = $abc9)`,
 | 
			
		||||
    `  |> xLine(endAbsolute = 1.49, tag = $abc10)`,
 | 
			
		||||
    `  |> yLine(endAbsolute = 2.64, tag = $abc11)`,
 | 
			
		||||
    `  |> line(endAbsolute = [2.55, 3.58]) // lineTo`,
 | 
			
		||||
    `  |> line(end = [0.73, -0.75])`,
 | 
			
		||||
    `  |> angledLine([63, 1.38], %) // angledLine`,
 | 
			
		||||
    `  |> angledLineOfXLength([319, 1.15], %) // angledLineOfXLength`,
 | 
			
		||||
    `  |> angledLineOfYLength([50, 1.35], %) // angledLineOfYLength`,
 | 
			
		||||
    `  |> angledLineToX([291, 6.66], %) // angledLineToX`,
 | 
			
		||||
    `  |> angledLineToY([228, 2.14], %) // angledLineToY`,
 | 
			
		||||
    `  |> angledLine(angle = 63, length = 1.38) // angledLine`,
 | 
			
		||||
    `  |> angledLine(angle = 319, lengthX = 1.15) // angledLineOfXLength`,
 | 
			
		||||
    `  |> angledLine(angle = 50, lengthY = 1.35) // angledLineOfYLength`,
 | 
			
		||||
    `  |> angledLine(angle = 291, endAbsoluteX = 6.66) // angledLineToX`,
 | 
			
		||||
    `  |> angledLine(angle = 228, endAbsoluteY = 2.14) // angledLineToY`,
 | 
			
		||||
    `  |> xLine(length = -1.33)`,
 | 
			
		||||
    `  |> yLine(length = -1.07)`,
 | 
			
		||||
    `  |> xLine(endAbsolute = 3.27)`,
 | 
			
		||||
@ -145,7 +145,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLine with tag converts to xLine', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLine({ angle = 157, length = 1.69 }, %, $abc3)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 157, length = 1.69 , tag = $abc3)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(length = -1.56, tag = $abc3)'
 | 
			
		||||
@ -157,7 +157,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLine w/o tag converts to xLine', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLine([63, 1.38], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 63, length = 1.38)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(length = 0.63) // angledLine'
 | 
			
		||||
@ -181,7 +181,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLineOfXLength w/o tag converts to xLine', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLineOfXLength([319, 1.15], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 319, lengthX = 1.15)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(length = 1.15) // angledLineOfXLength'
 | 
			
		||||
@ -204,7 +204,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLineOfYLength w/o tag converts to yLine', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLineOfYLength([50, 1.35], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 50, lengthY = 1.35)',
 | 
			
		||||
      constraintType: 'vertical',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'yLine(length = 1.35) // angledLineOfYLength'
 | 
			
		||||
@ -215,7 +215,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLineToX with tag converts to xLineTo', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLineToX({ angle = 55, to = -2.89 }, %, $abc6)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 55, endAbsoluteX =  -2.89, tag = $abc6)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(endAbsolute = -2.89, tag = $abc6)'
 | 
			
		||||
@ -226,7 +226,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLineToX w/o tag converts to xLineTo', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLineToX([291, 6.66], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 291, endAbsoluteX = 6.66)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(endAbsolute = 6.66) // angledLineToX'
 | 
			
		||||
@ -237,7 +237,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLineToY with tag converts to yLineTo', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLineToY({ angle = 330, to = 2.53 }, %, $abc7)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 330, endAbsoluteY =  2.53, tag = $abc7)',
 | 
			
		||||
      constraintType: 'vertical',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'yLine(endAbsolute = 2.53, tag = $abc7)'
 | 
			
		||||
@ -248,7 +248,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo', () => {
 | 
			
		||||
  it('angledLineToY w/o tag converts to yLineTo', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: bigExample,
 | 
			
		||||
      callToSwap: 'angledLineToY([228, 2.14], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 228, endAbsoluteY = 2.14)',
 | 
			
		||||
      constraintType: 'vertical',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'yLine(endAbsolute = 2.14) // angledLineToY'
 | 
			
		||||
@ -274,11 +274,11 @@ describe('testing swapping out sketch calls with xLine/xLineTo while keeping var
 | 
			
		||||
    `  |> line(endAbsolute = [1, 1])`,
 | 
			
		||||
    `  |> line(end = [lineX, 2.13])`,
 | 
			
		||||
    `  |> line(endAbsolute = [lineToX, 2.85])`,
 | 
			
		||||
    `  |> angledLine([angledLineAngle, 1.64], %)`,
 | 
			
		||||
    `  |> angledLineOfXLength([329, angledLineOfXLengthX], %)`,
 | 
			
		||||
    `  |> angledLineOfYLength([222, angledLineOfYLengthY], %)`,
 | 
			
		||||
    `  |> angledLineToX([330, angledLineToXx], %)`,
 | 
			
		||||
    `  |> angledLineToY([217, angledLineToYy], %)`,
 | 
			
		||||
    `  |> angledLine(angle = angledLineAngle, length = 1.64)`,
 | 
			
		||||
    `  |> angledLine(angle = 329, lengthX = angledLineOfXLengthX)`,
 | 
			
		||||
    `  |> angledLine(angle = 222, lengthY = angledLineOfYLengthY)`,
 | 
			
		||||
    `  |> angledLine(angle = 330, endAbsoluteX = angledLineToXx)`,
 | 
			
		||||
    `  |> angledLine(angle = 217, endAbsoluteY = angledLineToYy)`,
 | 
			
		||||
    `  |> line(end = [0.89, -0.1])`,
 | 
			
		||||
  ]
 | 
			
		||||
  const varExample = variablesExampleArr.join('\n')
 | 
			
		||||
@ -307,7 +307,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo while keeping var
 | 
			
		||||
  it('angledLineOfXLength keeps variable when converted to xLine', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: varExample,
 | 
			
		||||
      callToSwap: 'angledLineOfXLength([329, angledLineOfXLengthX], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 329, lengthX = angledLineOfXLengthX)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(length = angledLineOfXLengthX)'
 | 
			
		||||
@ -318,7 +318,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo while keeping var
 | 
			
		||||
  it('angledLineOfYLength keeps variable when converted to yLine', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: varExample,
 | 
			
		||||
      callToSwap: 'angledLineOfYLength([222, angledLineOfYLengthY], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 222, lengthY = angledLineOfYLengthY)',
 | 
			
		||||
      constraintType: 'vertical',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'yLine(length = -angledLineOfYLengthY)'
 | 
			
		||||
@ -329,7 +329,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo while keeping var
 | 
			
		||||
  it('angledLineToX keeps variable when converted to xLineTo', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: varExample,
 | 
			
		||||
      callToSwap: 'angledLineToX([330, angledLineToXx], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 330, endAbsoluteX = angledLineToXx)',
 | 
			
		||||
      constraintType: 'horizontal',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'xLine(endAbsolute = angledLineToXx)'
 | 
			
		||||
@ -340,7 +340,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo while keeping var
 | 
			
		||||
  it('angledLineToY keeps variable when converted to yLineTo', async () => {
 | 
			
		||||
    const { newCode, originalRange } = await testingSwapSketchFnCall({
 | 
			
		||||
      inputCode: varExample,
 | 
			
		||||
      callToSwap: 'angledLineToY([217, angledLineToYy], %)',
 | 
			
		||||
      callToSwap: 'angledLine(angle = 217, endAbsoluteY = angledLineToYy)',
 | 
			
		||||
      constraintType: 'vertical',
 | 
			
		||||
    })
 | 
			
		||||
    const expectedLine = 'yLine(endAbsolute = angledLineToYy)'
 | 
			
		||||
@ -353,7 +353,7 @@ describe('testing swapping out sketch calls with xLine/xLineTo while keeping var
 | 
			
		||||
    const illegalConvert = () =>
 | 
			
		||||
      testingSwapSketchFnCall({
 | 
			
		||||
        inputCode: varExample,
 | 
			
		||||
        callToSwap: 'angledLineToY([217, angledLineToYy], %)',
 | 
			
		||||
        callToSwap: 'angledLine(angle = 217, endAbsoluteY = angledLineToYy)',
 | 
			
		||||
        constraintType: 'horizontal',
 | 
			
		||||
      })
 | 
			
		||||
    await expect(illegalConvert).rejects.toThrowError('no callback helper')
 | 
			
		||||
 | 
			
		||||
@ -100,7 +100,7 @@ export function isSketchVariablesLinked(
 | 
			
		||||
    |> line(end = [myVar, 0.38]) // ❗️ <- cursor in this fn call (the primary)
 | 
			
		||||
    |> line(end = [0.41, baz])
 | 
			
		||||
    |> xLine(length = 0.91)
 | 
			
		||||
    |> angledLine([37, 2], %)
 | 
			
		||||
    |> angledLine(angle = 37, length = 2)
 | 
			
		||||
  const yo = line(end = [myVar, 0.38], tag = part001)
 | 
			
		||||
    |> line(end = [1, 1])
 | 
			
		||||
  const yo2 = line(end = [myVar, 0.38], tag = yo)
 | 
			
		||||
 | 
			
		||||
@ -35,24 +35,24 @@ describe('testing getConstraintType', () => {
 | 
			
		||||
    expect(helper(`line(endAbsolute = [myVar, 5])`)).toBe('xAbsolute')
 | 
			
		||||
  })
 | 
			
		||||
  it('testing angledLine', () => {
 | 
			
		||||
    expect(helper(`angledLine([5, myVar], %)`)).toBe('length')
 | 
			
		||||
    expect(helper(`angledLine([myVar, 5], %)`)).toBe('angle')
 | 
			
		||||
    expect(helper(`angledLine(angle = 5, length = myVar)`)).toBe('length')
 | 
			
		||||
    expect(helper(`angledLine(angle = myVar, length = 5)`)).toBe('angle')
 | 
			
		||||
  })
 | 
			
		||||
  it('testing angledLineOfXLength', () => {
 | 
			
		||||
    expect(helper(`angledLineOfXLength([5, myVar], %)`)).toBe('xRelative')
 | 
			
		||||
    expect(helper(`angledLineOfXLength([myVar, 5], %)`)).toBe('angle')
 | 
			
		||||
    expect(helper(`angledLine(angle = 5, lengthX = myVar)`)).toBe('xRelative')
 | 
			
		||||
    expect(helper(`angledLine(angle = myVar, lengthX = 5)`)).toBe('angle')
 | 
			
		||||
  })
 | 
			
		||||
  it('testing angledLineToX', () => {
 | 
			
		||||
    expect(helper(`angledLineToX([5, myVar], %)`)).toBe('xAbsolute')
 | 
			
		||||
    expect(helper(`angledLineToX([myVar, 5], %)`)).toBe('angle')
 | 
			
		||||
    expect(helper(`angledLine(angle = 5, endAbsoluteX = myVar)`)).toBe('xAbsolute')
 | 
			
		||||
    expect(helper(`angledLine(angle = myVar, endAbsoluteX = 5)`)).toBe('angle')
 | 
			
		||||
  })
 | 
			
		||||
  it('testing angledLineOfYLength', () => {
 | 
			
		||||
    expect(helper(`angledLineOfYLength([5, myVar], %)`)).toBe('yRelative')
 | 
			
		||||
    expect(helper(`angledLineOfYLength([myVar, 5], %)`)).toBe('angle')
 | 
			
		||||
    expect(helper(`angledLine(angle = 5, lengthY = myVar)`)).toBe('yRelative')
 | 
			
		||||
    expect(helper(`angledLine(angle = myVar, lengthY = 5)`)).toBe('angle')
 | 
			
		||||
  })
 | 
			
		||||
  it('testing angledLineToY', () => {
 | 
			
		||||
    expect(helper(`angledLineToY([5, myVar], %)`)).toBe('yAbsolute')
 | 
			
		||||
    expect(helper(`angledLineToY([myVar, 5], %)`)).toBe('angle')
 | 
			
		||||
    expect(helper(`angledLine(angle = 5, endAbsoluteY = myVar)`)).toBe('yAbsolute')
 | 
			
		||||
    expect(helper(`angledLine(angle = myVar, endAbsoluteY = 5)`)).toBe('angle')
 | 
			
		||||
  })
 | 
			
		||||
  const helper2 = getConstraintTypeFromSourceHelper2
 | 
			
		||||
  it('testing xLine', () => {
 | 
			
		||||
@ -174,7 +174,7 @@ describe('testing transformAstForSketchLines for equal length constraint', () =>
 | 
			
		||||
    const expectedModifiedScript = `sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([0, 0], %)
 | 
			
		||||
  |> line(end = [5, 5], tag = $seg01)
 | 
			
		||||
  |> angledLine([112, segLen(seg01)], %)
 | 
			
		||||
  |> angledLine(angle = 112, length = segLen(seg01))
 | 
			
		||||
  |> line(endAbsolute = [profileStartX(%), profileStartY(%)])
 | 
			
		||||
  |> close()
 | 
			
		||||
`
 | 
			
		||||
@ -258,26 +258,26 @@ part001 = startSketchOn(XY)
 | 
			
		||||
  |> line(endAbsolute = [myVar, 1]) // ln-lineTo-xAbsolute should use angleToMatchLengthX helper
 | 
			
		||||
  |> line(endAbsolute = [1, myVar]) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
 | 
			
		||||
  |> line(endAbsolute = [2, 4]) // ln-lineTo-free should become angledLine
 | 
			
		||||
  |> angledLineToX([45, 2.5], %) // ln-angledLineToX-free should become angledLine
 | 
			
		||||
  |> angledLineToX([myAng, 3], %) // ln-angledLineToX-angle should become angledLine
 | 
			
		||||
  |> angledLineToX([45, myVar2], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
 | 
			
		||||
  |> angledLineToY([135, 5], %) // ln-angledLineToY-free should become angledLine
 | 
			
		||||
  |> angledLineToY([myAng2, 4], %) // ln-angledLineToY-angle should become angledLine
 | 
			
		||||
  |> angledLineToY([45, myVar3], %) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
 | 
			
		||||
  |> angledLine(angle = 45, endAbsoluteX = 2.5) // ln-angledLineToX-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = myAng, endAbsoluteX = 3) // ln-angledLineToX-angle should become angledLine
 | 
			
		||||
  |> angledLine(angle = 45, endAbsoluteX = myVar2) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
 | 
			
		||||
  |> angledLine(angle = 135, endAbsoluteY = 5) // ln-angledLineToY-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = myAng2, endAbsoluteY = 4) // ln-angledLineToY-angle should become angledLine
 | 
			
		||||
  |> angledLine(angle = 45, endAbsoluteY = myVar3) // ln-angledLineToY-yAbsolute should use angleToMatchLengthY to get angle
 | 
			
		||||
  |> line(end = [myVar, 1]) // ln-should use legLen for y
 | 
			
		||||
  |> line(end = [myVar, -1]) // ln-legLen but negative
 | 
			
		||||
  |> line(end = [-0.62, -1.54]) // ln-should become angledLine
 | 
			
		||||
  |> angledLine([myVar, 1.04], %) // ln-use segLen for second arg
 | 
			
		||||
  |> angledLine([45, 1.04], %) // ln-segLen again
 | 
			
		||||
  |> angledLineOfXLength([54, 2.35], %) // ln-should be transformed to angledLine
 | 
			
		||||
  |> angledLineOfXLength([50, myVar], %) // ln-should use legAngX to calculate angle
 | 
			
		||||
  |> angledLineOfXLength([209, myVar], %) // ln-same as above but should have + 180 to match original quadrant
 | 
			
		||||
  |> angledLine(angle = myVar, length = 1.04) // ln-use segLen for second arg
 | 
			
		||||
  |> angledLine(angle = 45, length = 1.04) // ln-segLen again
 | 
			
		||||
  |> angledLine(angle = 54, lengthX = 2.35) // ln-should be transformed to angledLine
 | 
			
		||||
  |> angledLine(angle = 50, lengthX = myVar) // ln-should use legAngX to calculate angle
 | 
			
		||||
  |> angledLine(angle = 209, lengthX = myVar) // ln-same as above but should have + 180 to match original quadrant
 | 
			
		||||
  |> line(end = [1, myVar]) // ln-legLen again but yRelative
 | 
			
		||||
  |> line(end = [-1, myVar]) // ln-negative legLen yRelative
 | 
			
		||||
  |> angledLineOfYLength([58, 0.7], %) // ln-angledLineOfYLength-free should become angledLine
 | 
			
		||||
  |> angledLineOfYLength([myAng, 0.7], %) // ln-angledLineOfYLength-angle should become angledLine
 | 
			
		||||
  |> angledLineOfYLength([35, myVar], %) // ln-angledLineOfYLength-yRelative use legAngY
 | 
			
		||||
  |> angledLineOfYLength([305, myVar], %) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
 | 
			
		||||
  |> angledLine(angle = 58, lengthY = 0.7) // ln-angledLineOfYLength-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = myAng, lengthY = 0.7) // ln-angledLineOfYLength-angle should become angledLine
 | 
			
		||||
  |> angledLine(angle = 35, lengthY = myVar) // ln-angledLineOfYLength-yRelative use legAngY
 | 
			
		||||
  |> angledLine(angle = 305, lengthY = myVar) // ln-angledLineOfYLength-yRelative with angle > 90 use binExp
 | 
			
		||||
  |> xLine(length = 1.03) // ln-xLine-free should sub in segLen
 | 
			
		||||
  |> yLine(length = 1.04) // ln-yLine-free should sub in segLen
 | 
			
		||||
  |> xLine(endAbsolute = 30) // ln-xLineTo-free should convert to xLine
 | 
			
		||||
@ -299,15 +299,15 @@ part001 = startSketchOn(XY)
 | 
			
		||||
       -angleToMatchLengthY(seg01, myVar, %),
 | 
			
		||||
       myVar
 | 
			
		||||
     ], %) // ln-lineTo-yAbsolute should use angleToMatchLengthY helper
 | 
			
		||||
  |> angledLine([45, segLen(seg01)], %) // ln-lineTo-free should become angledLine
 | 
			
		||||
  |> angledLine([45, segLen(seg01)], %) // ln-angledLineToX-free should become angledLine
 | 
			
		||||
  |> angledLine([myAng, segLen(seg01)], %) // ln-angledLineToX-angle should become angledLine
 | 
			
		||||
  |> angledLine(angle = 45, length = segLen(seg01)) // ln-lineTo-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = 45, length = segLen(seg01)) // ln-angledLineToX-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = myAng, length = segLen(seg01)) // ln-angledLineToX-angle should become angledLine
 | 
			
		||||
  |> angledLineToX([
 | 
			
		||||
       angleToMatchLengthX(seg01, myVar2, %),
 | 
			
		||||
       myVar2
 | 
			
		||||
     ], %) // ln-angledLineToX-xAbsolute should use angleToMatchLengthX to get angle
 | 
			
		||||
  |> angledLine([-45, segLen(seg01)], %) // ln-angledLineToY-free should become angledLine
 | 
			
		||||
  |> angledLine([myAng2, segLen(seg01)], %) // ln-angledLineToY-angle should become angledLine
 | 
			
		||||
  |> angledLine(angle = -45, length = segLen(seg01)) // ln-angledLineToY-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = myAng2, length = segLen(seg01)) // ln-angledLineToY-angle should become angledLine
 | 
			
		||||
  |> angledLineToY([
 | 
			
		||||
       angleToMatchLengthY(seg01, myVar3, %),
 | 
			
		||||
       myVar3
 | 
			
		||||
@ -320,10 +320,10 @@ part001 = startSketchOn(XY)
 | 
			
		||||
       min(segLen(seg01), myVar),
 | 
			
		||||
       -legLen(segLen(seg01), myVar)
 | 
			
		||||
     ]) // ln-legLen but negative
 | 
			
		||||
  |> angledLine([-112, segLen(seg01)], %) // ln-should become angledLine
 | 
			
		||||
  |> angledLine([myVar, segLen(seg01)], %) // ln-use segLen for second arg
 | 
			
		||||
  |> angledLine([45, segLen(seg01)], %) // ln-segLen again
 | 
			
		||||
  |> angledLine([54, segLen(seg01)], %) // ln-should be transformed to angledLine
 | 
			
		||||
  |> angledLine(angle = -112, length = segLen(seg01)) // ln-should become angledLine
 | 
			
		||||
  |> angledLine(angle = myVar, length = segLen(seg01)) // ln-use segLen for second arg
 | 
			
		||||
  |> angledLine(angle = 45, length = segLen(seg01)) // ln-segLen again
 | 
			
		||||
  |> angledLine(angle = 54, length = segLen(seg01)) // ln-should be transformed to angledLine
 | 
			
		||||
  |> angledLineOfXLength([
 | 
			
		||||
       legAngX(segLen(seg01), myVar),
 | 
			
		||||
       min(segLen(seg01), myVar)
 | 
			
		||||
@ -340,8 +340,8 @@ part001 = startSketchOn(XY)
 | 
			
		||||
       -legLen(segLen(seg01), myVar),
 | 
			
		||||
       min(segLen(seg01), myVar)
 | 
			
		||||
     ]) // ln-negative legLen yRelative
 | 
			
		||||
  |> angledLine([58, segLen(seg01)], %) // ln-angledLineOfYLength-free should become angledLine
 | 
			
		||||
  |> angledLine([myAng, segLen(seg01)], %) // ln-angledLineOfYLength-angle should become angledLine
 | 
			
		||||
  |> angledLine(angle = 58, length = segLen(seg01)) // ln-angledLineOfYLength-free should become angledLine
 | 
			
		||||
  |> angledLine(angle = myAng, length = segLen(seg01)) // ln-angledLineOfYLength-angle should become angledLine
 | 
			
		||||
  |> angledLineOfXLength([
 | 
			
		||||
       legAngY(segLen(seg01), myVar),
 | 
			
		||||
       min(segLen(seg01), myVar)
 | 
			
		||||
@ -404,18 +404,18 @@ part001 = startSketchOn(XY)
 | 
			
		||||
  |> line(endAbsolute = [3, 11]) // select for vertical constraint 3
 | 
			
		||||
  |> line(endAbsolute = [myVar2, 12.63]) // select for horizontal constraint 4
 | 
			
		||||
  |> line(endAbsolute = [4.08, myVar2]) // select for vertical constraint 4
 | 
			
		||||
  |> angledLine([156, 1.34], %) // select for horizontal constraint 5
 | 
			
		||||
  |> angledLine([103, 1.44], %) // select for vertical constraint 5
 | 
			
		||||
  |> angledLine([-178, myVar], %) // select for horizontal constraint 6
 | 
			
		||||
  |> angledLine([129, myVar], %) // select for vertical constraint 6
 | 
			
		||||
  |> angledLineOfXLength([237, 1.05], %) // select for horizontal constraint 7
 | 
			
		||||
  |> angledLineOfYLength([196, 1.11], %) // select for vertical constraint 7
 | 
			
		||||
  |> angledLineOfXLength([194, myVar], %) // select for horizontal constraint 8
 | 
			
		||||
  |> angledLineOfYLength([248, myVar], %) // select for vertical constraint 8
 | 
			
		||||
  |> angledLineToX([202, -10.92], %) // select for horizontal constraint 9
 | 
			
		||||
  |> angledLineToY([223, 7.68], %) // select for vertical constraint 9
 | 
			
		||||
  |> angledLineToX([333, myVar3], %) // select for horizontal constraint 10
 | 
			
		||||
  |> angledLineToY([301, myVar], %) // select for vertical constraint 10
 | 
			
		||||
  |> angledLine(angle = 156, length = 1.34) // select for horizontal constraint 5
 | 
			
		||||
  |> angledLine(angle = 103, length = 1.44) // select for vertical constraint 5
 | 
			
		||||
  |> angledLine(angle = -178, length = myVar) // select for horizontal constraint 6
 | 
			
		||||
  |> angledLine(angle = 129, length = myVar) // select for vertical constraint 6
 | 
			
		||||
  |> angledLine(angle = 237, lengthX = 1.05) // select for horizontal constraint 7
 | 
			
		||||
  |> angledLine(angle = 196, lengthY = 1.11) // select for vertical constraint 7
 | 
			
		||||
  |> angledLine(angle = 194, lengthX = myVar) // select for horizontal constraint 8
 | 
			
		||||
  |> angledLine(angle = 248, lengthY = myVar) // select for vertical constraint 8
 | 
			
		||||
  |> angledLine(angle = 202, endAbsoluteX = -10.92) // select for horizontal constraint 9
 | 
			
		||||
  |> angledLine(angle = 223, endAbsoluteY = 7.68) // select for vertical constraint 9
 | 
			
		||||
  |> angledLine(angle = 333, endAbsoluteX = myVar3) // select for horizontal constraint 10
 | 
			
		||||
  |> angledLine(angle = 301, endAbsoluteY = myVar) // select for vertical constraint 10
 | 
			
		||||
`
 | 
			
		||||
  it('should transform horizontal lines the ast', async () => {
 | 
			
		||||
    const expectModifiedScript = `myVar = 2
 | 
			
		||||
@ -433,17 +433,17 @@ part001 = startSketchOn(XY)
 | 
			
		||||
  |> xLine(endAbsolute = myVar2) // select for horizontal constraint 4
 | 
			
		||||
  |> line(endAbsolute = [4.08, myVar2]) // select for vertical constraint 4
 | 
			
		||||
  |> xLine(length = -1.22) // select for horizontal constraint 5
 | 
			
		||||
  |> angledLine([103, 1.44], %) // select for vertical constraint 5
 | 
			
		||||
  |> angledLine(angle = 103, length = 1.44) // select for vertical constraint 5
 | 
			
		||||
  |> xLine(length = -myVar) // select for horizontal constraint 6
 | 
			
		||||
  |> angledLine([129, myVar], %) // select for vertical constraint 6
 | 
			
		||||
  |> angledLine(angle = 129, length = myVar) // select for vertical constraint 6
 | 
			
		||||
  |> xLine(length = -1.05) // select for horizontal constraint 7
 | 
			
		||||
  |> angledLineOfYLength([196, 1.11], %) // select for vertical constraint 7
 | 
			
		||||
  |> angledLine(angle = 196, lengthY = 1.11) // select for vertical constraint 7
 | 
			
		||||
  |> xLine(length = -myVar) // select for horizontal constraint 8
 | 
			
		||||
  |> angledLineOfYLength([248, myVar], %) // select for vertical constraint 8
 | 
			
		||||
  |> angledLine(angle = 248, lengthY = myVar) // select for vertical constraint 8
 | 
			
		||||
  |> xLine(endAbsolute = -10.92) // select for horizontal constraint 9
 | 
			
		||||
  |> angledLineToY([223, 7.68], %) // select for vertical constraint 9
 | 
			
		||||
  |> angledLine(angle = 223, endAbsoluteY = 7.68) // select for vertical constraint 9
 | 
			
		||||
  |> xLine(endAbsolute = myVar3) // select for horizontal constraint 10
 | 
			
		||||
  |> angledLineToY([301, myVar], %) // select for vertical constraint 10
 | 
			
		||||
  |> angledLine(angle = 301, endAbsoluteY = myVar) // select for vertical constraint 10
 | 
			
		||||
`
 | 
			
		||||
    const ast = assertParse(inputScript)
 | 
			
		||||
 | 
			
		||||
@ -492,17 +492,17 @@ part001 = startSketchOn(XY)
 | 
			
		||||
  |> yLine(endAbsolute = 11) // select for vertical constraint 3
 | 
			
		||||
  |> line(endAbsolute = [myVar2, 12.63]) // select for horizontal constraint 4
 | 
			
		||||
  |> yLine(endAbsolute = myVar2) // select for vertical constraint 4
 | 
			
		||||
  |> angledLine([156, 1.34], %) // select for horizontal constraint 5
 | 
			
		||||
  |> angledLine(angle = 156, length = 1.34) // select for horizontal constraint 5
 | 
			
		||||
  |> yLine(length = 1.4) // select for vertical constraint 5
 | 
			
		||||
  |> angledLine([-178, myVar], %) // select for horizontal constraint 6
 | 
			
		||||
  |> angledLine(angle = -178, length = myVar) // select for horizontal constraint 6
 | 
			
		||||
  |> yLine(length = myVar) // select for vertical constraint 6
 | 
			
		||||
  |> angledLineOfXLength([237, 1.05], %) // select for horizontal constraint 7
 | 
			
		||||
  |> angledLine(angle = 237, lengthX = 1.05) // select for horizontal constraint 7
 | 
			
		||||
  |> yLine(length = -1.11) // select for vertical constraint 7
 | 
			
		||||
  |> angledLineOfXLength([194, myVar], %) // select for horizontal constraint 8
 | 
			
		||||
  |> angledLine(angle = 194, lengthX = myVar) // select for horizontal constraint 8
 | 
			
		||||
  |> yLine(length = -myVar) // select for vertical constraint 8
 | 
			
		||||
  |> angledLineToX([202, -10.92], %) // select for horizontal constraint 9
 | 
			
		||||
  |> angledLine(angle = 202, endAbsoluteX = -10.92) // select for horizontal constraint 9
 | 
			
		||||
  |> yLine(endAbsolute = 7.68) // select for vertical constraint 9
 | 
			
		||||
  |> angledLineToX([333, myVar3], %) // select for horizontal constraint 10
 | 
			
		||||
  |> angledLine(angle = 333, endAbsoluteX = myVar3) // select for horizontal constraint 10
 | 
			
		||||
  |> yLine(endAbsolute = myVar) // select for vertical constraint 10
 | 
			
		||||
`
 | 
			
		||||
    const ast = assertParse(inputScript)
 | 
			
		||||
@ -659,12 +659,12 @@ part001 = startSketchOn(XY)
 | 
			
		||||
  |> xLine(length = 4.4) // partial
 | 
			
		||||
  |> yLine(length = -1) // partial
 | 
			
		||||
  |> xLine(length = -4.2 + 0) // full
 | 
			
		||||
  |> angledLine([segAng(seg01bing) + 180, 1.79], %) // partial
 | 
			
		||||
  |> angledLine(angle = segAng(seg01bing) + 180, length = 1.79) // partial
 | 
			
		||||
  |> line(end = [1.44, -0.74]) // free
 | 
			
		||||
  |> xLine(length = 3.36) // partial
 | 
			
		||||
  |> line(end = [1.49, 1.06]) // free
 | 
			
		||||
  |> xLine(length = -3.43 + 0) // full
 | 
			
		||||
  |> angledLineOfXLength([243 + 0, 1.2 + 0], %) // full`
 | 
			
		||||
  |> angledLine(angle = 243 + 0, lengthX = 1.2 + 0) // full`
 | 
			
		||||
    const ast = assertParse(code)
 | 
			
		||||
    const constraintLevels: ConstraintLevel[] = ['full', 'partial', 'free']
 | 
			
		||||
    constraintLevels.forEach((constraintLevel) => {
 | 
			
		||||
 | 
			
		||||
@ -19,8 +19,8 @@ describe('library rectangleTool helper functions', () => {
 | 
			
		||||
      // Base source code that will be edited in place
 | 
			
		||||
      const sourceCode = `sketch001 = startSketchOn(XZ)
 | 
			
		||||
|> startProfileAt([120.37, 162.76], %)
 | 
			
		||||
|> angledLine([0, 0], %, $rectangleSegmentA001)
 | 
			
		||||
|> angledLine([segAng(rectangleSegmentA001) + 90, 0], %, $rectangleSegmentB001)
 | 
			
		||||
|> angledLine(angle = 0, length = 0, tag = $rectangleSegmentA001)
 | 
			
		||||
|> angledLine(angle = segAng(rectangleSegmentA001) + 90, length = 0, tag = $rectangleSegmentB001)
 | 
			
		||||
|> angledLine([
 | 
			
		||||
segAng(rectangleSegmentA001),
 | 
			
		||||
-segLen(rectangleSegmentA001)
 | 
			
		||||
@ -72,8 +72,8 @@ segAng(rectangleSegmentA001),
 | 
			
		||||
      // ast is edited in place from the updateCenterRectangleSketch
 | 
			
		||||
      const expectedSourceCode = `sketch001 = startSketchOn(XZ)
 | 
			
		||||
  |> startProfileAt([120.37, 80], %)
 | 
			
		||||
  |> angledLine([0, 0], %, $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine([segAng(rectangleSegmentA001) + 90, 0], %, $rectangleSegmentB001)
 | 
			
		||||
  |> angledLine(angle = 0, length = 0, tag = $rectangleSegmentA001)
 | 
			
		||||
  |> angledLine(angle = segAng(rectangleSegmentA001) + 90, length = 0, tag = $rectangleSegmentB001)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA001),
 | 
			
		||||
       -segLen(rectangleSegmentA001)
 | 
			
		||||
 | 
			
		||||
@ -30,9 +30,9 @@ import { roundOff } from '@src/lib/utils'
 | 
			
		||||
 * Returns AST expressions for this KCL code:
 | 
			
		||||
 * const yo = startSketchOn(XY)
 | 
			
		||||
 *  |> startProfileAt([0, 0], %)
 | 
			
		||||
 *  |> angledLine([0, 0], %, $a)
 | 
			
		||||
 *  |> angledLine([segAng(a) - 90, 0], %, $b)
 | 
			
		||||
 *  |> angledLine([segAng(a), -segLen(a)], %, $c)
 | 
			
		||||
 *  |> angledLine(angle = 0, length = 0, tag = $a)
 | 
			
		||||
 *  |> angledLine(angle = segAng(a) - 90, length = 0, tag = $b)
 | 
			
		||||
 *  |> angledLine(angle = segAng(a), length = -segLen(a), tag = $c)
 | 
			
		||||
 *  |> close()
 | 
			
		||||
 */
 | 
			
		||||
export const getRectangleCallExpressions = (
 | 
			
		||||
 | 
			
		||||
@ -40,7 +40,7 @@ profile006 = circle(sketch005,
 | 
			
		||||
)
 | 
			
		||||
sketch004 = startSketchOn(extrude001, seg02)
 | 
			
		||||
profile005 = startProfileAt([36.1, 174.49], sketch004)
 | 
			
		||||
  |> angledLine([0, 22.33], %, $rectangleSegmentA003)
 | 
			
		||||
  |> angledLine(angle = 0, length = 22.33, tag = $rectangleSegmentA003)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA003) - 90,
 | 
			
		||||
       155.27
 | 
			
		||||
@ -53,7 +53,7 @@ profile005 = startProfileAt([36.1, 174.49], sketch004)
 | 
			
		||||
  |> close()
 | 
			
		||||
sketch003 = startSketchOn(extrude001, seg02)
 | 
			
		||||
profile003 = startProfileAt([-115.59, 439.4], sketch003)
 | 
			
		||||
  |> angledLine([0, 130.08], %, $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine(angle = 0, length = 130.08, tag = $rectangleSegmentA002)
 | 
			
		||||
  |> angledLine([
 | 
			
		||||
       segAng(rectangleSegmentA002) - 90,
 | 
			
		||||
       123.84
 | 
			
		||||
 | 
			
		||||
		Reference in New Issue
	
	Block a user