armbot conveyor bug fix

This commit is contained in:
2025-09-09 16:37:57 +05:30
parent 044af6d62d
commit 5482e185cd
4 changed files with 275 additions and 55 deletions

View File

@@ -55,15 +55,26 @@ const Simulations: React.FC = () => {
}; };
const handleAddProduct = () => { const handleAddProduct = () => {
const id = generateUUID(); if (selectedVersion) {
const name = `Product ${products.length + 1}`; const id = generateUUID();
addProduct(name, id); const name = `Product ${products.length + 1}`;
upsertProductOrEventApi({ addProduct(name, id);
productName: name, upsertProductOrEventApi({
productUuid: id, productName: name,
projectId: projectId, productUuid: id,
versionId: selectedVersion?.versionId || "", projectId: projectId,
}); versionId: selectedVersion?.versionId || "",
});
setSelectedProduct(id, name);
const data = {
productUuid: id,
productName: name,
versionUuid: selectedVersion.versionId,
versionName: selectedVersion.versionName,
};
setMainState(data);
}
}; };
const handleRemoveProduct = (productUuid: string) => { const handleRemoveProduct = (productUuid: string) => {

View File

@@ -1,45 +1,199 @@
import { useMemo } from 'react' import { useMemo, useState } from "react";
import { Color, DoubleSide, ShaderMaterial, Vector3 } from 'three'; import { Color, DoubleSide, ShaderMaterial, Vector3 } from "three";
import { useFrame } from "@react-three/fiber";
import { useSceneStore } from "../../../../../store/scene/useSceneStore";
function ZoneInstance({ zone }: { readonly zone: Zone }) { function ZoneInstance({ zone }: { readonly zone: Zone }) {
const zoneLayer = zone.points[0].layer; const zoneLayer = zone.points[0].layer;
const { limitFps } = useSceneStore();
const [time, setTime] = useState<number>();
// const zoneMaterial = useMemo(() => {
// return new ShaderMaterial({
// side: DoubleSide,
// vertexShader: `
// varying vec2 vUv;
// void main() {
// vUv = uv;
// gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
// }
// `,
// fragmentShader: `
// varying vec2 vUv;
// uniform vec3 uOuterColor;
// uniform float uTime;
// void main() {
// // Map vUv into -1..1 range like Shadertoy
// vec2 uv = (vUv - 1.0) * 0.5;
// // Distortion loop slowed down (uTime * 0.25)
// for (float i = 1.0; i < 8.0; i++) {
// uv.y += 0.1 * sin(uv.x * i * i + uTime * 0.25)
// * sin(uv.y * i * i + uTime * 0.25);
// }
// // Base color influenced by uv + zone color
// vec3 col = uOuterColor;
// col.r += uv.y * 0.2;
// col.g += uv.y * 0.3;
// col.b += uv.y * 0.4;
// // Fade vertically for a nicer top fade-out
// float verticalFade = 1.0 - vUv.y;
// gl_FragColor = vec4(col * verticalFade, verticalFade);
// }
// `,
// uniforms: {
// uOuterColor: { value: new Color(zone.zoneColor) },
// uTime: { value: time },
// },
// transparent: true,
// depthWrite: false,
// });
// }, [time]);
// const zoneMaterial = useMemo(() => {
// return new ShaderMaterial({
// side: DoubleSide,
// vertexShader: `
// varying vec2 vUv;
// void main(){
// vUv = uv;
// gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
// }
// `,
// fragmentShader: `
// varying vec2 vUv;
// uniform float uTime;
// uniform vec3 uOuterColor;
// void main() {
// // UV mapping like fragCoord
// vec2 uv = vUv;
// vec2 p = uv * 2.0 - 1.0;
// float t = uTime * 0.3;
// // Flow direction and movement
// vec2 flowDir = normalize(vec2(-0.7, -1.0));
// float flowSpeed = 2.0;
// float flow = dot(p, flowDir) * flowSpeed + t;
// // Ripples
// float rippleX = sin(p.x * 12.0 + t * 1.5) * cos(p.y * 8.0 + t * 2.0) * 0.3;
// float rippleY = cos(p.y * 10.0 - t * 1.2) * sin(p.x * 7.0 + t * 0.8) * 0.4;
// float distort = rippleX + rippleY;
// // Gradient to drive stripes
// float gradient = fract(flow + distort * 0.5);
// // Smooth liquid band
// float band = smoothstep(0.2, 0.6, gradient) - smoothstep(0.6, 0.9, gradient);
// // Darker zone color
// vec3 darkColor = uOuterColor * 0.4;
// // Mix between dark and bright zone color
// vec3 col = mix(darkColor, uOuterColor, band);
// // Vertical fade
// float verticalFade = 1.0 - vUv.y;
// gl_FragColor = vec4(col * verticalFade, verticalFade);
// }
// `,
// uniforms: {
// uOuterColor: { value: new Color(zone.zoneColor) },
// uTime: { value: time },
// },
// transparent: true,
// depthWrite: false,
// });
// }, [zone.zoneColor, time]);
const zoneMaterial = useMemo(() => { const zoneMaterial = useMemo(() => {
return new ShaderMaterial({ return new ShaderMaterial({
side: DoubleSide, side: DoubleSide,
vertexShader: ` vertexShader: `
varying vec2 vUv; varying vec2 vUv;
void main(){ void main() {
gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0); vUv = uv;
vUv = uv; gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);
} }
`, `,
fragmentShader: ` fragmentShader: `
varying vec2 vUv; #define TAU 6.28318530718
uniform vec3 uOuterColor; #define MAX_ITER 5
void main(){
float alpha = 1.0 - vUv.y; varying vec2 vUv;
gl_FragColor = vec4(uOuterColor, alpha); uniform float uTime;
} uniform vec3 uOuterColor;
`,
void main() {
float time = uTime * 0.25;
// uv in [0,1]
vec2 uv = vUv;
// convert to p space like Shadertoy
vec2 p = mod(uv * TAU, TAU) - 250.0;
vec2 i = vec2(p);
float c = 1.0;
float inten = 0.005;
for (int n = 0; n < MAX_ITER; n++) {
float t = time * (1.0 - (3.5 / float(n + 1)));
i = p + vec2(
cos(t - i.x) + sin(t + i.y),
sin(t - i.y) + cos(t + i.x)
);
c += 1.0 / length(vec2(
p.x / (sin(i.x + t) / inten),
p.y / (cos(i.y + t) / inten)
));
}
c /= float(MAX_ITER);
c = 1.17 - pow(c, 1.4);
// base fractal color
vec3 fractalCol = vec3(pow(abs(c), 8.0));
fractalCol = clamp(fractalCol + vec3(0.0, 0.35, 0.5), 0.0, 1.0);
// Mix between dark and bright zone color
vec3 darkColor = uOuterColor * 0.4;
vec3 col = mix(darkColor, uOuterColor, fractalCol.r);
// Vertical fade
float verticalFade = 1.0 - vUv.y;
gl_FragColor = vec4(col * verticalFade, verticalFade);
}
`,
uniforms: { uniforms: {
uOuterColor: { value: new Color(zone.zoneColor) }, uOuterColor: { value: new Color(zone.zoneColor) },
uTime: { value: time },
}, },
transparent: true, transparent: true,
depthWrite: false, depthWrite: false,
}) });
}, []); }, [zone.zoneColor, time]);
useFrame(({ clock }) => {
if (!limitFps) {
setTime(clock.getElapsedTime());
}
});
return ( return (
<mesh <mesh name={`Zone-${zone.zoneUuid}`} userData={zone}>
name={`Zone-${zone.zoneUuid}`}
userData={zone}
>
{zone.points.map((point, index: number) => { {zone.points.map((point, index: number) => {
const nextPoint = zone.points[(index + 1) % zone.points.length]; const nextPoint = zone.points[(index + 1) % zone.points.length];
const point1 = new Vector3(point.position[0], point.position[1], point.position[2]); const point1 = new Vector3(...point.position);
const point2 = new Vector3(nextPoint.position[0], nextPoint.position[1], nextPoint.position[2]); const point2 = new Vector3(...nextPoint.position);
const planeWidth = point1.distanceTo(point2); const planeWidth = point1.distanceTo(point2);
const planeHeight = zone.zoneHeight; const planeHeight = zone.zoneHeight;
@@ -49,22 +203,14 @@ function ZoneInstance({ zone }: { readonly zone: Zone }) {
const angle = Math.atan2(point2.z - point1.z, point2.x - point1.x); const angle = Math.atan2(point2.z - point1.z, point2.x - point1.x);
return ( return (
<mesh <mesh key={index} position={midpoint} rotation={[0, -angle, 0]}>
key={index}
position={midpoint}
rotation={[0, -angle, 0]}
>
<planeGeometry args={[planeWidth, planeHeight]} /> <planeGeometry args={[planeWidth, planeHeight]} />
<primitive <primitive object={zoneMaterial.clone()} attach="material" />
object={zoneMaterial.clone()}
attach="material"
/>
</mesh> </mesh>
); );
})} })}
</mesh>
</ mesh> );
)
} }
export default ZoneInstance export default ZoneInstance;

View File

@@ -547,7 +547,6 @@ const DuplicationControls3D = () => {
projectId, projectId,
}; };
console.log("socket: ", socket);
if (!socket?.connected) { if (!socket?.connected) {
// REST // REST

View File

@@ -134,7 +134,12 @@ export function useTriggerHandler() {
if (action) { if (action) {
if (armBot) { if (armBot) {
if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "vehicle") { if (model?.type === "vehicle") {
@@ -161,7 +166,12 @@ export function useTriggerHandler() {
addArmBotToMonitor(armBot.modelUuid, () => { addArmBotToMonitor(armBot.modelUuid, () => {
const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || ""); const vehicle = getVehicleById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || "");
if (vehicle) { if (vehicle) {
if (vehicle.isActive === false && vehicle.state === "idle" && vehicle.isPicking && vehicle.currentLoad < vehicle.point.action.loadCapacity) { if (
vehicle.isActive === false &&
vehicle.state === "idle" &&
vehicle.isPicking &&
vehicle.currentLoad < vehicle.point.action.loadCapacity
) {
// Handle current action from vehicle // Handle current action from vehicle
setIsPaused(materialId, true); setIsPaused(materialId, true);
handleAction(action, materialId); handleAction(action, materialId);
@@ -192,6 +202,21 @@ export function useTriggerHandler() {
} }
}); });
} }
} else if (model?.type === "transfer") {
const armBot = getArmBotById(trigger.triggeredAsset?.triggeredModel.modelUuid);
if (armBot) {
setIsPaused(materialId, true);
addArmBotToMonitor(armBot.modelUuid, () => {
const conveyor = getConveyorById(action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid || "");
if (conveyor) {
setIsPaused(materialId, true);
addConveyorToMonitor(conveyor.modelUuid, () => {
handleAction(action, materialId);
});
}
});
}
} else { } else {
if (armBot.isActive === false && armBot.state === "idle") { if (armBot.isActive === false && armBot.state === "idle") {
// Handle current action from arm bot // Handle current action from arm bot
@@ -249,7 +274,12 @@ export function useTriggerHandler() {
if (action) { if (action) {
if (human) { if (human) {
if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "vehicle") { if (model?.type === "vehicle") {
@@ -370,7 +400,12 @@ export function useTriggerHandler() {
if (action) { if (action) {
if (crane) { if (crane) {
if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "human") { if (model?.type === "human") {
@@ -580,7 +615,12 @@ export function useTriggerHandler() {
if (action) { if (action) {
if (crane) { if (crane) {
if (action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "human") { if (model?.type === "human") {
@@ -818,7 +858,13 @@ export function useTriggerHandler() {
const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid);
if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action &&
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "roboticArm") { if (model?.type === "roboticArm") {
@@ -1104,7 +1150,13 @@ export function useTriggerHandler() {
const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid);
if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action &&
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "roboticArm") { if (model?.type === "roboticArm") {
@@ -1214,7 +1266,13 @@ export function useTriggerHandler() {
const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid);
if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action &&
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "roboticArm") { if (model?.type === "roboticArm") {
@@ -1327,7 +1385,13 @@ export function useTriggerHandler() {
const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid); const action = getActionByUuid(selectedProduct.productUuid, trigger.triggeredAsset.triggeredAction.actionUuid);
if (action && action.triggers.length > 0 && action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid && action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid && action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid) { if (
action &&
action.triggers.length > 0 &&
action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid &&
action.triggers[0]?.triggeredAsset?.triggeredAction?.actionUuid &&
action.triggers[0]?.triggeredAsset?.triggeredPoint?.pointUuid
) {
const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid); const model = getEventByModelUuid(selectedProduct.productUuid, action.triggers[0]?.triggeredAsset?.triggeredModel.modelUuid);
if (model?.type === "roboticArm") { if (model?.type === "roboticArm") {