Compare commits

...

2 Commits

Author SHA1 Message Date
3d75576215 rectangle tool extra 2024-03-26 19:44:22 +11:00
ae69b6f9b6 Initial draft rectangle appear on screen 2024-03-25 17:33:59 -04:00
3 changed files with 253 additions and 46 deletions

View File

@ -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') &&

View File

@ -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,17 +847,30 @@ export class SceneEntities {
const sgPaths = sketchGroup.value
const orthoFactor = orthoScale(sceneInfra.camControls.camera)
const 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
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] ||
@ -725,7 +894,7 @@ export class SceneEntities {
this.updateStraightSegment({
from: segment.from,
to: segment.to,
group: group,
group,
scale: factor,
})
} else if (type === PROFILE_START) {
@ -733,10 +902,6 @@ export class SceneEntities {
group.scale.set(factor, factor, factor)
}
}
updateSegment(sketchGroup.start, 0)
sgPaths.forEach(updateSegment)
})()
}
updateTangentialArcToSegment({
prevSegment,
@ -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

View File

@ -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(