From ec88661ce6387201dc5de2556a62fe30a0787de5 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Thu, 28 Nov 2024 17:05:21 +0100 Subject: [PATCH 1/4] Undo rotation/translation upon dry-run failure --- packages/base/src/3dview/mainview.tsx | 8 ++++++-- packages/base/src/3dview/mainviewmodel.ts | 6 ++++-- 2 files changed, 10 insertions(+), 4 deletions(-) diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx index 91bb104cd..7bb030985 100644 --- a/packages/base/src/3dview/mainview.tsx +++ b/packages/base/src/3dview/mainview.tsx @@ -417,7 +417,7 @@ export class MainView extends React.Component { this._controls.enabled = !event.value; }); // Update the currently transformed object in the shared model once finished moving - this._transformControls.addEventListener('mouseUp', () => { + this._transformControls.addEventListener('mouseUp', async () => { const updatedObject = this._selectedMeshes[0]; const objectName = updatedObject.name; @@ -451,7 +451,7 @@ export class MainView extends React.Component { updatedPosition.z ]; - this._mainViewModel.maybeUpdateObjectParameters(objectName, { + const done = await this._mainViewModel.maybeUpdateObjectParameters(objectName, { ...obj.parameters, Placement: { ...obj.parameters.Placement, @@ -460,6 +460,10 @@ export class MainView extends React.Component { Angle: updatedRotation[1] } }); + console.log('done?', done); + if (!done) { + // TODO: Reset original position and rotation of the object upon failure + } } }); this._scene.add(this._transformControls); diff --git a/packages/base/src/3dview/mainviewmodel.ts b/packages/base/src/3dview/mainviewmodel.ts index 576b8ca6d..ecf884006 100644 --- a/packages/base/src/3dview/mainviewmodel.ts +++ b/packages/base/src/3dview/mainviewmodel.ts @@ -178,7 +178,7 @@ export class MainViewModel implements IDisposable { async maybeUpdateObjectParameters( name: string, properties: { [key: string]: any } - ): Promise { + ): Promise { // getContent already returns a deep copy of the content, we can change it safely here const updatedContent = this.jcadModel.getContent(); for (const object of updatedContent.objects) { @@ -197,7 +197,7 @@ export class MainViewModel implements IDisposable { 'Failed to update the desired shape', 'The tool was unable to update the desired shape due to invalid parameter values. The values you entered may not be compatible with the dimensions of your piece.' ); - return; + return false; } // Dry run was successful, ready to apply the update now @@ -215,6 +215,8 @@ export class MainViewModel implements IDisposable { meta }); } + + return true; } /** From c763114a0d4584eec1f2b2201c4c7d131479ac71 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Fri, 29 Nov 2024 09:19:03 +0100 Subject: [PATCH 2/4] Undo positioning upon dry run failure --- packages/base/src/3dview/helpers.ts | 12 ++++++++---- packages/base/src/3dview/mainview.tsx | 18 ++++++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) diff --git a/packages/base/src/3dview/helpers.ts b/packages/base/src/3dview/helpers.ts index 11330efd5..4b9ab442e 100644 --- a/packages/base/src/3dview/helpers.ts +++ b/packages/base/src/3dview/helpers.ts @@ -71,6 +71,10 @@ export interface IMeshGroupMetadata { [key: string]: any; } +export interface MeshGroup extends THREE.Group { + userData: IMeshGroupMetadata; +} + export function projectVector(options: { vector: THREE.Vector3; camera: THREE.Camera; @@ -162,7 +166,7 @@ export function buildShape(options: { isWireframe: boolean; objColor?: THREE.Color | string | number; }): { - meshGroup: THREE.Group; + meshGroup: MeshGroup; mainMesh: THREE.Mesh; edgesMeshes: LineSegments2[]; } | null { @@ -240,11 +244,12 @@ export function buildShape(options: { geometry.computeBoundsTree(); } - const meshGroup = new THREE.Group(); + const meshGroup = new THREE.Group() as MeshGroup; meshGroup.name = `${objName}-group`; meshGroup.visible = visible; meshGroup.userData = { - jcObject + jcObject, + type: 'shape' }; // We only build the stencil logic for solid meshes @@ -345,7 +350,6 @@ export function buildShape(options: { boundingBox.visible = false; boundingBox.name = SELECTION_BOUNDING_BOX; meshGroup.add(boundingBox); - meshGroup.userData.type = 'shape'; meshGroup.add(mainMesh); diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx index 7bb030985..0ba6eec7f 100644 --- a/packages/base/src/3dview/mainview.tsx +++ b/packages/base/src/3dview/mainview.tsx @@ -50,7 +50,8 @@ import { computeExplodedState, projectVector, IMouseDrag, - IMeshGroupMetadata + IMeshGroupMetadata, + getQuaternion } from './helpers'; import { MainViewModel } from './mainviewmodel'; import { Spinner } from './spinner'; @@ -419,6 +420,7 @@ export class MainView extends React.Component { // Update the currently transformed object in the shared model once finished moving this._transformControls.addEventListener('mouseUp', async () => { const updatedObject = this._selectedMeshes[0]; + const objectName = updatedObject.name; const updatedPosition = new THREE.Vector3(); @@ -460,9 +462,17 @@ export class MainView extends React.Component { Angle: updatedRotation[1] } }); - console.log('done?', done); - if (!done) { - // TODO: Reset original position and rotation of the object upon failure + // If the dry run failed, we bring back the object to its original position + if (!done && updatedObject.parent) { + const origPosition = obj.parameters.Placement.Position; + + // Undo positioning + updatedObject.parent.position.copy(new THREE.Vector3(0, 0, 0)); + updatedObject.parent.applyQuaternion(updatedQuaternion.invert()); + + // Redo original positioning + updatedObject.parent.applyQuaternion(getQuaternion(obj)); + updatedObject.parent.position.copy(new THREE.Vector3(origPosition[0], origPosition[1], origPosition[2])); } } }); From 01a89efa5cc668a2bb6a81fd7c8e5361ac7671f8 Mon Sep 17 00:00:00 2001 From: "pre-commit-ci[bot]" <66853113+pre-commit-ci[bot]@users.noreply.github.com> Date: Fri, 29 Nov 2024 08:20:54 +0000 Subject: [PATCH 3/4] [pre-commit.ci] auto fixes from pre-commit.com hooks for more information, see https://pre-commit.ci --- packages/base/src/3dview/mainview.tsx | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/packages/base/src/3dview/mainview.tsx b/packages/base/src/3dview/mainview.tsx index 0ba6eec7f..968909950 100644 --- a/packages/base/src/3dview/mainview.tsx +++ b/packages/base/src/3dview/mainview.tsx @@ -453,15 +453,18 @@ export class MainView extends React.Component { updatedPosition.z ]; - const done = await this._mainViewModel.maybeUpdateObjectParameters(objectName, { - ...obj.parameters, - Placement: { - ...obj.parameters.Placement, - Position: newPosition, - Axis: updatedRotation[0], - Angle: updatedRotation[1] + const done = await this._mainViewModel.maybeUpdateObjectParameters( + objectName, + { + ...obj.parameters, + Placement: { + ...obj.parameters.Placement, + Position: newPosition, + Axis: updatedRotation[0], + Angle: updatedRotation[1] + } } - }); + ); // If the dry run failed, we bring back the object to its original position if (!done && updatedObject.parent) { const origPosition = obj.parameters.Placement.Position; @@ -472,7 +475,13 @@ export class MainView extends React.Component { // Redo original positioning updatedObject.parent.applyQuaternion(getQuaternion(obj)); - updatedObject.parent.position.copy(new THREE.Vector3(origPosition[0], origPosition[1], origPosition[2])); + updatedObject.parent.position.copy( + new THREE.Vector3( + origPosition[0], + origPosition[1], + origPosition[2] + ) + ); } } }); From ca9caa1f685a72b53be575925786d0a51201c155 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Fri, 29 Nov 2024 09:25:07 +0100 Subject: [PATCH 4/4] Linter --- packages/base/src/3dview/helpers.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/base/src/3dview/helpers.ts b/packages/base/src/3dview/helpers.ts index 4b9ab442e..0c31a5505 100644 --- a/packages/base/src/3dview/helpers.ts +++ b/packages/base/src/3dview/helpers.ts @@ -71,7 +71,7 @@ export interface IMeshGroupMetadata { [key: string]: any; } -export interface MeshGroup extends THREE.Group { +export interface IMeshGroup extends THREE.Group { userData: IMeshGroupMetadata; } @@ -166,7 +166,7 @@ export function buildShape(options: { isWireframe: boolean; objColor?: THREE.Color | string | number; }): { - meshGroup: MeshGroup; + meshGroup: IMeshGroup; mainMesh: THREE.Mesh; edgesMeshes: LineSegments2[]; } | null { @@ -244,7 +244,7 @@ export function buildShape(options: { geometry.computeBoundsTree(); } - const meshGroup = new THREE.Group() as MeshGroup; + const meshGroup = new THREE.Group() as IMeshGroup; meshGroup.name = `${objName}-group`; meshGroup.visible = visible; meshGroup.userData = {