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

View File

@ -1,5 +1,5 @@
import { abstractSyntaxTree } from '../abstractSyntaxTree' import { abstractSyntaxTree } from '../abstractSyntaxTree'
import { executor } from '../executor' import { executor, SketchGroup } from '../executor'
import { lexer } from '../tokeniser' import { lexer } from '../tokeniser'
import { import {
ConstraintType, ConstraintType,
@ -8,6 +8,7 @@ import {
} from './sketchcombos' } from './sketchcombos'
import { recast } from '../recast' import { recast } from '../recast'
import { initPromise } from '../rust' import { initPromise } from '../rust'
import { getSketchSegmentFromSourceRange } from './sketchConstraints'
beforeAll(() => initPromise) beforeAll(() => initPromise)
@ -362,3 +363,35 @@ describe('testing swaping out sketch calls with xLine/xLineTo while keeping vari
expect(illegalConvert).toThrowError() 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 { SketchGroup } from '../executor'
import { InternalFn } from './stdTypes' import { InternalFn } from './stdTypes'
export function getSketchSegmentIndexFromSourceRange( export function getSketchSegmentFromSourceRange(
sketchGroup: SketchGroup, sketchGroup: SketchGroup,
[rangeStart, rangeEnd]: Range [rangeStart, rangeEnd]: Range
): SketchGroup['value'][number] { ): 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( const line = sketchGroup.value.find(
({ __geoMeta: { sourceRange } }) => ({ __geoMeta: { sourceRange } }) =>
sourceRange[0] <= rangeStart && sourceRange[1] >= rangeEnd sourceRange[0] <= rangeStart && sourceRange[1] >= rangeEnd

View File

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