Spaces:
Running
Running
| import React from "react"; | |
| import { Weight, Activity, Layers, Cog } from "lucide-react"; | |
| import ParameterItem from "./ui/parameter-item"; | |
| import { useUrdf } from "@/hooks/useUrdf"; | |
| const RobotParameters: React.FC = () => { | |
| // Get robot data from the UrdfContext | |
| const { currentRobotData } = useUrdf(); | |
| // If no data is available, show an error message | |
| if (!currentRobotData) { | |
| return ( | |
| <div className="sidebar-section"> | |
| <h3 className="text-base font-semibold mb-3 font-mono">Parameters</h3> | |
| <div className="p-4 text-red-500 border border-red-300 rounded-lg"> | |
| No robot parameters available | |
| </div> | |
| </div> | |
| ); | |
| } | |
| // Use data from the context | |
| const data = currentRobotData; | |
| // Format the mass with units | |
| const formatMass = (mass?: number) => { | |
| return mass ? `${mass.toFixed(1)}kg` : "Unknown"; | |
| }; | |
| // Create sub-items for links with masses | |
| const massSubItems = | |
| data?.links | |
| ?.filter((link) => link.name && link.mass !== undefined && link.mass > 0) | |
| .map((link) => ({ | |
| label: link.name || "Unnamed Link", | |
| value: `${link.mass?.toFixed(1)}kg`, | |
| })) || []; | |
| // Create sub-items for joint types | |
| const jointSubItems = []; | |
| if (data?.joints?.revolute) { | |
| jointSubItems.push({ label: "Revolute", value: data.joints.revolute }); | |
| } | |
| if (data?.joints?.prismatic) { | |
| jointSubItems.push({ label: "Prismatic", value: data.joints.prismatic }); | |
| } | |
| if (data?.joints?.other) { | |
| jointSubItems.push({ label: "Other", value: data.joints.other }); | |
| } | |
| if (data?.joints?.continuous) { | |
| jointSubItems.push({ label: "Continuous", value: data.joints.continuous }); | |
| } | |
| if (data?.joints?.fixed) { | |
| jointSubItems.push({ label: "Fixed", value: data.joints.fixed }); | |
| } | |
| // Create sub-items for materials | |
| const materialSubItems = | |
| data.materials | |
| ?.filter((material) => material.name && material.percentage) | |
| .map((material) => ({ | |
| label: material.name || "Unknown Material", | |
| value: `${material.percentage}%`, | |
| })) || []; | |
| return ( | |
| <div className="sidebar-section"> | |
| <h3 className="text-base font-semibold mb-3 font-mono">Parameters</h3> | |
| <div className="space-y-2"> | |
| <ParameterItem | |
| label="Mass" | |
| value={formatMass(data.mass)} | |
| icon={<Weight size={18} />} | |
| color="bg-sidebar/50 dark:bg-sidebar-accent/30" | |
| subItems={massSubItems.length > 0 ? massSubItems : undefined} | |
| /> | |
| <ParameterItem | |
| label="DoFs" | |
| value={data.dofs !== undefined ? data.dofs : "Unknown"} | |
| icon={<Activity size={18} />} | |
| color="bg-sidebar/50 dark:bg-sidebar-accent/30" | |
| /> | |
| <ParameterItem | |
| label="Materials" | |
| value={ | |
| materialSubItems.length > 0 | |
| ? `${materialSubItems.length} materials` | |
| : "Unknown" | |
| } | |
| icon={<Layers size={18} />} | |
| color="bg-sidebar/50 dark:bg-sidebar-accent/30" | |
| subItems={materialSubItems.length > 0 ? materialSubItems : undefined} | |
| /> | |
| <ParameterItem | |
| label="Joints" | |
| value={ | |
| jointSubItems.length > 0 | |
| ? jointSubItems.length + " types" | |
| : "Unknown" | |
| } | |
| icon={<Cog size={18} />} | |
| color="bg-sidebar/50 dark:bg-sidebar-accent/30" | |
| subItems={jointSubItems.length > 0 ? jointSubItems : undefined} | |
| /> | |
| </div> | |
| </div> | |
| ); | |
| }; | |
| export default RobotParameters; | |