getSketchSegmentIndexFromSourceRange bug fix (#75)

* getSketchSegmentIndexFromSourceRange bug fix

* test was verbose

* rename function
This commit is contained in:
Kurt Hutten
2023-03-20 07:09:19 +11:00
committed by GitHub
parent 1ac3713a79
commit 37ebfd072c
4 changed files with 49 additions and 10 deletions

View File

@ -41,7 +41,7 @@ import {
findUniqueName,
} from '../modifyAst'
import { roundOff, getLength, getAngle } from '../../lib/utils'
import { getSketchSegmentIndexFromSourceRange } from './sketchConstraints'
import { getSketchSegmentFromSourceRange } from './sketchConstraints'
import {
intersectionWithParallelLine,
perpendicularDistance,
@ -1317,7 +1317,7 @@ export function addNewSketchLn({
node,
defaultLinePath
).node
const { from } = getSketchSegmentIndexFromSourceRange(sketch, [
const { from } = getSketchSegmentFromSourceRange(sketch, [
defaultLine.start,
defaultLine.end,
])

View File

@ -1,5 +1,5 @@
import { abstractSyntaxTree } from '../abstractSyntaxTree'
import { executor } from '../executor'
import { executor, SketchGroup } from '../executor'
import { lexer } from '../tokeniser'
import {
ConstraintType,
@ -8,6 +8,7 @@ import {
} from './sketchcombos'
import { recast } from '../recast'
import { initPromise } from '../rust'
import { getSketchSegmentFromSourceRange } from './sketchConstraints'
beforeAll(() => initPromise)
@ -362,3 +363,35 @@ describe('testing swaping out sketch calls with xLine/xLineTo while keeping vari
expect(illegalConvert).toThrowError()
})
})
describe('testing getSketchSegmentIndexFromSourceRange', () => {
const code = `
const part001 = startSketchAt([0, 0.04]) // segment-in-start
|> line([0, 0.4], %)
|> xLine(3.48, %)
|> line([2.14, 1.35], %) // normal-segment
|> xLine(3.54, %)
show(part001)`
it('normal case works', () => {
const programMemory = executor(abstractSyntaxTree(lexer(code)))
const index = code.indexOf('// normal-segment') - 7
const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange(
programMemory.root['part001'] as SketchGroup,
[index, index]
)
expect(segment).toEqual({
type: 'toPoint',
to: [5.62, 1.79],
from: [3.48, 0.44],
})
})
it('verify it works when the segment is in the `start` property', () => {
const programMemory = executor(abstractSyntaxTree(lexer(code)))
const index = code.indexOf('// segment-in-start') - 7
const { __geoMeta, ...segment } = getSketchSegmentFromSourceRange(
programMemory.root['part001'] as SketchGroup,
[index, index]
)
expect(segment).toEqual({ type: 'base', to: [0, 0.04], from: [0, 0.04] })
})
})

View File

@ -8,10 +8,19 @@ import {
import { SketchGroup } from '../executor'
import { InternalFn } from './stdTypes'
export function getSketchSegmentIndexFromSourceRange(
export function getSketchSegmentFromSourceRange(
sketchGroup: SketchGroup,
[rangeStart, rangeEnd]: Range
): SketchGroup['value'][number] {
const startSourceRange = sketchGroup.start?.__geoMeta.sourceRange
if (
startSourceRange &&
startSourceRange[0] <= rangeStart &&
startSourceRange[1] >= rangeEnd &&
sketchGroup.start
)
return sketchGroup.start
const line = sketchGroup.value.find(
({ __geoMeta: { sourceRange } }) =>
sourceRange[0] <= rangeStart && sourceRange[1] >= rangeEnd

View File

@ -24,7 +24,7 @@ import {
} from '../modifyAst'
import { createFirstArg, getFirstArg, replaceSketchLine } from './sketch'
import { ProgramMemory } from '../executor'
import { getSketchSegmentIndexFromSourceRange } from './sketchConstraints'
import { getSketchSegmentFromSourceRange } from './sketchConstraints'
import { getAngle, roundOff } from '../../lib/utils'
type LineInputsType =
@ -1157,12 +1157,9 @@ export function transformAstSketchLines({
const sketchGroup = programMemory.root?.[varName]
if (!sketchGroup || sketchGroup.type !== 'sketchGroup')
throw new Error('not a sketch group')
const seg = getSketchSegmentIndexFromSourceRange(sketchGroup, range)
const seg = getSketchSegmentFromSourceRange(sketchGroup, range)
const referencedSegment = referencedSegmentRange
? getSketchSegmentIndexFromSourceRange(
sketchGroup,
referencedSegmentRange
)
? getSketchSegmentFromSourceRange(sketchGroup, referencedSegmentRange)
: sketchGroup.value.find((path) => path.name === referenceSegName)
const { to, from } = seg
const { modifiedAst, valueUsedInTransform } = replaceSketchLine({