Compare commits
2 Commits
nrc-refact
...
kurt-recta
Author | SHA1 | Date | |
---|---|---|---|
3d75576215 | |||
ae69b6f9b6 |
@ -152,6 +152,29 @@ export const Toolbar = () => {
|
||||
Tangential Arc
|
||||
</ActionButton>
|
||||
</li>
|
||||
<li className="contents" key="rectangle-button">
|
||||
<ActionButton
|
||||
Element="button"
|
||||
onClick={() =>
|
||||
state.matches('Sketch.Rectangle')
|
||||
? send('CancelSketch')
|
||||
: send('Equip rectangle tool')
|
||||
}
|
||||
aria-pressed={state.matches('Sketch.Rectangle')}
|
||||
className="pressed:bg-energy-10/20 dark:pressed:bg-energy-80"
|
||||
icon={{
|
||||
icon: 'arc',
|
||||
bgClassName,
|
||||
}}
|
||||
disabled={
|
||||
(!state.can('Equip rectangle tool') &&
|
||||
!state.matches('Sketch.Rectangle')) ||
|
||||
disableAllButtons
|
||||
}
|
||||
>
|
||||
Rectangle
|
||||
</ActionButton>
|
||||
</li>
|
||||
</>
|
||||
)}
|
||||
{state.matches('Sketch.SketchIdle') &&
|
||||
|
@ -37,6 +37,7 @@ import {
|
||||
} from './sceneInfra'
|
||||
import { isQuaternionVertical, quaternionFromUpNForward } from './helpers'
|
||||
import {
|
||||
ArrayExpression,
|
||||
CallExpression,
|
||||
getTangentialArcToInfo,
|
||||
parse,
|
||||
@ -70,9 +71,12 @@ import {
|
||||
import { throttle } from 'lib/utils'
|
||||
import {
|
||||
createArrayExpression,
|
||||
createBinaryExpression,
|
||||
createCallExpressionStdLib,
|
||||
createLiteral,
|
||||
createPipeExpression,
|
||||
createPipeSubstitution,
|
||||
createUnaryExpression,
|
||||
} from 'lang/modifyAst'
|
||||
import {
|
||||
getEventForSegmentSelection,
|
||||
@ -343,6 +347,7 @@ export class SceneEntities {
|
||||
this.activeSegments[JSON.stringify(segPathToNode)] = _profileStart
|
||||
|
||||
sketchGroup.value.forEach((segment, index) => {
|
||||
// problem here
|
||||
let segPathToNode = getNodePathFromSourceRange(
|
||||
kclManager.ast,
|
||||
segment.__geoMeta.sourceRange
|
||||
@ -353,8 +358,9 @@ export class SceneEntities {
|
||||
) {
|
||||
const previousSegment =
|
||||
sketchGroup.value[index - 1] || sketchGroup.start
|
||||
console.log('previousSegment', previousSegment)
|
||||
const previousSegmentPathToNode = getNodePathFromSourceRange(
|
||||
kclManager.ast,
|
||||
maybeModdedAst,
|
||||
previousSegment.__geoMeta.sourceRange
|
||||
)
|
||||
const bodyIndex = previousSegmentPathToNode[1][0]
|
||||
@ -549,6 +555,156 @@ export class SceneEntities {
|
||||
...mouseEnterLeaveCallbacks(),
|
||||
})
|
||||
}
|
||||
setupDraftRectangle = async (
|
||||
sketchPathToNode: PathToNode,
|
||||
forward: [number, number, number],
|
||||
up: [number, number, number],
|
||||
origin: [number, number, number],
|
||||
shouldTearDown = true
|
||||
) => {
|
||||
let _ast = JSON.parse(JSON.stringify(kclManager.ast))
|
||||
|
||||
const variableDeclarationName =
|
||||
getNodeFromPath<VariableDeclaration>(
|
||||
_ast,
|
||||
sketchPathToNode || [],
|
||||
'VariableDeclaration'
|
||||
)?.node?.declarations?.[0]?.id?.name || ''
|
||||
const sg = kclManager.programMemory.root[
|
||||
variableDeclarationName
|
||||
] as SketchGroup
|
||||
|
||||
/**
|
||||
* We want to generate this kind of code mod:
|
||||
* const yo = startSketchOn('XY')
|
||||
* |> startProfileAt([0, 0], %)
|
||||
* |> angledLine([0, 0], %, 'a')
|
||||
* |> angledLine([segAng('a', %) - 90, 0], %, 'b')
|
||||
* |> angledLine([segAng('a', %), -segLen('a', %)], %, 'c')
|
||||
* |> close(%)
|
||||
*/
|
||||
// Here is that kcl code as an array of call expressions
|
||||
const callExpressions = [
|
||||
createCallExpressionStdLib('startProfileAt', [
|
||||
createArrayExpression([createLiteral(0), createLiteral(0)]),
|
||||
createPipeSubstitution(),
|
||||
]),
|
||||
createCallExpressionStdLib('angledLine', [
|
||||
createArrayExpression([
|
||||
createLiteral(0), // 0 deg
|
||||
createLiteral(10), // This will be the width of the rectangle
|
||||
]),
|
||||
createPipeSubstitution(),
|
||||
createLiteral('a'),
|
||||
]),
|
||||
createCallExpressionStdLib('angledLine', [
|
||||
createArrayExpression([
|
||||
createBinaryExpression([
|
||||
createCallExpressionStdLib('segAng', [
|
||||
createLiteral('a'),
|
||||
createPipeSubstitution(),
|
||||
]),
|
||||
'+',
|
||||
createLiteral(90),
|
||||
]), // 90 offset from the previous line
|
||||
createLiteral(5), // This will be the height of the rectangle
|
||||
]),
|
||||
createPipeSubstitution(),
|
||||
createLiteral('b'),
|
||||
]),
|
||||
createCallExpressionStdLib('angledLine', [
|
||||
createArrayExpression([
|
||||
createCallExpressionStdLib('segAng', [
|
||||
createLiteral('a'),
|
||||
createPipeSubstitution(),
|
||||
]), // same angle as the first line
|
||||
createUnaryExpression(
|
||||
createCallExpressionStdLib('segLen', [
|
||||
createLiteral('a'),
|
||||
createPipeSubstitution(),
|
||||
]),
|
||||
'-'
|
||||
), // negative height
|
||||
]),
|
||||
createPipeSubstitution(),
|
||||
createLiteral('c'),
|
||||
]),
|
||||
createCallExpressionStdLib('close', [createPipeSubstitution()]),
|
||||
]
|
||||
|
||||
const startSketchOn = getNodeFromPath<VariableDeclaration>(
|
||||
_ast,
|
||||
sketchPathToNode || [],
|
||||
'VariableDeclaration'
|
||||
)?.node?.declarations
|
||||
|
||||
const startSketchOnInit = startSketchOn?.[0]?.init
|
||||
startSketchOn[0].init = createPipeExpression([
|
||||
startSketchOnInit,
|
||||
...callExpressions,
|
||||
])
|
||||
|
||||
_ast = parse(recast(_ast))
|
||||
|
||||
// if (shouldTearDown) await this.tearDownSketch({ removeAxis: false })
|
||||
console.log('sketchPathToNode for setupSketch', sketchPathToNode)
|
||||
const { truncatedAst, programMemoryOverride, sketchGroup } =
|
||||
await this.setupSketch({
|
||||
sketchPathToNode,
|
||||
forward,
|
||||
up,
|
||||
position: origin,
|
||||
maybeModdedAst: _ast,
|
||||
draftExpressionsIndices: { start: 0, end: 3 },
|
||||
})
|
||||
|
||||
sceneInfra.setCallbacks({
|
||||
onMove: async (args) => {
|
||||
// Update the width and height of the draft rectangle
|
||||
const pathToNodeTwo = JSON.parse(JSON.stringify(sketchPathToNode))
|
||||
pathToNodeTwo[1][0] = 0
|
||||
|
||||
const sketchInit = getNodeFromPath<VariableDeclaration>(
|
||||
_ast,
|
||||
pathToNodeTwo || [],
|
||||
'VariableDeclaration'
|
||||
)?.node?.declarations?.[0]?.init
|
||||
|
||||
if (sketchInit.type === 'PipeExpression') {
|
||||
;(
|
||||
(sketchInit.body[2] as CallExpression)
|
||||
.arguments[0] as ArrayExpression
|
||||
).elements[1] = createLiteral(args.intersectionPoint.twoD.x)
|
||||
;(
|
||||
(sketchInit.body[3] as CallExpression)
|
||||
.arguments[0] as ArrayExpression
|
||||
).elements[1] = createLiteral(args.intersectionPoint.twoD.y)
|
||||
}
|
||||
const { programMemory } = await executeAst({
|
||||
ast: _ast,
|
||||
useFakeExecutor: true,
|
||||
engineCommandManager: this.engineCommandManager,
|
||||
programMemoryOverride,
|
||||
})
|
||||
this.sceneProgramMemory = programMemory
|
||||
const sketchGroup = programMemory.root[
|
||||
variableDeclarationName
|
||||
] as SketchGroup
|
||||
const sgPaths = sketchGroup.value
|
||||
const orthoFactor = orthoScale(sceneInfra.camControls.camera)
|
||||
|
||||
|
||||
this.updateSegment(sketchGroup.start, 0,0, _ast, orthoFactor, sketchGroup)
|
||||
const yo: any[] = []
|
||||
sgPaths.forEach((seg, index) => {
|
||||
yo.push(seg.from, seg.to)
|
||||
this.updateSegment(seg, index, 0, _ast, orthoFactor, sketchGroup)
|
||||
})
|
||||
console.log('from and to', JSON.stringify(yo))
|
||||
},
|
||||
onClick: async (args) => {},
|
||||
})
|
||||
}
|
||||
setupSketchIdleCallbacks = (pathToNode: PathToNode) => {
|
||||
sceneInfra.setCallbacks({
|
||||
onDrag: ({ selected, intersectionPoint, mouseEvent, intersects }) => {
|
||||
@ -691,53 +847,62 @@ export class SceneEntities {
|
||||
const sgPaths = sketchGroup.value
|
||||
const orthoFactor = orthoScale(sceneInfra.camControls.camera)
|
||||
|
||||
const updateSegment = (
|
||||
segment: Path | SketchGroup['start'],
|
||||
index: number
|
||||
) => {
|
||||
const segPathToNode = getNodePathFromSourceRange(
|
||||
modifiedAst,
|
||||
segment.__geoMeta.sourceRange
|
||||
)
|
||||
const originalPathToNodeStr = JSON.stringify(segPathToNode)
|
||||
segPathToNode[1][0] = varDecIndex
|
||||
const pathToNodeStr = JSON.stringify(segPathToNode)
|
||||
// more hacks to hopefully be solved by proper pathToNode info in memory/sketchGroup segments
|
||||
const group =
|
||||
this.activeSegments[pathToNodeStr] ||
|
||||
this.activeSegments[originalPathToNodeStr]
|
||||
// const prevSegment = sketchGroup.slice(index - 1)[0]
|
||||
const type = group?.userData?.type
|
||||
const factor =
|
||||
(sceneInfra.camControls.camera instanceof OrthographicCamera
|
||||
? orthoFactor
|
||||
: perspScale(sceneInfra.camControls.camera, group)) /
|
||||
sceneInfra._baseUnitMultiplier
|
||||
if (type === TANGENTIAL_ARC_TO_SEGMENT) {
|
||||
this.updateTangentialArcToSegment({
|
||||
prevSegment: sgPaths[index - 1],
|
||||
from: segment.from,
|
||||
to: segment.to,
|
||||
group: group,
|
||||
scale: factor,
|
||||
})
|
||||
} else if (type === STRAIGHT_SEGMENT) {
|
||||
this.updateStraightSegment({
|
||||
from: segment.from,
|
||||
to: segment.to,
|
||||
group: group,
|
||||
scale: factor,
|
||||
})
|
||||
} else if (type === PROFILE_START) {
|
||||
group.position.set(segment.from[0], segment.from[1], 0)
|
||||
group.scale.set(factor, factor, factor)
|
||||
}
|
||||
}
|
||||
updateSegment(sketchGroup.start, 0)
|
||||
sgPaths.forEach(updateSegment)
|
||||
|
||||
this.updateSegment(sketchGroup.start, 0,varDecIndex, modifiedAst, orthoFactor, sketchGroup)
|
||||
sgPaths.forEach((group, index) => this.updateSegment(group, index, varDecIndex, modifiedAst, orthoFactor, sketchGroup))
|
||||
})()
|
||||
}
|
||||
|
||||
updateSegment = (
|
||||
segment: Path | SketchGroup['start'],
|
||||
index: number,
|
||||
varDecIndex: number,
|
||||
modifiedAst: Program,
|
||||
orthoFactor: number,
|
||||
sketchGroup: SketchGroup,
|
||||
) => {
|
||||
const segPathToNode = getNodePathFromSourceRange(
|
||||
modifiedAst,
|
||||
segment.__geoMeta.sourceRange
|
||||
)
|
||||
const sgPaths = sketchGroup.value
|
||||
const originalPathToNodeStr = JSON.stringify(segPathToNode)
|
||||
segPathToNode[1][0] = varDecIndex
|
||||
const pathToNodeStr = JSON.stringify(segPathToNode)
|
||||
console.log('newpathToNodeStr', pathToNodeStr)
|
||||
console.log('originalPathToNodeStr', originalPathToNodeStr)
|
||||
// more hacks to hopefully be solved by proper pathToNode info in memory/sketchGroup segments
|
||||
const group =
|
||||
this.activeSegments[pathToNodeStr] ||
|
||||
this.activeSegments[originalPathToNodeStr]
|
||||
// const prevSegment = sketchGroup.slice(index - 1)[0]
|
||||
const type = group?.userData?.type
|
||||
const factor =
|
||||
(sceneInfra.camControls.camera instanceof OrthographicCamera
|
||||
? orthoFactor
|
||||
: perspScale(sceneInfra.camControls.camera, group)) /
|
||||
sceneInfra._baseUnitMultiplier
|
||||
if (type === TANGENTIAL_ARC_TO_SEGMENT) {
|
||||
this.updateTangentialArcToSegment({
|
||||
prevSegment: sgPaths[index - 1],
|
||||
from: segment.from,
|
||||
to: segment.to,
|
||||
group: group,
|
||||
scale: factor,
|
||||
})
|
||||
} else if (type === STRAIGHT_SEGMENT) {
|
||||
this.updateStraightSegment({
|
||||
from: segment.from,
|
||||
to: segment.to,
|
||||
group,
|
||||
scale: factor,
|
||||
})
|
||||
} else if (type === PROFILE_START) {
|
||||
group.position.set(segment.from[0], segment.from[1], 0)
|
||||
group.scale.set(factor, factor, factor)
|
||||
}
|
||||
}
|
||||
|
||||
updateTangentialArcToSegment({
|
||||
prevSegment,
|
||||
from,
|
||||
@ -826,6 +991,9 @@ export class SceneEntities {
|
||||
}) {
|
||||
group.userData.from = from
|
||||
group.userData.to = to
|
||||
|
||||
console.log('updating the following', group, from, to)
|
||||
|
||||
const shape = new Shape()
|
||||
shape.moveTo(0, -0.08 * scale)
|
||||
shape.lineTo(0, 0.08 * scale) // The width of the line
|
||||
|
@ -118,6 +118,7 @@ export type ModelingMachineEvent =
|
||||
| { type: 'Extrude'; data?: ModelingCommandSchema['Extrude'] }
|
||||
| { type: 'Equip Line tool' }
|
||||
| { type: 'Equip tangential arc to' }
|
||||
| { type: 'Equip rectangle tool' }
|
||||
| {
|
||||
type: 'done.invoke.animate-to-face' | 'done.invoke.animate-to-sketch'
|
||||
data: SketchDetails
|
||||
@ -127,7 +128,7 @@ export type MoveDesc = { line: number; snippet: string }
|
||||
|
||||
export const modelingMachine = createMachine(
|
||||
{
|
||||
/** @xstate-layout N4IgpgJg5mDOIC5QFkD2EwBsCWA7KAxAMICGuAxlgNoAMAuoqAA6qzYAu2qujIAHogC0AdgCsAZgB04gEyjhADnEA2GgoUAWJQBoQAT0QBGGuICckmoZkbTM42YWKAvk91oMOfAQDKYdgAJYLDByTm5aBiQQFjYwniiBBFtpGhlxDRphGg1ZURlhXQMEcRLDSVF5UwV84XEK8Rc3dCw8KElsCEwwHz9A4NCuXAjeGI5B3kTBLWFJDWV5hVSZZTrlBUKjS1FZiUrDeWVDasaQdxb8ds7ugFFcdjAAJ0CAaz9yAAthqNG4iaFlmZWZSmZRaKyGQzKYQaDYIGSmDSzdKyDSGcQ0KrAk5nTxtDpdAi3e5PWCvdgfKiGSLMVhjbh-BCCaw0WaQrZqdGLAr6RAZGSSWzCZSiIEKNFi5TY5q4y4E658dgPACuGC+NNi4wSQgqM3hNFEwNEGlEYthENELJkCjWplMFpsGlRUo8rVlNz4LAe7DV0Vpvy1jKtCkkVuZMjsDpNsOEwjKUIkcxNqWhomd5za3jJH2IZEomEzb0+9BGfs1oESEOtkmM0K0ahMplkZqOZUrYrRlgUJrTMoL5Pekj7HwAklcegEgl0BuFi99S-SA4ZoWUdWsTSLlsozZlzNkZPrG0a5F2e66hwPz6OCcgSK8+lAALZgO7+ABuj045BImB9PzL-CMeFW2qTQhU0ZMzVRKR0RoVJ6nyJQNFPC5z0HLN3ivbobzvIJH2fAJ3lQB5sAAL24dhv1-ed4nLQDoUkVRrX1CF8ihGQzXECFymNLJIU4-U8mQjN0LQwtMOIbhYEVEg8H8QjiLIu5v38CBsCk3MwCojUF1ohArCNCwNDSDFENMI51h5OEzGUCwKgtbJRDMtEhNE-tXJHMciEk6TZPfL1sC-TAVLUiiKE02d1TpGiAL05ZgztK0RVBYxNHYyzw1qcprCODQY2EZYjRc1DL087yHhk3B-AAQQAIW8fwAA0tKihkrC7JExEMGxOPhNJYXhAy7ShRY4NMWoGlcU5pTPESSoJLzcCk8rZNq+qAE1mv9XS2u2aw7GUOR9mFA7YU5YN8rstlHEdIrZvQ8SFqWir-DIKAuk2-8K2RaQlBA+QxWEUx+otXV1zyg1AbG27C3cjDSsWnzKq6fB2CLalfW06KvvEGYVANDE0TSfZ+sOc7gVRQHHSUKFobcubukexH-CYR4WdwVTyCVTASCeVT1LCj6dJiqwrVmW0eoyI5VC3dKxURWMqjG-LHVy1NJpxGaYfpiSEeWyr5NI8jv0wPQXpwKAhgijGWsXZZ+S7TQu3SI0aBWM0kpDO1QPysQVgmpoXRQu6xPhp7fI-ALjdN79sAtwWsbo8wcitQGkrMEUzQO7YTTGzFqiqWpaY+WGHrK57YFwEgmH8dhUEa+PWs4qRlnERYFDG6ozH6vcQzkeZ5n1RxwyLi97tDpmK6rmu642q2-yFr60QsIVOJjHHjBhdKupmI0h8cpc5hyEeS-HvX-DAABHJVlORqBUYb23G3KbfAayPIJG5Iol3RJETFg-VjqmGPtrRmZ8mA82NtQOe1FG75AsOGFY+xGwU03l-RsMwTCcUOLaTIag1YB3TLDE+80y6yQeGAB8qB3z+HIKQu4sAH7bWsMGQ41gDRWlRCacQZolBlEsMCfcOROQHWAWPAkAAlMAggwB8BCEqe4jDhZ1CkGiVQ+kdQGlhCCGyjk14misGZbIoiQ5yivtgauAAZPAYBp6oB-NAzGrV246JKKCW0CZ1CwiUNnTIe05CJghMY-s4lrhmOrqFGAdxsDKR5uQaeijEj7WDK3A0WD-rKObJYSQYFVDpMdKCY+VUADuMkCJEUNkpIKfNQqUH8HgAAZqgAgEBuBgHaLgV8qBXiSBgOwQQBtFIUUwIIBpqAEmIGMoifJGQxpmCVtw9KqJzBdlDFg2wENCklI4HJcpgzlLVI0nU3AjSCCPAeERSQTBubsEaQ8B8PS-D9N2UbYZozxlWX1NWLqqI0TGitGNfqrd+TZFdrBOorFDCbNKW+COgVgr81qaM5prT2mdO6b0wQflPzfhGccsZDiba6SJvyNEih7BQkMIKfqVopCOHfnYUo+UoXbKxZHKpIVDlIrORcq5JAblEXuRi1lgVcWNPecSyQix5D7zEJoalRlqzHVSK3ECShmUBFWo1I5JyWm4DaXgNFbSMUkAAEawEEHwUV+L0bzwTlZSE2SDqwXDLsCyRR4QHWrBkVEoJZAHULuraaQcYbFOhZqhq2qmncoeJc65tzBWPNNeay1byCVbRikTGYQj1B1FMPqLQ-UzI2TqNaCQG9oRAMDYHYSIatkarqv4NakbkV6tRV0o1iazWCD0Fa8VWDpAaMcvCHGxpTquyzYrC0XD83quqg2ptXKHjnJjby-ldyHl9KTd23tabPoTNXvAle+V5jpEhKdSEiJXbaJdaSmQs7XpdGbbq-VHT20bsEA+qRqabUwIDJmlIEJwWOTtIYYGBoBTogtOaE0UJhD3vwI+xdy7Y18vje+z9O6f2OL-Zxc62Q2pWDUGZT+EyRSAjRPIOC+oASztvqjJ9KKDVvoxXR94mGSzYaJZxbYyczAoP3PkEm7VXaMpUEuKwtHnx33eM26NKG10Jr6ax9jc5OMZv7cYEw+i1i5TSu60E-J5jMIRGIGMBpZ0sweGzDmXMebwpqTYpFz623oseZZ6zAVbMPEEAcsKKnIrpsSXbAUXDrAHTinIfq1RtjrzmMKdxch-ZTWrUQ0N2z3PPhs9zXmHKwqyaXTyuNAr30ZfZp57LPncuUH89bQLEzgtexROFtYkX0p5WkLGOLwH35JY1sGtyVi9W2MwOOPoU44jiv3EnQjRxMhHDyAs91Y1qxewxMwxid6q2ENQoNmxtc7GEjCTXV6+FolBVifE3dC8JkxkRPsMwsF1CKxlkUJWSIcaOCyCCY+u3huSGHLgDgBBJsqElSk2bCI5BA0smsMoaR24PZxoDNIP3rF-YB0DykWHCUZvyPyC0VoL2EeBNGQGswVgSHWcCWC+DkvbZEr9-bmBJC4AFd+Ubk4QgTau3a6wmVZDqClsyA0L3ECghmMuVWcsoKQq272BnaOmeSAAHJ1wAAqoDwOwWABAqoQAgIECiXpmaa7uOK+YiI80GkckZRYoJYTzCTmYV+mQc0KFR0NpXqv-Aa61zr0gYV7HY7q3pTQu5ZBAoxFoE0brEC8TFtg0oVoVjHwx+wYHPPWr8NmF2LIKhqNR7NGkKQcwhTLFBcsJ0cvNZuTT8DqkHGccVmYpKvNea5iyFgl1IvZlslOzmECbqkpq-9eLgAFRO1EmJDw4m1w5-0bnwe91wgOuYYESg7TolsPCIvqJJUXv3JYY03YR81rchP-Ap3p+z6aaEpU5j-CM9QHY83jpf6KEchaE6lkEQ2RjOGOoLIV2UvY+JUdmOudSL0c8AAeVwBbRfUNUkCqm8DH0EDAJaUEEgPYBgMtiX2uz0hKGDDyFqCckdDqDUFhCTAFGwTUFylbhKDg1P1hn8FZ38HqRIEoB6HGxUjAHYK5gCF5T1XeSZC4iOARCRy0ChBsFEAd2WH3zSByEhiFBsBHhYLrnYM4N8AnAX0GHeSFC+R0wkDmWyEOFhAdAgxKDsCUAGhXhcjIGwAfD5VaGnmZm5j1XgJczaXsMcPuEEFrkEA0PCjwLtQqGAldxBSWEyFkOSSsBKFSHbmhHUDsMBx8OcNrlcLIG6C0LGy510Mzz-Xyi+TkCh0YmhEoK0GrFWDsFghWBqGSIcKcPwBcJkRCmcNJELA8KY26W8L5SkX8PaP7HeSzngX9SqH2EUL00QFwwYihFbhBCe1yndxOFZwwHgCiD6ygEbxD0EEWDKFyEUHz3UC0EWyEEWElT3BYiFFdjyGHwIRlHxDAC2OX0EFBCIKhFmU0BNFyi8TFHKE5Hu1iMsErTuJrw+CePwPmJz0o3zzyELxhwYjtEhhMEhDakbCCQ8i6HBLtS6hME9mhGR0+MBljz0kpTu1RGMj9jz16yDTP2LjSzKQUheXs05TxSxKcTWFmBmUUFjBqFSEBWSGdhgkd3yFlxBNHwHHpJhX8jhV80RVZNUybyMHUBJVUEsGUVX1A3SjkBZFSFRDlnmFCNnXDUjTZMXARwsF4WHQOk02hyW04h2GGjUVyWOCYNQklM1QXXlIC2XzEPxw4Vwz3DHWFF7jsjECqHzngzekcy9Nqx9Pbm2BWFgiESqDyEbGBjUElXhwqFUDLzqEkxRhk1GVNO2nbhZAyFWH0UbH7hJlB0BkpUcHeONBT1dJEklNKyyzs1lOjMaWLOFi7D-xBAtHAhsD9n6jJWyXrP3h1G+xbJhifzsV7MSXsGXkIKNHDLWEoNUBDFREkJKP0g9z22f2ZzT0XImX2D4XGi7BsHUA3Jh2SEhBWHyQezmGBLp3lznMVyPJZzZ0wFPLhBsCzTXj1EWFkEmIQHjxHMpST2tFkAPL+29193oT-LYWbl4TBBMDSDdksjLxDHbDRCOGULFFT0B3YD-OMEcgYmNCMnLI3270skrFbHMkA07BPzFNpIHAv0iU4Gv2nmQq+OyWPRUESkhm3DyBDDWAWEow3Fpw2KIXQIgKN2wPQlgLIptD+N3lSVC1tMQCNBsgH1sGP2GnM1nP7DULYI4MeIVO2OLwYhNAEyMgMz5MsjoJDHYRBBqBWDRKYJ6M4CaPSMEMsu9PwL4gFCFHb0ROJ1kJshMHUCFF3k5EYLYskB8rSLrhaKkjaPQjIuW19mFCyAjE4lsCixZAHlLOZGtCtBcBcCAA */
|
||||
/** @xstate-layout N4IgpgJg5mDOIC5QFkD2EwBsCWA7KAxAMICGuAxlgNoAMAuoqAA6qzYAu2qujIAHogC0AdgCsAZgB04gEyjhADnEA2GgoUAWJQBoQAT0QBGGuICckmoZkbTM42YWKAvk91oMOfAQDKYdgAJYLDByTm5aBiQQFjYwniiBBFtpGhlxDRphGg1ZURlhXQMEcRLDSVF5UwV84XEK8Rc3dCw8KElsCEwwHz9A4NCuXAjeGI5B3kTBLWFJDWV5hVSZZTrlBUKjS1FZiUrDeWVDasaQdxb8ds7ugFFcdjAAJ0CAaz9yAAthqNG4iaFlmZWZSmZRaKyGQzKYQaDYIGSmDSzdKyDSGcQ0KrAk5nTxtDpdAi3e5PWCvdgfKiGSLMVhjbh-BCCaw0WaQrZqdGLAr6RAZGSSWzCZSiIEKNFi5TY5q4y4E658dgPACuGC+NNi4wSQgqM3hNFEwNEGlEYthENELJkCjWplMFpsGlRUo8rVlNz4LAe7DV0Vpvy1jKtCkkVuZMjsDpNsOEwjKUIkcxNqWhomd5za3jJH2IZEomEzb0+9BGfs1oESEOtkmM0K0ahMplkZqOZUrYrRlgUJrTMoL5Pekj7HwAklcegEgl0BuFi99S-SA4ZoWUdWsTSLlsozZlzNkZPrG0a5F2e66hwPz6OCcgSK8+lAALZgO7+ABuj045BImB9PzL-CMeFW2qTQhU0ZMzVRKR0RoVJ6nyJQNFPC5z0HLN3ivbobzvIJH2fAJ3lQB5sAAL24dhv1-ed4nLQDoUkVRrX1CF8ihGQzXECFymNLJIU4-U8mQjN0LQwtMOIbhYEVEg8H8QjiLIu5v38CBsCk3MwCojUF1ohArCNCwNDSDFENMI51h5OEzGUCwKgtbJRDMtEhNE-tXJHMciEk6TZPfL1sC-TAVLUiiKE02d1TpGiAL05ZgztK0RVBYxNHYyzw1qcprCODQY2EZYjRc1DL087yHhk3B-AAQQAIW8fwAA0tKihkrC7JExEMGxOPhNJYXhAy7ShRY4NMWoGlcU5pTPESSoJLzcCk8rZNq+qAE1mv9XS2u2aw7GUOR9mFA7YU5YN8rstlHEdIrZvQ8SFqWir-DIKAuk2-8K2RaQlBA+QxWEUx+otXV1zyg1AbG27C3cjDSsWnzKq6fB2CLalfW06KvvEGYVANDE0TSfZ+sOc7gVRQHHSUKFobcubukexH-CYR4WdwVTyCVTASCeVT1LCj6dJiqwrVmW0eoyI5VC3dKxURWMqjG-LHVy1NJpxGaYfpiSEeWyr5NI8jv0wPQXpwKAhgijGWsXZZ+S7TQu3SI0aBWM0kpDO1QPysQVgmpoXRQu6xPhp7fI-ALjdN79sAtwWsbo8wcitQGkrMEUzQO7YTTGzFqiqWpaY+WGHrK57YFwEgmH8dhUEa+PWs4qRlnERYFDG6ozH6vcQzkeZ5n1RxwyLi97tDpmK6rmu642q2-yFr60QsIVOJjHHjBhdKupmI0h8cpc5hyEeS-HvX-DAABHJVlORqBUYb23G3KbfAayPIJG5Iol3RJETFg-VjqmGPtrRmZ8mA82NtQOe1FG75AsOGFY+xGwU03l-RsMwTCcUOLaTIag1YB3TLDE+80y6yQeGAB8qB3z+HIKQu4sAH7bWsMGQ41gDRWlRCacQZolBlEsMCfcOROQHWAWPAkAAlMAggwB8BCEqe4jDhZ1CkGiVQ+kdQGlhCCGyjk14misGZbIoiQ5yivtgauAAZPAYBp6oB-NAzGrV246JKKCW0CZ1CwiUNnTIe05CJghMY-s4lrhmOrqFGAdxsDKR5uQaeijEh2DkLMDEB4JDpDdpZFK5g5ASGlpifU-spqB2EjDKqAB3GSBEiKGyUkFPmoVKD+DwAAM1QAQCA3AwDtFwK+VArxJAwHYIIA2ikKKYEEK01ACTEDGURI6UEGJai2jXv1VE5guyhiwbYCGx8KlVLkjUsZykGkaWabgNpBBHgPCIpIJg3N2BtIeA+QZfgRlHKNhMqZMyrL6mrF1VEaJjRWjGv1Vu-Jsiu1gnUVihg9mVI4G+COgVgr8yaVMjpXSel9IGUMwQflPzfkmRc6ZDiba6SJvyNEih7BQkMIKfqVopCOHfnYUo+V4UHIJZHepIUzkYuubc+5JBHlEReXi7lgViVtJ+ZSyQix5D7zEJoRlRlqzHVSK3ECShOWItWo1c5lzOm4G6XgHF3S8UkAAEawEEHwaVpL0bzwTlZSEkghT7iWLsCyRR4QHWrBkVEoJZAHULuraaQcykIoCPqhqhr2mCoeHch5TzxVvOtba+13yyVbRikTGYQj1B1FMPqLQ-UzI2TqNaCQG9oRAPDSUoh+y9V1X8GteNmKTXYv6Ra9NNrBB6AdbKrB0gNGOXhDjY0p1XYFsVhaLhpbdUxtbe2gVDwblJuFaK55rzhkZoHUOnNn1Zmr3gSvfK8x0iQlOpCRErttHhhFDjGQS6Xr4C6B241prek9t3YIV6XRD1OpgQGfNKQIQwscnaQwwMDQCnRBac0JooTCFfQBmxa6N3JpFamv96GgMlkcaBzi51shtSsGoMyn9ZkikBGieQcF9QAlfbfVGn6sVmt-Xi1j7wCNziIxSzi2xk5mBQfufIJN2qu3ZSoJcVgWPPjvu8DtibsPbrTcMnjfHIq5sSSO4wJh9FrFymlX1oJ+TzGYQiMQMYDSvpZg8NmHMuY81RY0jDJLO3fvNX+hzTmAouYeIIU5YVtPW107Mu2AouHWAOnFOQ-VqjbHXnMYU7i5BFI1pGtyzaAh+efM57mvM+VhRU+uoVKaxW+dZgVgLRXgslcoGF51DIEH8i9iiOLawEvpTytIWMqWoPv0yxG0pbkrEmtsZgccfQpxxFlfuJOFGjiZCOHkbh6UxrVi9hiZhjEX0NsIahCbNja52MJGEmur18LRKCrE+JR6F6zMBjZKo29shmBxo2LRigUmcS0MKC9Rxj4nam5IYcuAOAEAWyoeVrcRSLARHIIGlk1hlDSO3MwJgYy2BG42471iwcQ6h5SYDAm835H5BaK0t6KPAmjIDWYKwJA7OBLBfBxSjsiVB2dzAkhcBiu-DNycIR5uPZddYTKsh1BS2ZAaGWRRQQzGXKrOWUE4WHd7NzwnvPJAADk64AAVUB4HYLAAgVUIAQECBRL0zMTd3FlfMREJaDSOSMosUEsJ5hJzMK-TIRaFAg516gOx+ujcO7NzmMK9iyfkuFpoXcshwUYi0CaH1iBeJi2waUK0Kxj7E-YND8XrV+GzC7FkFQTHU9mjSFIOYHrpapGSgXyHRfSeEfjxWZi8qS0lrmLIWCXVa9mXdU7OYQJuqSk15rNyAAVa7USYkPDibXYX-Qxdx4i3CA65hgRKDtOiWw8Ja+onlbez1XUKhB5n9l4uC-8A3eX6v9poSlTmP8Dz0PsfO-b+WI6X+RQRyC0E6SyBEGyGMcMOoLIV2BvY+JUdmOudSL0c8AAeVwC827QGSqm8Dn0EAQM6UEGQPYDQMti32PT0hKGDDyGWQhEdDqDUFhCTAFGwTUFylbhKFQ1vzGw+H8AF38BaRIEoB6DmxUjAEEK5jy25hNR+SZC4iOARBxmhGtDrVEG92WHPzSByEhiFBsBHj4LrkEOEN8AnA30GB+SFH+WM3SRwQn1hAdHgxKDsCUAGhXhcjIGwAfBFVaGnmZmkO6C-SwO6Q8K8PuEEFrkECMPCnIKewQAqGAgD0hSWEyHUODB6hKFSHbmUJvwIRlBCO8PwF8OFRNXXzm3MJL1A3yn+TkGR0YmhCYK0GrFWDsFghWBqHcMh1CJ8NrnPj4BCh8NJELEwM4wGXyLCIiMGP7B+SzngVDTeyNGfRvRYShFbhBHUGsxyM5y1y1jERuEu3IVCHQymwW0ykBnzmyF0PUDUKyTsGVzmGsxBEsFsxcEmgFwwHgCiCyygF-woMEEWDKFyEUCr3UC0A2yKBEA2X2C0CMkOgNHSBcnxDAB+NiMEFBGoKhDGlbmNFAi8TFHKE5H2HSMsHrVyNnw+GRJdTWPLwYyrzyBr0slxljEUHAMhGFEliCQ8i6ApNagyGbjGlylsE0EqAzz0npURC6isHRD9krzxy5yjQOVGU+Tc35RJW5MXGtGDEdCWUcCsBjFSDBWSGdhgh93yA11JLvwHFyyRX8hRRC3RVVP4y7yMHUCpVUEsGUV3xg3SjkBZFSFRDlnmHiNfVjXjTVO2kxwsF4QnQOgMxR19UbDKGNGGjUVUBNAO3NJ4MtOjWqhXVDMdO3wUKpw4RIz3GnWFF7jsjECqHzjQ3fQ8zaTDITztAYhgiESqDyG+3SgtGDE7i7Hxg9TqAUxRmUymUbIrHbhZF5LdzFEbH7hJlh0BnpUcAxKTNlO2Jy2zPy3Zjq1cztPrNQDHOdLgxe27MDRBBKH6hpXdSXP3h1BBGD0m150PLhHsGXioKNGrLWCYNUHKCNAhHcXTn2AfNO2-3Bzb2fLsBFDfPhxsHUC-NR2SFZPSAH37yxG4KIS-zDwF2eW-AgpsALTXj1EWFkFM0z0sGz3pVz2tFkGArBwN38GN1Nw+J0woLYWbl4TBBMDSEySKA9RDHbDRCOEuLNK2LJIHEL2fOMEcgYmNCMl5IP2HyyRbH+Rlw7DW02K+KIQf0iU4Gf2nggpNAwXBTkoOkODmG3HLLcSrMcB3FsHgMQJtx5hIPQnQMkptHxN3jhJizjMQCNBsgn1sGNAhi7GnwzNhgMIEKEKRPzN+LrwYjTL9P-3E3sMyj7j9RqBWEbA6M8IKKgCKP8LcqkDGjZxsHkDp3UJshMHUCFF3k5C4LCrGO6LrhkX6MKMmPJJitiPpWV3lwYwjE4lsESxZAHgnOZGtCtGPkkUOLrIMsyBbOOmNBWRKFQSMCPyZ3NDMjtF4gOxcCAA */
|
||||
id: 'Modeling',
|
||||
|
||||
tsTypes: {} as import('./modelingMachine.typegen').Typegen0,
|
||||
@ -312,6 +313,8 @@ export const modelingMachine = createMachine(
|
||||
target: 'Tangential arc to',
|
||||
cond: 'is editing existing sketch',
|
||||
},
|
||||
|
||||
'Equip rectangle tool': 'Rectangle',
|
||||
},
|
||||
|
||||
entry: 'setup client side sketch segments',
|
||||
@ -485,6 +488,10 @@ export const modelingMachine = createMachine(
|
||||
onDone: '#Modeling.idle',
|
||||
},
|
||||
},
|
||||
|
||||
Rectangle: {
|
||||
entry: 'set up draft rectangle',
|
||||
},
|
||||
},
|
||||
|
||||
initial: 'Init',
|
||||
@ -871,6 +878,15 @@ export const modelingMachine = createMachine(
|
||||
'tangentialArcTo'
|
||||
)
|
||||
},
|
||||
'set up draft rectangle': ({ sketchDetails }) => {
|
||||
if (!sketchDetails) return
|
||||
sceneEntitiesManager.setupDraftRectangle(
|
||||
sketchDetails.sketchPathToNode,
|
||||
sketchDetails.zAxis,
|
||||
sketchDetails.yAxis,
|
||||
sketchDetails.origin
|
||||
)
|
||||
},
|
||||
'set up draft line without teardown': ({ sketchDetails }) => {
|
||||
if (!sketchDetails) return
|
||||
sceneEntitiesManager.setUpDraftSegment(
|
||||
|
Reference in New Issue
Block a user