using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using RobotNet.VDA5050.Type; namespace RobotNet10.MapManager.Data; /// /// Edge vehicle property - Vehicle-specific properties for edges /// Maps to VDMA LIF: edge.vehicleTypeEdgeProperties[] /// [Table("EdgeVehicleProperties")] public class EdgeVehicleProperty { [Key] [DatabaseGenerated(DatabaseGeneratedOption.Identity)] public Guid Id { get; set; } /// /// Edge reference /// [Required] public Guid EdgeId { get; set; } /// /// Vehicle type reference /// [Required] public Guid VehicleTypeId { get; set; } /// /// Vehicle orientation while traversing edge (VDMA LIF: vehicleOrientation) - Optional /// In degrees, range: [0.0 ... 360.0] /// public double? VehicleOrientation { get; set; } /// /// Type of orientation (VDMA LIF: orientationType) - Optional /// Values: GLOBAL, TANGENTIAL /// public OrientationType? OrientationType { get; set; } /// /// Is rotation allowed while on edge (VDMA LIF: rotationAllowed) - Optional /// public bool? RotationAllowed { get; set; } /// /// Rotation allowed at start node (VDMA LIF: rotationAtStartNodeAllowed) - Optional /// Values: NONE, CCW, CW, BOTH /// public RotationDirection? RotationAtStartNodeAllowed { get; set; } /// /// Rotation allowed at end node (VDMA LIF: rotationAtEndNodeAllowed) - Optional /// Values: NONE, CCW, CW, BOTH /// public RotationDirection? RotationAtEndNodeAllowed { get; set; } /// /// Maximum speed allowed on edge (VDMA LIF: maxSpeed) - Optional /// In meters per second, range: [0.0 ... double.MaxValue] /// public double? MaxSpeed { get; set; } /// /// Maximum rotation speed allowed (VDMA LIF: maxRotationSpeed) - Optional /// In radians per second, range: [0.0 ... double.MaxValue] /// public double? MaxRotationSpeed { get; set; } /// /// Minimum height of vehicle on edge (VDMA LIF: minHeight) - Optional /// In meters, range: [0.0 ... double.MaxValue] /// public double? MinHeight { get; set; } /// /// Maximum height of vehicle on edge (VDMA LIF: maxHeight) - Optional /// In meters, range: [0.0 ... double.MaxValue] /// public double? MaxHeight { get; set; } /// /// Can edge be traversed without load (VDMA LIF: loadRestriction.unloaded) - Optional /// public bool? LoadRestriction_Unloaded { get; set; } /// /// Can edge be traversed with load (VDMA LIF: loadRestriction.loaded) - Optional /// public bool? LoadRestriction_Loaded { get; set; } /// /// Load set names allowed on edge (VDMA LIF: loadRestriction.loadSetNames) - Optional /// JSON array of strings: ["pallet", "box"] /// public string? LoadRestriction_LoadSetNames { get; set; } /// /// Trajectory degree (NURBS curve degree) - Optional /// Values: 1 (linear), 2 (quadratic), 3 (cubic) /// public int? TrajectoryDegree { get; set; } /// /// Trajectory control point 1 X coordinate (meters) - Optional /// Used for degree 2 and 3 curves /// public double? TrajectoryControlPoint1X { get; set; } /// /// Trajectory control point 1 Y coordinate (meters) - Optional /// Used for degree 2 and 3 curves /// public double? TrajectoryControlPoint1Y { get; set; } /// /// Trajectory control point 2 X coordinate (meters) - Optional /// Used for degree 3 curves only /// public double? TrajectoryControlPoint2X { get; set; } /// /// Trajectory control point 2 Y coordinate (meters) - Optional /// Used for degree 3 curves only /// public double? TrajectoryControlPoint2Y { get; set; } /// /// Actions that vehicle can perform at this edge (VDMA LIF: actions) - Optional /// JSON array format: /// [ /// { /// "actionType": "pick", /// "actionDescription": "...", /// "requirementType": "REQUIRED", /// "blockingType": "HARD", /// "actionParameters": [{"key": "...", "value": "..."}] /// } /// ] /// public string? Actions { get; set; } /// /// Corridor left width (meters) - Optional /// Defines the width of the corridor to the left related to the trajectory /// public double? CorridorLeftWidth { get; set; } /// /// Corridor right width (meters) - Optional /// Defines the width of the corridor to the right related to the trajectory /// public double? CorridorRightWidth { get; set; } /// /// Corridor reference point (VDA5050: corridorRefPoint) - Optional /// Defines whether the boundaries are valid for the kinematic center or the contour of the vehicle /// Values: KINEMATICCENTER, CONTOUR /// public CorridorRefPoint? CorridorRefPoint { get; set; } // Navigation properties [ForeignKey(nameof(EdgeId))] public virtual Edge Edge { get; set; } = null!; [ForeignKey(nameof(VehicleTypeId))] public virtual VehicleType VehicleType { get; set; } = null!; }