diff --git a/.gitignore b/.gitignore index 200ece6..55e3325 100644 --- a/.gitignore +++ b/.gitignore @@ -47,7 +47,7 @@ crashlytics-build.properties .DS_Store Thumbs.db Desktop.ini - +.amazonq/ # Python .venv/ .venv_step/ diff --git a/CoreSim/src/RobotTwin.CoreSim/Host/RealtimeHardening.cs b/CoreSim/src/RobotTwin.CoreSim/Host/RealtimeHardening.cs index 4f6ed71..d3e5e70 100644 --- a/CoreSim/src/RobotTwin.CoreSim/Host/RealtimeHardening.cs +++ b/CoreSim/src/RobotTwin.CoreSim/Host/RealtimeHardening.cs @@ -71,16 +71,22 @@ private static void TrySetAffinity(long affinityMask) #if NET5_0_OR_GREATER if (OperatingSystem.IsWindows()) { - typeof(Process).GetProperty("ProcessorAffinity")?.SetValue(process, affinityMask1); +#pragma warning disable CA1416 // Platform compatibility + process.ProcessorAffinity = affinityMask1; +#pragma warning restore CA1416 } else if (OperatingSystem.IsLinux()) { - typeof(Process).GetProperty("ProcessorAffinity")?.SetValue(process, affinityMask1); +#pragma warning disable CA1416 // Platform compatibility + process.ProcessorAffinity = affinityMask1; +#pragma warning restore CA1416 } #else if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows) || RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { - typeof(Process).GetProperty("ProcessorAffinity")?.SetValue(process, affinityMask1); +#pragma warning disable CA1416 // Platform compatibility + process.ProcessorAffinity = affinityMask1; +#pragma warning restore CA1416 } #endif } diff --git a/CoreSim/src/RobotTwin.CoreSim/Specs/AssemblySpec.cs b/CoreSim/src/RobotTwin.CoreSim/Specs/AssemblySpec.cs index 423c1f3..0edc49f 100644 --- a/CoreSim/src/RobotTwin.CoreSim/Specs/AssemblySpec.cs +++ b/CoreSim/src/RobotTwin.CoreSim/Specs/AssemblySpec.cs @@ -6,6 +6,7 @@ public class AssemblySpec { public List Parts { get; set; } = new List(); public List Wires { get; set; } = new List(); + public List Breadboards { get; set; } = new List(); } public class AssemblyPartSpec @@ -33,6 +34,17 @@ public class AssemblyWireSpec public double Damping { get; set; } = 0.2; } + public class BreadboardSpec + { + public string Id { get; set; } = string.Empty; + public int PinCount { get; set; } = 400; + public int Columns { get; set; } = 10; + public int Rows { get; set; } = 40; + public double Pitch { get; set; } = 0.00254; + public Vec3 Position { get; set; } = new Vec3(); + public Vec3 Rotation { get; set; } = new Vec3(); + public Vec3 Scale { get; set; } = new Vec3 { X = 1, Y = 1, Z = 1 }; + } public struct Vec3 { public double X { get; set; } diff --git a/RobotWin/Assets/Plugins/RobotTwin.CoreSim.dll b/RobotWin/Assets/Plugins/RobotTwin.CoreSim.dll index 0557865..30fe33d 100644 Binary files a/RobotWin/Assets/Plugins/RobotTwin.CoreSim.dll and b/RobotWin/Assets/Plugins/RobotTwin.CoreSim.dll differ diff --git a/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioBreadboard.cs b/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioBreadboard.cs new file mode 100644 index 0000000..5370137 --- /dev/null +++ b/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioBreadboard.cs @@ -0,0 +1,54 @@ +using UnityEngine; + +namespace RobotTwin.UI +{ + public class RobotStudioBreadboard : MonoBehaviour + { + public string Id; + public int PinCount; + public int Columns; + public int Rows; + public float Pitch; + public float Thickness; + public float Margin; + public float Width; + public float Depth; + public Renderer BoardRenderer; + + // Owned resources created at runtime (e.g., texture/material for the base). + // These are not Unity asset references and must be cleaned up to avoid leaks. + public Material OwnedMaterial; + public Texture2D OwnedTexture; + + public float TopSurfaceY => Thickness * 0.5f; + + private void OnDestroy() + { + // If we authored the shared material/texture at runtime, we own lifetime. + if (BoardRenderer != null && OwnedMaterial != null && BoardRenderer.sharedMaterial == OwnedMaterial) + { + BoardRenderer.sharedMaterial = null; + } + + DestroyOwnedResource(OwnedMaterial); + OwnedMaterial = null; + + DestroyOwnedResource(OwnedTexture); + OwnedTexture = null; + } + + private static void DestroyOwnedResource(Object resource) + { + if (resource == null) return; + + if (Application.isPlaying) + { + Destroy(resource); + } + else + { + DestroyImmediate(resource); + } + } + } +} diff --git a/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioBreadboard.cs.meta b/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioBreadboard.cs.meta new file mode 100644 index 0000000..41108a9 --- /dev/null +++ b/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioBreadboard.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: b0a645f82c464e32b72574af63390c7f diff --git a/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioController.cs b/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioController.cs index 6ed64ce..8bc0576 100644 --- a/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioController.cs +++ b/RobotWin/Assets/Scripts/UI/RobotStudio/RobotStudioController.cs @@ -389,6 +389,7 @@ public class RobotStudioController : MonoBehaviour private AssemblySpec _assemblySpec = new AssemblySpec(); private EnvironmentSpec _environmentSpec = new EnvironmentSpec(); private readonly Dictionary _assemblyItems = new Dictionary(StringComparer.OrdinalIgnoreCase); + private readonly Dictionary _breadboards = new Dictionary(StringComparer.OrdinalIgnoreCase); private readonly List _selectedAssemblyItems = new List(); private RobotStudioAssemblyItem _activeAssemblyItem; private AssemblyTool _assemblyTool = AssemblyTool.Select; @@ -404,7 +405,6 @@ public class RobotStudioController : MonoBehaviour private RobotStudioSimulationHost _simulationHost; private float _rotationSnapDegrees = 15f; private float _breadboardPitch = 0.00254f; - private float _breadboardRowWidth = 0.16f; private Material _assemblyFloorMaterial; private Material _placementGhostMaterial; @@ -424,6 +424,9 @@ public class RobotStudioController : MonoBehaviour private Button _assemblyFrameBtn; private Toggle _assemblySnapToggle; private TextField _assemblySnapField; + private TextField _breadboardPinCountField; + private TextField _breadboardColumnsField; + private TextField _breadboardPitchField; private Slider _environmentTempSlider; private Slider _environmentVibrationSlider; private Slider _environmentVibrationFreqSlider; @@ -599,6 +602,9 @@ private void BindUi() _assemblyFrameBtn = _root.Q