added rest based on socket call

This commit is contained in:
2025-09-22 13:05:48 +05:30
parent daa23241d7
commit eb4ef77599
4 changed files with 263 additions and 195 deletions

View File

@@ -39,7 +39,7 @@ const CopyPasteControls3D = () => {
rotatedObjects, rotatedObjects,
setRotatedObjects, setRotatedObjects,
} = assetStore(); } = assetStore();
const { updateAssetInScene } = useAssetResponseHandler(); const { updateAssetInScene, removeAssetFromScene } = useAssetResponseHandler();
const { selectedVersion } = versionStore(); const { selectedVersion } = versionStore();
const { userId, organization } = getUserData(); const { userId, organization } = getUserData();
@@ -502,56 +502,58 @@ const CopyPasteControls3D = () => {
projectId, projectId,
}; };
if (!builderSocket?.connected) { removeAssetFromScene(data.modelUuid, () => {
// REST if (!builderSocket?.connected) {
// REST
setAssetsApi({ setAssetsApi({
modelUuid: newFloorItem.modelUuid, modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName, modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId, assetId: newFloorItem.assetId,
position: [position.x, 0, position.z], position: [position.x, 0, position.z],
rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z }, rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z },
isLocked: false, isLocked: false,
isVisible: true, isVisible: true,
eventData: eventData, eventData: eventData,
versionId: selectedVersion?.versionId || "", versionId: selectedVersion?.versionId || "",
projectId: projectId, projectId: projectId,
})
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
return;
}
if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
eventData: data.data.eventData,
};
updateAssetInScene(model, () => {
echo.log(`Pasted asset: ${model.modelName}`);
});
} else {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
}
}) })
.catch(() => { .then((data) => {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`); if (!data.message || !data.data) {
clearSelection(); echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
}); return;
} else { }
// SOCKET if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
eventData: data.data.eventData,
};
builderSocket.emit("v1:model-asset:copy", data); updateAssetInScene(model, () => {
} echo.log(`Pasted asset: ${model.modelName}`);
});
} else {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
}
})
.catch(() => {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
clearSelection();
});
} else {
// SOCKET
builderSocket.emit("v1:model-asset:copy", data);
}
});
} else { } else {
const data = { const data = {
organization, organization,
@@ -568,54 +570,56 @@ const CopyPasteControls3D = () => {
userId, userId,
}; };
if (!builderSocket?.connected) { removeAssetFromScene(data.modelUuid, () => {
// REST if (!builderSocket?.connected) {
// REST
setAssetsApi({ setAssetsApi({
modelUuid: newFloorItem.modelUuid, modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName, modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId, assetId: newFloorItem.assetId,
position: [position.x, 0, position.z], position: [position.x, 0, position.z],
rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z }, rotation: { x: pastedAsset.rotation.x, y: pastedAsset.rotation.y, z: pastedAsset.rotation.z },
isLocked: false, isLocked: false,
isVisible: true, isVisible: true,
versionId: selectedVersion?.versionId || "", versionId: selectedVersion?.versionId || "",
projectId: projectId, projectId: projectId,
})
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
return;
}
if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
};
updateAssetInScene(model, () => {
echo.log(`Pasted asset: ${model.modelUuid}`);
});
} else {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
}
}) })
.catch(() => { .then((data) => {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`); if (!data.message || !data.data) {
clearSelection(); echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
}); return;
} else { }
// SOCKET if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
};
builderSocket.emit("v1:model-asset:copy", data); updateAssetInScene(model, () => {
} echo.log(`Pasted asset: ${model.modelUuid}`);
});
} else {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
}
})
.catch(() => {
echo.error(`Error pasting asset: ${newFloorItem.modelUuid}`);
clearSelection();
});
} else {
// SOCKET
builderSocket.emit("v1:model-asset:copy", data);
}
});
} }
assetsToCopy.push({ assetsToCopy.push({

View File

@@ -38,7 +38,7 @@ const DuplicationControls3D = () => {
rotatedObjects, rotatedObjects,
setRotatedObjects, setRotatedObjects,
} = assetStore(); } = assetStore();
const { updateAssetInScene } = useAssetResponseHandler(); const { updateAssetInScene, removeAssetFromScene } = useAssetResponseHandler();
const { selectedVersion } = versionStore(); const { selectedVersion } = versionStore();
const { userId, organization } = getUserData(); const { userId, organization } = getUserData();
@@ -93,9 +93,7 @@ const DuplicationControls3D = () => {
if (!isPointerMoving && duplicatedObjects.length > 0 && event.button === 2) { if (!isPointerMoving && duplicatedObjects.length > 0 && event.button === 2) {
event.preventDefault(); event.preventDefault();
clearSelection(); clearSelection();
duplicatedObjects.forEach((obj: THREE.Object3D) => { clearDuplication();
removeAsset(obj.userData.modelUuid);
});
} }
setKeyEvent(""); setKeyEvent("");
}; };
@@ -130,9 +128,7 @@ const DuplicationControls3D = () => {
if (keyCombination === "ESCAPE" && duplicatedObjects.length > 0) { if (keyCombination === "ESCAPE" && duplicatedObjects.length > 0) {
event.preventDefault(); event.preventDefault();
clearSelection(); clearSelection();
duplicatedObjects.forEach((obj: THREE.Object3D) => { clearDuplication();
removeAsset(obj.userData.modelUuid);
});
} }
}; };
@@ -233,6 +229,12 @@ const DuplicationControls3D = () => {
} }
}, [axisConstraint, camera, duplicatedObjects]); }, [axisConstraint, camera, duplicatedObjects]);
const clearDuplication = useCallback(() => {
duplicatedObjects.forEach((obj: THREE.Object3D) => {
removeAsset(obj.userData.modelUuid);
});
}, [duplicatedObjects, removeAsset]);
const duplicateSelection = useCallback(() => { const duplicateSelection = useCallback(() => {
if (selectedAssets.length > 0 && duplicatedObjects.length === 0) { if (selectedAssets.length > 0 && duplicatedObjects.length === 0) {
const positions: Record<string, THREE.Vector3> = {}; const positions: Record<string, THREE.Vector3> = {};
@@ -564,56 +566,58 @@ const DuplicationControls3D = () => {
projectId, projectId,
}; };
if (!builderSocket?.connected) { removeAssetFromScene(data.modelUuid, () => {
// REST if (!builderSocket?.connected) {
// REST
setAssetsApi({ setAssetsApi({
modelUuid: newFloorItem.modelUuid, modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName, modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId, assetId: newFloorItem.assetId,
position: [position.x, position.y, position.z], position: [position.x, position.y, position.z],
rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z }, rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z },
isLocked: false, isLocked: false,
isVisible: true, isVisible: true,
eventData: eventData, eventData: eventData,
versionId: selectedVersion?.versionId || "", versionId: selectedVersion?.versionId || "",
projectId: projectId, projectId: projectId,
})
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
return;
}
if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
eventData: data.data.eventData,
};
updateAssetInScene(model, () => {
echo.log(`Duplicated asset: ${model.modelName}`);
});
} else {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
}
}) })
.catch(() => { .then((data) => {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`); if (!data.message || !data.data) {
clearSelection(); echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
}); return;
} else { }
// SOCKET if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
eventData: data.data.eventData,
};
builderSocket.emit("v1:model-asset:duplicate", data); updateAssetInScene(model, () => {
} echo.log(`Duplicated asset: ${model.modelName}`);
});
} else {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
}
})
.catch(() => {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
clearSelection();
});
} else {
// SOCKET
builderSocket.emit("v1:model-asset:duplicate", data);
}
});
} else { } else {
const data = { const data = {
organization, organization,
@@ -630,54 +634,56 @@ const DuplicationControls3D = () => {
userId, userId,
}; };
if (!builderSocket?.connected) { removeAssetFromScene(data.modelUuid, () => {
// REST if (!builderSocket?.connected) {
// REST
setAssetsApi({ setAssetsApi({
modelUuid: newFloorItem.modelUuid, modelUuid: newFloorItem.modelUuid,
modelName: newFloorItem.modelName, modelName: newFloorItem.modelName,
assetId: newFloorItem.assetId, assetId: newFloorItem.assetId,
position: [position.x, position.y, position.z], position: [position.x, position.y, position.z],
rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z }, rotation: { x: duplicatedAsset.rotation.x, y: duplicatedAsset.rotation.y, z: duplicatedAsset.rotation.z },
isLocked: false, isLocked: false,
isVisible: true, isVisible: true,
versionId: selectedVersion?.versionId || "", versionId: selectedVersion?.versionId || "",
projectId: projectId, projectId: projectId,
})
.then((data) => {
if (!data.message || !data.data) {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
return;
}
if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
};
updateAssetInScene(model, () => {
echo.log(`Duplicated asset: ${model.modelUuid}`);
});
} else {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
}
}) })
.catch(() => { .then((data) => {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`); if (!data.message || !data.data) {
clearSelection(); echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
}); return;
} else { }
// SOCKET if (data.message === "Model created successfully" && data.data) {
const model: Asset = {
modelUuid: data.data.modelUuid,
modelName: data.data.modelName,
assetId: data.data.assetId,
position: data.data.position,
rotation: [data.data.rotation.x, data.data.rotation.y, data.data.rotation.z],
isLocked: data.data.isLocked,
isCollidable: true,
isVisible: data.data.isVisible,
opacity: 1,
};
builderSocket.emit("v1:model-asset:duplicate", data); updateAssetInScene(model, () => {
} echo.log(`Duplicated asset: ${model.modelUuid}`);
});
} else {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
}
})
.catch(() => {
echo.error(`Error duplicating asset: ${newFloorItem.modelUuid}`);
clearSelection();
});
} else {
// SOCKET
builderSocket.emit("v1:model-asset:duplicate", data);
}
});
} }
assetsToDuplicate.push({ assetsToDuplicate.push({

View File

@@ -221,6 +221,36 @@ function MoveControls3D({ boundingBoxRef }: any) {
}, 50); }, 50);
}, [movedObjects, initialStates, updateAsset]); }, [movedObjects, initialStates, updateAsset]);
const resetToInitialPosition = useCallback(
(modelUuid: string, callBack?: () => void) => {
setTimeout(() => {
const movedObject = movedObjects.find((obj: THREE.Object3D) => obj.userData.modelUuid === modelUuid);
if (!movedObject) return;
const initialState = initialStates[movedObject.uuid];
if (!initialState) return;
const positionArray: [number, number, number] = [initialState.position.x, initialState.position.y, initialState.position.z];
updateAsset(modelUuid, {
position: positionArray,
rotation: [initialState.rotation?.x || 0, initialState.rotation?.y || 0, initialState.rotation?.z || 0],
});
movedObject.position.copy(initialState.position);
if (initialState.rotation) {
movedObject.rotation.copy(initialState.rotation);
}
setAxisConstraint(null);
if (callBack) callBack();
}, 50);
},
[movedObjects, initialStates, updateAsset]
);
useEffect(() => { useEffect(() => {
if (movedObjects.length > 0) { if (movedObjects.length > 0) {
const intersectionPoint = new THREE.Vector3(); const intersectionPoint = new THREE.Vector3();
@@ -413,7 +443,7 @@ function MoveControls3D({ boundingBoxRef }: any) {
.then((data) => { .then((data) => {
if (!data.message || !data.data) { if (!data.message || !data.data) {
echo.error(`Error moving asset: ${newFloorItem.modelUuid}`); echo.error(`Error moving asset: ${newFloorItem.modelUuid}`);
resetToInitialPositions(); resetToInitialPosition(newFloorItem.modelUuid);
clearSelection(); clearSelection();
return; return;
} }
@@ -437,13 +467,13 @@ function MoveControls3D({ boundingBoxRef }: any) {
}); });
} else { } else {
echo.error(`Error moving asset: ${newFloorItem.modelUuid}`); echo.error(`Error moving asset: ${newFloorItem.modelUuid}`);
resetToInitialPositions(); resetToInitialPosition(newFloorItem.modelUuid);
clearSelection(); clearSelection();
} }
}) })
.catch(() => { .catch(() => {
echo.error(`Error moving asset: ${newFloorItem.modelUuid}`); echo.error(`Error moving asset: ${newFloorItem.modelUuid}`);
resetToInitialPositions(); resetToInitialPosition(newFloorItem.modelUuid);
clearSelection(); clearSelection();
}); });
} else { } else {

View File

@@ -202,6 +202,34 @@ function RotateControls3D() {
}, 50); }, 50);
}, [rotatedObjects, initialRotations, initialPositions, updateAsset]); }, [rotatedObjects, initialRotations, initialPositions, updateAsset]);
const resetToInitialRotation = useCallback(
(modelUuid: string) => {
setTimeout(() => {
const obj = rotatedObjects.find((o: THREE.Object3D) => o.userData.modelUuid === modelUuid);
if (!obj) return;
const uuid = obj.uuid;
const initialRotation = initialRotations[uuid];
const initialPosition = initialPositions[uuid];
if (initialRotation && initialPosition) {
const rotationArray: [number, number, number] = [initialRotation.x, initialRotation.y, initialRotation.z];
const positionArray: [number, number, number] = [initialPosition.x, initialPosition.y, initialPosition.z];
updateAsset(modelUuid, {
rotation: rotationArray,
position: positionArray,
});
obj.rotation.copy(initialRotation);
obj.position.copy(initialPosition);
}
}, 50);
},
[rotatedObjects, initialRotations, initialPositions, updateAsset]
);
useFrame(() => { useFrame(() => {
if (!isRotating || rotatedObjects.length === 0) return; if (!isRotating || rotatedObjects.length === 0) return;