* Smart Extrude: direction from the picked side, Cut into a body stays a Cut (#1257) - A sketch profile (or a thin extrude's curve) extrudes toward the side it was picked from: from the bottom view it goes down. Body faces still go outward. - The automatic operation is latched per side of the profile: a drag that starts into a body is a Cut and stays one past the far side; a Join does not become a Cut when it reaches another body. Passing through zero decides afresh for the new side. - An explicit operation, Direction or Reverse ends the automatic choices. - auto_operation also looks just past the profile, so a long cut through a body reads as a Cut from the start (the engine's operation: "auto" too). Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> * Scenario s07: the XZ profile seen from behind now extrudes toward the camera Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
249 lines
2.5 KiB
JSON
249 lines
2.5 KiB
JSON
[
|
|
{
|
|
"start": "component.create"
|
|
},
|
|
{
|
|
"key": "Enter"
|
|
},
|
|
{
|
|
"start": "sketch.create"
|
|
},
|
|
{
|
|
"click": {
|
|
"plane": "XY"
|
|
}
|
|
},
|
|
{
|
|
"start": "sketch.rectangle.two_point"
|
|
},
|
|
{
|
|
"click": {
|
|
"sketch": [
|
|
0,
|
|
0
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"click": {
|
|
"sketch": [
|
|
20,
|
|
20
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"key": "Escape"
|
|
},
|
|
{
|
|
"start": "sketch.finish"
|
|
},
|
|
{
|
|
"call": "ui.view",
|
|
"params": {
|
|
"view": "iso"
|
|
}
|
|
},
|
|
{
|
|
"start": "solid.extrude"
|
|
},
|
|
{
|
|
"text": "10"
|
|
},
|
|
{
|
|
"key": "Enter"
|
|
},
|
|
{
|
|
"call": "ui.menu",
|
|
"params": {
|
|
"x": 100,
|
|
"y": 170,
|
|
"target": {
|
|
"type": "component",
|
|
"id": 0
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"call": "ui.menuPick",
|
|
"params": {
|
|
"item": "Activate"
|
|
}
|
|
},
|
|
{
|
|
"start": "component.create"
|
|
},
|
|
{
|
|
"key": "Enter"
|
|
},
|
|
{
|
|
"call": "ui.set",
|
|
"params": {
|
|
"hiddenBodies": [
|
|
"Body1"
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"start": "sketch.create"
|
|
},
|
|
{
|
|
"click": {
|
|
"plane": "XZ"
|
|
}
|
|
},
|
|
{
|
|
"call": "ui.set",
|
|
"params": {
|
|
"hiddenBodies": []
|
|
}
|
|
},
|
|
{
|
|
"start": "sketch.rectangle.two_point"
|
|
},
|
|
{
|
|
"click": {
|
|
"sketch": [
|
|
30,
|
|
0
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"click": {
|
|
"sketch": [
|
|
50,
|
|
-10
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"key": "Escape"
|
|
},
|
|
{
|
|
"start": "sketch.finish"
|
|
},
|
|
{
|
|
"call": "ui.view",
|
|
"params": {
|
|
"view": "iso"
|
|
}
|
|
},
|
|
{
|
|
"call": "ui.view",
|
|
"params": {
|
|
"view": "fit"
|
|
}
|
|
},
|
|
{
|
|
"start": "solid.extrude"
|
|
},
|
|
{
|
|
"note": "The iso view sees the XZ sketch from behind (its normal is +Y), so the extrude comes toward the camera (-Y). -20 takes it back along +Y, where the joint below expects it."
|
|
},
|
|
{
|
|
"text": "-20"
|
|
},
|
|
{
|
|
"key": "Enter"
|
|
},
|
|
{
|
|
"expect": {
|
|
"bodies": 2,
|
|
"errors": 0
|
|
}
|
|
},
|
|
{
|
|
"start": "joint.create"
|
|
},
|
|
{
|
|
"click": {
|
|
"world": [
|
|
10,
|
|
10,
|
|
10
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"click": {
|
|
"world": [
|
|
40,
|
|
0,
|
|
5
|
|
]
|
|
}
|
|
},
|
|
{
|
|
"widget": "Rigid"
|
|
},
|
|
{
|
|
"widget": "Revolute"
|
|
},
|
|
{
|
|
"shot": "s07_joint"
|
|
},
|
|
{
|
|
"widget": "OK"
|
|
},
|
|
{
|
|
"expect": {
|
|
"dialog": null,
|
|
"errors": 0,
|
|
"query": {
|
|
"command": "joint.list",
|
|
"path": [
|
|
"joints",
|
|
0,
|
|
"type"
|
|
],
|
|
"value": "revolute"
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"expect": {
|
|
"bbox": {
|
|
"body": "Body2",
|
|
"min": [
|
|
null,
|
|
null,
|
|
10
|
|
],
|
|
"max": [
|
|
null,
|
|
null,
|
|
30
|
|
]
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"start": "joint.drive"
|
|
},
|
|
{
|
|
"text": "90"
|
|
},
|
|
{
|
|
"key": "Enter"
|
|
},
|
|
{
|
|
"expect": {
|
|
"query": {
|
|
"command": "joint.list",
|
|
"path": [
|
|
"joints",
|
|
0,
|
|
"values",
|
|
0,
|
|
"value"
|
|
],
|
|
"value": 90
|
|
}
|
|
}
|
|
},
|
|
{
|
|
"shot": "s07_driven"
|
|
}
|
|
]
|