feat: Add clearEvents and clearProducts actions to event and product stores
This commit is contained in:
parent
2f8fdfd46f
commit
e2ef19ca4e
|
@ -259,10 +259,9 @@ function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
//Helper to Visible the Circle and Curve
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{customCurvePoints && customCurvePoints?.length >= 2 && currentPath && isPlaying && (
|
{/* {customCurvePoints && customCurvePoints?.length >= 2 && currentPath && isPlaying && (
|
||||||
<mesh rotation={armBot.rotation} position={armBot.position} visible={false}>
|
<mesh rotation={armBot.rotation} position={armBot.position} visible={false}>
|
||||||
<Line
|
<Line
|
||||||
points={customCurvePoints.map((p) => [p.x, p.y, p.z] as [number, number, number])}
|
points={customCurvePoints.map((p) => [p.x, p.y, p.z] as [number, number, number])}
|
||||||
|
@ -277,19 +276,16 @@ function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone
|
||||||
rotation={[armBot.rotation[0], armBot.rotation[1], armBot.rotation[2]]}
|
rotation={[armBot.rotation[0], armBot.rotation[1], armBot.rotation[2]]}
|
||||||
visible={false}
|
visible={false}
|
||||||
>
|
>
|
||||||
{/* Green ring */}
|
|
||||||
<mesh rotation={[-Math.PI / 2, 0, 0]} visible={false}>
|
<mesh rotation={[-Math.PI / 2, 0, 0]} visible={false}>
|
||||||
<ringGeometry args={[CIRCLE_RADIUS, CIRCLE_RADIUS + 0.02, 64]} />
|
<ringGeometry args={[CIRCLE_RADIUS, CIRCLE_RADIUS + 0.02, 64]} />
|
||||||
<meshBasicMaterial color="green" side={THREE.DoubleSide} />
|
<meshBasicMaterial color="green" side={THREE.DoubleSide} />
|
||||||
</mesh>
|
</mesh>
|
||||||
|
|
||||||
{/* Markers at 90°, 180°, 270°, 360° */}
|
|
||||||
{[90, 180, 270, 360].map((degree, index) => {
|
{[90, 180, 270, 360].map((degree, index) => {
|
||||||
const rad = ((degree) * Math.PI) / 180;
|
const rad = ((degree) * Math.PI) / 180;
|
||||||
const x = CIRCLE_RADIUS * Math.cos(rad);
|
const x = CIRCLE_RADIUS * Math.cos(rad);
|
||||||
const z = CIRCLE_RADIUS * Math.sin(rad);
|
const z = CIRCLE_RADIUS * Math.sin(rad);
|
||||||
const y = 0; // same plane as the ring (Y axis)
|
const y = 0;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<mesh key={index} position={[x, y, z]}>
|
<mesh key={index} position={[x, y, z]}>
|
||||||
<sphereGeometry args={[0.05, 16, 16]} />
|
<sphereGeometry args={[0.05, 16, 16]} />
|
||||||
|
@ -302,7 +298,7 @@ function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone
|
||||||
const rad = ((degree) * Math.PI) / 180;
|
const rad = ((degree) * Math.PI) / 180;
|
||||||
const x = CIRCLE_RADIUS * Math.cos(rad);
|
const x = CIRCLE_RADIUS * Math.cos(rad);
|
||||||
const z = CIRCLE_RADIUS * Math.sin(rad);
|
const z = CIRCLE_RADIUS * Math.sin(rad);
|
||||||
const y = 0.15; // lift the text slightly above the ring
|
const y = 0.15;
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Text
|
<Text
|
||||||
|
@ -317,9 +313,7 @@ function RoboticArmAnimator({ HandleCallback, restPosition, ikSolver, targetBone
|
||||||
</Text>
|
</Text>
|
||||||
);
|
);
|
||||||
})}
|
})}
|
||||||
|
</group> */}
|
||||||
|
|
||||||
</group>
|
|
||||||
|
|
||||||
</>
|
</>
|
||||||
);
|
);
|
||||||
|
|
|
@ -10,6 +10,7 @@ import { useProductStore } from '../../../../../store/simulation/useProductStore
|
||||||
import { useTriggerHandler } from '../../../triggers/triggerHandler/useTriggerHandler';
|
import { useTriggerHandler } from '../../../triggers/triggerHandler/useTriggerHandler';
|
||||||
import { useSceneContext } from '../../../../scene/sceneContext';
|
import { useSceneContext } from '../../../../scene/sceneContext';
|
||||||
import { useProductContext } from '../../../products/productContext';
|
import { useProductContext } from '../../../products/productContext';
|
||||||
|
import { Preload } from '@react-three/drei';
|
||||||
|
|
||||||
function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) {
|
function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) {
|
||||||
|
|
||||||
|
@ -392,7 +393,7 @@ function RoboticArmInstance({ armBot }: { readonly armBot: ArmBotStatus }) {
|
||||||
<>
|
<>
|
||||||
{!isReset && isPlaying && (
|
{!isReset && isPlaying && (
|
||||||
<>
|
<>
|
||||||
<IKInstance modelUrl={armModel} setIkSolver={setIkSolver} ikSolver={ikSolver} armBot={armBot} groupRef={groupRef} />
|
<IKInstance modelUrl={armModel} setIkSolver={setIkSolver} armBot={armBot} groupRef={groupRef} />
|
||||||
<RoboticArmAnimator
|
<RoboticArmAnimator
|
||||||
HandleCallback={HandleCallback}
|
HandleCallback={HandleCallback}
|
||||||
restPosition={restPosition}
|
restPosition={restPosition}
|
||||||
|
|
|
@ -1,21 +1,19 @@
|
||||||
import React, { useEffect, useMemo, useRef, useState } from 'react'
|
import { useEffect, useMemo } from 'react'
|
||||||
import * as THREE from "three";
|
import * as THREE from "three";
|
||||||
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
|
import { DRACOLoader } from "three/examples/jsm/loaders/DRACOLoader";
|
||||||
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
|
import { GLTFLoader } from "three/examples/jsm/loaders/GLTFLoader";
|
||||||
import { clone } from "three/examples/jsm/utils/SkeletonUtils";
|
import { clone } from "three/examples/jsm/utils/SkeletonUtils";
|
||||||
import { useLoader, useThree } from "@react-three/fiber";
|
import { useLoader } from "@react-three/fiber";
|
||||||
import { CCDIKSolver, CCDIKHelper, } from "three/examples/jsm/animation/CCDIKSolver";
|
import { CCDIKSolver, CCDIKHelper } from "three/examples/jsm/animation/CCDIKSolver";
|
||||||
import { TransformControls } from '@react-three/drei';
|
|
||||||
|
|
||||||
type IKInstanceProps = {
|
type IKInstanceProps = {
|
||||||
modelUrl: string;
|
modelUrl: string;
|
||||||
ikSolver: any;
|
|
||||||
setIkSolver: any
|
setIkSolver: any
|
||||||
armBot: ArmBotStatus;
|
armBot: ArmBotStatus;
|
||||||
groupRef: any;
|
groupRef: any;
|
||||||
};
|
};
|
||||||
function IKInstance({ modelUrl, setIkSolver, ikSolver, armBot, groupRef }: IKInstanceProps) {
|
|
||||||
const { scene } = useThree()
|
function IKInstance({ modelUrl, setIkSolver, armBot, groupRef }: IKInstanceProps) {
|
||||||
const gltf = useLoader(GLTFLoader, modelUrl, (loader) => {
|
const gltf = useLoader(GLTFLoader, modelUrl, (loader) => {
|
||||||
const draco = new DRACOLoader();
|
const draco = new DRACOLoader();
|
||||||
draco.setDecoderPath("https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/libs/draco/");
|
draco.setDecoderPath("https://cdn.jsdelivr.net/npm/three@0.160.0/examples/jsm/libs/draco/");
|
||||||
|
@ -24,7 +22,6 @@ function IKInstance({ modelUrl, setIkSolver, ikSolver, armBot, groupRef }: IKIns
|
||||||
const cloned = useMemo(() => clone(gltf?.scene), [gltf]);
|
const cloned = useMemo(() => clone(gltf?.scene), [gltf]);
|
||||||
const targetBoneName = "Target";
|
const targetBoneName = "Target";
|
||||||
const skinnedMeshName = "link_0";
|
const skinnedMeshName = "link_0";
|
||||||
const [selectedArm, setSelectedArm] = useState<THREE.Group>();
|
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (!gltf) return;
|
if (!gltf) return;
|
||||||
|
@ -66,28 +63,21 @@ function IKInstance({ modelUrl, setIkSolver, ikSolver, armBot, groupRef }: IKIns
|
||||||
const solver = new CCDIKSolver(OOI.Skinned_Mesh, iks);
|
const solver = new CCDIKSolver(OOI.Skinned_Mesh, iks);
|
||||||
setIkSolver(solver);
|
setIkSolver(solver);
|
||||||
|
|
||||||
const helper = new CCDIKHelper(OOI.Skinned_Mesh, iks, 0.05)
|
// const helper = new CCDIKHelper(OOI.Skinned_Mesh, iks, 0.05)
|
||||||
|
|
||||||
setSelectedArm(OOI.Target_Bone);
|
|
||||||
|
|
||||||
// scene.add(helper);
|
// scene.add(helper);
|
||||||
|
|
||||||
}, [cloned, gltf, setIkSolver]);
|
}, [cloned, gltf]);
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<group ref={groupRef} position={armBot.position} rotation={armBot.rotation}>
|
||||||
<group ref={groupRef} position={armBot.position} rotation={armBot.rotation} onClick={() => {
|
<primitive
|
||||||
setSelectedArm(groupRef.current?.getObjectByName(targetBoneName))
|
uuid={`${armBot.modelUuid}_IK`}
|
||||||
}}>
|
object={cloned}
|
||||||
<primitive
|
scale={[1, 1, 1]}
|
||||||
uuid={`${armBot.modelUuid}_IK`}
|
name={armBot.modelName}
|
||||||
object={cloned}
|
/>
|
||||||
scale={[1, 1, 1]}
|
</group>
|
||||||
name={armBot.modelName}
|
|
||||||
/>
|
|
||||||
</group>
|
|
||||||
{/* {selectedArm && <TransformControls object={selectedArm} />} */}
|
|
||||||
</>
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,18 +1,20 @@
|
||||||
|
import { useViewSceneStore } from "../../../../store/builder/store";
|
||||||
import { useSceneContext } from "../../../scene/sceneContext";
|
import { useSceneContext } from "../../../scene/sceneContext";
|
||||||
import RoboticArmInstance from "./armInstance/roboticArmInstance";
|
import RoboticArmInstance from "./armInstance/roboticArmInstance";
|
||||||
// import RoboticArmContentUi from "../../ui3d/RoboticArmContentUi";
|
import RoboticArmContentUi from "../../ui3d/RoboticArmContentUi";
|
||||||
import React from "react";
|
import React from "react";
|
||||||
|
|
||||||
function RoboticArmInstances() {
|
function RoboticArmInstances() {
|
||||||
const {armBotStore} = useSceneContext();
|
const { armBotStore } = useSceneContext();
|
||||||
const { armBots } = armBotStore();
|
const { armBots } = armBotStore();
|
||||||
|
const { viewSceneLabels } = useViewSceneStore();
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
{armBots?.map((robot: ArmBotStatus) => (
|
{armBots?.map((robot: ArmBotStatus) => (
|
||||||
<React.Fragment key={robot.modelUuid}>
|
<React.Fragment key={robot.modelUuid}>
|
||||||
<RoboticArmInstance armBot={robot} />
|
<RoboticArmInstance armBot={robot} />
|
||||||
{/* <RoboticArmContentUi roboticArm={robot} /> */}
|
{viewSceneLabels && <RoboticArmContentUi roboticArm={robot} />}
|
||||||
</React.Fragment>
|
</React.Fragment>
|
||||||
))}
|
))}
|
||||||
</>
|
</>
|
||||||
|
|
|
@ -34,6 +34,7 @@ import { setFloorItemApi } from "../services/factoryBuilder/assest/floorAsset/se
|
||||||
import { useAssetsStore } from "../store/builder/useAssetStore";
|
import { useAssetsStore } from "../store/builder/useAssetStore";
|
||||||
import ComparisonSceneProvider from "../components/layout/scenes/ComparisonSceneProvider";
|
import ComparisonSceneProvider from "../components/layout/scenes/ComparisonSceneProvider";
|
||||||
import MainSceneProvider from "../components/layout/scenes/MainSceneProvider";
|
import MainSceneProvider from "../components/layout/scenes/MainSceneProvider";
|
||||||
|
import { useEventsStore } from "../store/simulation/useEventsStore";
|
||||||
|
|
||||||
const Project: React.FC = () => {
|
const Project: React.FC = () => {
|
||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
|
@ -46,7 +47,8 @@ const Project: React.FC = () => {
|
||||||
const { setWallItems } = useWallItems();
|
const { setWallItems } = useWallItems();
|
||||||
const { setZones } = useZones();
|
const { setZones } = useZones();
|
||||||
const { isVersionSaved } = useSaveVersion();
|
const { isVersionSaved } = useSaveVersion();
|
||||||
const { setProducts } = useProductStore();
|
const { setProducts, clearProducts } = useProductStore();
|
||||||
|
const { clearEvents } = useEventsStore();
|
||||||
const { projectId } = useParams();
|
const { projectId } = useParams();
|
||||||
const { setProjectName } = useProjectName();
|
const { setProjectName } = useProjectName();
|
||||||
|
|
||||||
|
@ -105,6 +107,8 @@ const Project: React.FC = () => {
|
||||||
setWallItems([]);
|
setWallItems([]);
|
||||||
setZones([]);
|
setZones([]);
|
||||||
setProducts([]);
|
setProducts([]);
|
||||||
|
clearProducts();
|
||||||
|
clearEvents();
|
||||||
setActiveModule("builder");
|
setActiveModule("builder");
|
||||||
const email = localStorage.getItem("email");
|
const email = localStorage.getItem("email");
|
||||||
if (email) {
|
if (email) {
|
||||||
|
|
|
@ -7,6 +7,7 @@ type EventsStore = {
|
||||||
// Event-level actions
|
// Event-level actions
|
||||||
addEvent: (event: EventsSchema) => void;
|
addEvent: (event: EventsSchema) => void;
|
||||||
removeEvent: (modelUuid: string) => void;
|
removeEvent: (modelUuid: string) => void;
|
||||||
|
clearEvents: () => void;
|
||||||
updateEvent: (modelUuid: string, updates: Partial<EventsSchema>) => EventsSchema | undefined;
|
updateEvent: (modelUuid: string, updates: Partial<EventsSchema>) => EventsSchema | undefined;
|
||||||
|
|
||||||
// Point-level actions
|
// Point-level actions
|
||||||
|
@ -61,6 +62,12 @@ export const useEventsStore = create<EventsStore>()(
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
clearEvents: () => {
|
||||||
|
set((state) => {
|
||||||
|
state.events = [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
updateEvent: (modelUuid, updates) => {
|
updateEvent: (modelUuid, updates) => {
|
||||||
let updatedEvent: EventsSchema | undefined;
|
let updatedEvent: EventsSchema | undefined;
|
||||||
set((state) => {
|
set((state) => {
|
||||||
|
|
|
@ -7,6 +7,7 @@ type ProductsStore = {
|
||||||
// Product-level actions
|
// Product-level actions
|
||||||
addProduct: (productName: string, productUuid: string) => void;
|
addProduct: (productName: string, productUuid: string) => void;
|
||||||
setProducts: (products: productsSchema) => void;
|
setProducts: (products: productsSchema) => void;
|
||||||
|
clearProducts: () => void;
|
||||||
removeProduct: (productUuid: string) => void;
|
removeProduct: (productUuid: string) => void;
|
||||||
updateProduct: (productUuid: string, updates: Partial<{ productName: string; eventDatas: EventsSchema[] }>) => void;
|
updateProduct: (productUuid: string, updates: Partial<{ productName: string; eventDatas: EventsSchema[] }>) => void;
|
||||||
|
|
||||||
|
@ -99,6 +100,12 @@ export const useProductStore = create<ProductsStore>()(
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
|
||||||
|
clearProducts: () => {
|
||||||
|
set((state) => {
|
||||||
|
state.products = [];
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
removeProduct: (productUuid) => {
|
removeProduct: (productUuid) => {
|
||||||
set((state) => {
|
set((state) => {
|
||||||
state.products = state.products.filter(p => p.productUuid !== productUuid);
|
state.products = state.products.filter(p => p.productUuid !== productUuid);
|
||||||
|
|
Loading…
Reference in New Issue