From 0401be3d23274b9a0410a60bdd822ecd931fecb7 Mon Sep 17 00:00:00 2001 From: UVCLimHun Date: Thu, 26 Feb 2026 14:04:33 +0900 Subject: [PATCH] refactoring2 --- Assets/Prefabs/컨베이어모듈.meta | 8 - Assets/Scenes/Simulation_0.0.1.meta | 8 - Assets/Scenes/models.meta | 8 - .../Scripts/Simulator/Components/AGV/AGV.cs | 22 +- .../Components/ASRS/ASRSComponent.cs | 3 +- .../Simulator/Components/ASRS/StackerCrane.cs | 2 +- .../Components/ComponentMqttHandler.cs | 84 +- .../Components/ComponentPoolManager.cs | 249 ++--- .../Simulator/Components/ComponentUIBinder.cs | 89 ++ .../Components/ComponentUIBinder.cs.meta | 2 + .../Simulator/Components/ComponentsManager.cs | 104 ++- .../Components/Conveyor/ConveyorComponent.cs | 11 +- .../Components/Conveyor/ConveyorManager.cs | 9 +- .../Components/Conveyor/NodeComponent.cs | 1 - .../Simulator/Components/QueueComponent.cs | 3 +- .../Simulator/Components/RackComponent.cs | 7 +- .../Resource/Processor/ProcessorComponent.cs | 107 +-- .../Resource/RobotArm/RobotArmComponent.cs | 5 +- .../Simulator/Components/SinkComponent.cs | 4 +- .../Simulator/Components/SourceComponent.cs | 24 +- .../Scripts/Simulator/Model/EntityManager.cs | 32 +- .../UI/PropertyWindow/ASRSProperty.cs | 880 +----------------- .../UI/PropertyWindow/NodeProperty.cs | 147 +-- .../PropertyWindow/PolicyPropertyBuilder.cs | 127 +++ .../PolicyPropertyBuilder.cs.meta | 2 + .../UI/PropertyWindow/ProcessorProperty.cs | 452 +-------- .../UI/PropertyWindow/QueueProperty.cs | 150 +-- .../UI/PropertyWindow/RackProperty.cs | 450 +-------- .../UI/PropertyWindow/RobotArmProperty.cs | 456 +-------- .../UI/PropertyWindow/SourceProperty.cs | 440 +-------- 30 files changed, 708 insertions(+), 3178 deletions(-) delete mode 100644 Assets/Prefabs/컨베이어모듈.meta delete mode 100644 Assets/Scenes/Simulation_0.0.1.meta delete mode 100644 Assets/Scenes/models.meta create mode 100644 Assets/Scripts/Simulator/Components/ComponentUIBinder.cs create mode 100644 Assets/Scripts/Simulator/Components/ComponentUIBinder.cs.meta create mode 100644 Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs create mode 100644 Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs.meta diff --git a/Assets/Prefabs/컨베이어모듈.meta b/Assets/Prefabs/컨베이어모듈.meta deleted file mode 100644 index 86f8ba4b..00000000 --- a/Assets/Prefabs/컨베이어모듈.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 48bd80d0fe077574388d4c5c7d32c255 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scenes/Simulation_0.0.1.meta b/Assets/Scenes/Simulation_0.0.1.meta deleted file mode 100644 index 44074473..00000000 --- a/Assets/Scenes/Simulation_0.0.1.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: dd4d490ff1fd612479a50c9cb6cb6f37 -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scenes/models.meta b/Assets/Scenes/models.meta deleted file mode 100644 index 544a59ac..00000000 --- a/Assets/Scenes/models.meta +++ /dev/null @@ -1,8 +0,0 @@ -fileFormatVersion: 2 -guid: 286e7bca5a98c2e4a8438c8805cef93f -folderAsset: yes -DefaultImporter: - externalObjects: {} - userData: - assetBundleName: - assetBundleVariant: diff --git a/Assets/Scripts/Simulator/Components/AGV/AGV.cs b/Assets/Scripts/Simulator/Components/AGV/AGV.cs index 2f0dd01d..1d625237 100644 --- a/Assets/Scripts/Simulator/Components/AGV/AGV.cs +++ b/Assets/Scripts/Simulator/Components/AGV/AGV.cs @@ -91,7 +91,27 @@ namespace Simulator.Data.Transport public override void SetEntity(string key, string name = "") { - PlaceNext(EntityManager.Instance.GetEntity(key, this, name)); + PlaceNext(EntityManager.Instance.GetEntity(key, name)); + } + + private void OnEnable() + { + if (EntityManager.Instance != null) + EntityManager.Instance.OnEntityTransferred += HandleEntityTransferred; + } + + private void OnDisable() + { + if (EntityManager.Instance != null) + EntityManager.Instance.OnEntityTransferred -= HandleEntityTransferred; + } + + private void HandleEntityTransferred(Entity entity) + { + if (possessEntities.Contains(entity)) + { + DecreaseEntity(entity); + } } public void LoadEntity(DataObject agvData) diff --git a/Assets/Scripts/Simulator/Components/ASRS/ASRSComponent.cs b/Assets/Scripts/Simulator/Components/ASRS/ASRSComponent.cs index d6ca513c..08df3a35 100644 --- a/Assets/Scripts/Simulator/Components/ASRS/ASRSComponent.cs +++ b/Assets/Scripts/Simulator/Components/ASRS/ASRSComponent.cs @@ -18,7 +18,6 @@ public class ASRSComponent : ComponentBase SetRack(); SetStackerCrane(asrsData.asrs_layout); SetPort(); - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; asrsData.asrs_layout.onLayoutChanged += SetRack; asrsData.asrs_layout.onLayoutChanged += SetPort; asrsData.asrs_layout.onLayoutChanged += FitCollider; @@ -55,7 +54,7 @@ public class ASRSComponent : ComponentBase public override void SetEntity(string key, string name = "") { - var entity = EntityManager.Instance.GetEntity(key, this, name); + var entity = EntityManager.Instance.GetEntity(key, name); rack.SetASRSQueue(entity); } diff --git a/Assets/Scripts/Simulator/Components/ASRS/StackerCrane.cs b/Assets/Scripts/Simulator/Components/ASRS/StackerCrane.cs index 187bcea8..d1749648 100644 --- a/Assets/Scripts/Simulator/Components/ASRS/StackerCrane.cs +++ b/Assets/Scripts/Simulator/Components/ASRS/StackerCrane.cs @@ -191,7 +191,7 @@ public class StackerCrane : ComponentBase return; } - var entity = EntityManager.Instance?.GetEntity(_entityId, this); + var entity = EntityManager.Instance?.GetEntity(_entityId); if (entity == null) { Debug.LogWarning($"[StackerCrane] Entity({_entityId})를 찾을 수 없습니다."); diff --git a/Assets/Scripts/Simulator/Components/ComponentMqttHandler.cs b/Assets/Scripts/Simulator/Components/ComponentMqttHandler.cs index f9ada6bb..33fa61f3 100644 --- a/Assets/Scripts/Simulator/Components/ComponentMqttHandler.cs +++ b/Assets/Scripts/Simulator/Components/ComponentMqttHandler.cs @@ -39,43 +39,20 @@ namespace Simulator.Data public void OnUpdateData(IDataObject data, ComponentType type) { - if (data == null) return; - - DataObject obj = data as DataObject; - if (obj == null) return; + if (data is not DataObject obj) return; string componentId = obj.GetString("component_id"); switch (type) { case ComponentType.Source: - if (string.Equals(obj.GetString("event_name"), "completed")) - { - _poolManager.FindActiveItem(type, componentId)?.GetModelData(obj); - } - break; case ComponentType.Sink: - if (string.Equals(obj.GetString("event_name"), "completed")) - { - _poolManager.FindActiveItem(type, componentId)?.GetModelData(obj); - } - break; case ComponentType.Queue: if (string.Equals(obj.GetString("event_name"), "completed")) - { _poolManager.FindActiveItem(type, componentId)?.GetModelData(obj); - } break; case ComponentType.Rack: - var rack = _poolManager.FindActiveItem(type, componentId) as RackComponent; - if (string.Equals(obj.GetString("event_name"), "entity_stored")) - { - rack?.GetModelData(obj); - } - if (string.Equals(obj.GetString("event_name"), "inventory_initialized")) - { - rack?.InitializeQueue(obj); - } + HandleRackEvent(obj, componentId); break; case ComponentType.ASRS: case ComponentType.RobotArm: @@ -86,31 +63,46 @@ namespace Simulator.Data } } + private void HandleRackEvent(DataObject obj, string componentId) + { + var rack = _poolManager.FindActiveItem(ComponentType.Rack, componentId) as RackComponent; + if (rack == null) return; + + switch (obj.GetString("event_name")) + { + case "entity_stored": rack.GetModelData(obj); break; + case "inventory_initialized": rack.InitializeQueue(obj); break; + } + } + public void SetMQTT(SimulatorCodeDataClass sdata, LogicDetailData logicDetailData) { - if (logicDetailData.transport_system != null) + InitTransportAGVs(logicDetailData); + SubscribeConveyors(logicDetailData); + } + + private void InitTransportAGVs(LogicDetailData logicDetailData) + { + var managers = logicDetailData.transport_system?.transport_managers; + if (managers is not { Count: > 0 }) return; + + foreach (var manager in managers) { - if (logicDetailData.transport_system.transport_managers != null && logicDetailData.transport_system.transport_managers.Count >= 1) - { - foreach (var transport_manager in logicDetailData.transport_system.transport_managers) - { - if (transport_manager.vehicle_fleets != null && transport_manager.vehicle_fleets.Count >= 1) - { - foreach (var vehicle_fleet in transport_manager.vehicle_fleets) - { - AGVManager.Instance.InitAGV(vehicle_fleet.vehicles); - } - } - } - } - } - if (logicDetailData.production_system.conveyors != null && logicDetailData.production_system.conveyors.Count >= 1) - { - foreach (var conveyor in logicDetailData.production_system.conveyors) - { - ConveyorManager.Instance.SubscribeConveyor(conveyor); - } + var fleets = manager.vehicle_fleets; + if (fleets is not { Count: > 0 }) continue; + + foreach (var fleet in fleets) + AGVManager.Instance.InitAGV(fleet.vehicles); } } + + private void SubscribeConveyors(LogicDetailData logicDetailData) + { + var conveyors = logicDetailData.production_system?.conveyors; + if (conveyors is not { Count: > 0 }) return; + + foreach (var conveyor in conveyors) + ConveyorManager.Instance.SubscribeConveyor(conveyor); + } } } diff --git a/Assets/Scripts/Simulator/Components/ComponentPoolManager.cs b/Assets/Scripts/Simulator/Components/ComponentPoolManager.cs index 7d966183..cd7a53fa 100644 --- a/Assets/Scripts/Simulator/Components/ComponentPoolManager.cs +++ b/Assets/Scripts/Simulator/Components/ComponentPoolManager.cs @@ -38,92 +38,76 @@ namespace Simulator.Data public IReadOnlyDictionary DataMappers => _dataMapperDict; + private ComponentUIBinder _uiBinder; + public ComponentUIBinder UIBinder => _uiBinder; + public ComponentPoolManager(Transform parentTransform) { _parentTransform = parentTransform; } + public void InitializeUIBinder() + { + _uiBinder = new ComponentUIBinder(); + _uiBinder.Initialize(); + } + public void InitializeAllPools() { - InitializeSourcePoolAsync().ContinueWith(() => - { - var mask = new DataMask(); - mask.ObjectName = "Source"; - mask.ObjectIdKey = "component_id"; - mask["component_id"] = ""; - mask["event_name"] = ""; - mask["timestamp"] = new DateTime(); - mask["data"] = new DataMask() - { - ["entity_ids"] = new List(), - ["total_entity"] = 0 - }; - _dataMapperDict.Add(ComponentType.Source, new DataMapper(mask)); - }); + InitializeSourcePoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.Source, CreateDataMapper(ComponentType.Source))); + InitializeSinkPoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.Sink, CreateDataMapper(ComponentType.Sink))); + InitializeQueuePoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.Queue, null)); + InitializeRackPoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.Rack, CreateDataMapper(ComponentType.Rack))); + InitializeAsrsPoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.ASRS, CreateDataMapper(ComponentType.ASRS))); + InitializeRobotArmPoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.RobotArm, CreateDataMapper(ComponentType.RobotArm))); + InitializeProcessorPoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.Processor, CreateDataMapper(ComponentType.Processor))); + InitializeWorkerPoolAsync().ContinueWith(() => _dataMapperDict.Add(ComponentType.Worker, CreateDataMapper(ComponentType.Worker))); + } - InitializeSinkPoolAsync().ContinueWith(() => + private DataMapper CreateDataMapper(ComponentType type) + { + switch (type) { - var mask = new DataMask(); - mask.ObjectName = "Sink"; - mask.ObjectIdKey = "component_id"; - mask["component_id"] = ""; - mask["event_name"] = ""; - mask["timestamp"] = new DateTime(); - mask["data"] = new DataMask() - { - ["entity_ids"] = new List(), - }; - _dataMapperDict.Add(ComponentType.Sink, new DataMapper(mask)); - }); + case ComponentType.Source: + return new DataMapper(CreateEventMask("Source", new DataMask + { + ["entity_ids"] = new List(), + ["total_entity"] = 0 + })); + case ComponentType.Sink: + return new DataMapper(CreateEventMask("Sink", new DataMask + { + ["entity_ids"] = new List() + })); + case ComponentType.RobotArm: + return new DataMapper(CreateEventMask("RobotArm", new DataMask + { + ["entity_id"] = "", + ["processing_time"] = 0.0f, + ["from"] = "", + ["to"] = "" + })); + case ComponentType.Rack: + return new DataMapper(new DataMask { ObjectName = "rack", ObjectIdKey = "component_id" }); + case ComponentType.ASRS: + return new DataMapper(new DataMask { ObjectName = "asrs", ObjectIdKey = "component_id" }); + default: + return new DataMapper(new DataMask()); + } + } - InitializeQueuePoolAsync().ContinueWith(() => + private DataMask CreateEventMask(string objectName, DataMask dataMask) + { + var mask = new DataMask { - _dataMapperDict.Add(ComponentType.Queue, null); - }); - - InitializeRackPoolAsync().ContinueWith(() => - { - var mask = new DataMask(); - mask.ObjectName = "rack"; - mask.ObjectIdKey = "component_id"; - _dataMapperDict.Add(ComponentType.Rack, new DataMapper(mask)); - }); - - InitializeAsrsPoolAsync().ContinueWith(() => - { - var mask = new DataMask(); - mask.ObjectName = "asrs"; - mask.ObjectIdKey = "component_id"; - _dataMapperDict.Add(ComponentType.ASRS, new DataMapper(mask)); - }); - - InitializeRobotArmPoolAsync().ContinueWith(() => - { - var mask = new DataMask(); - mask.ObjectName = "RobotArm"; - mask.ObjectIdKey = "component_id"; - mask["component_id"] = ""; - mask["event_name"] = ""; - mask["timestamp"] = new DateTime(); - mask["data"] = new DataMask() - { - ["entity_id"] = "", - ["processing_time"] = 0.0f, - ["from"] = "", - ["to"] = "" - }; - _dataMapperDict.Add(ComponentType.RobotArm, new DataMapper(mask)); - }); - - InitializeProcessorPoolAsync().ContinueWith(() => - { - _dataMapperDict.Add(ComponentType.Processor, new DataMapper(new DataMask())); - }); - - InitializeWorkerPoolAsync().ContinueWith(() => - { - _dataMapperDict.Add(ComponentType.Worker, new DataMapper(new DataMask())); - }); + ObjectName = objectName, + ObjectIdKey = "component_id", + ["component_id"] = "", + ["event_name"] = "", + ["timestamp"] = new DateTime(), + ["data"] = dataMask + }; + return mask; } #region Pool Initialization @@ -198,96 +182,47 @@ namespace Simulator.Data { var registry = new Dictionary(); - if (data.production_system != null) + var ps = data.production_system; + if (ps != null) { - if (data.production_system.sources != null) - { - foreach (var component in data.production_system.sources) - { - var source = _sourcePool.GetItem($"{component.name}"); - source.componentType = ComponentType.Source; - source.SetComponent(component); - registry.Add(component.name, source); - } - } - if (data.production_system.sinks != null) - { - foreach (var component in data.production_system.sinks) - { - var sink = _sinkPool.GetItem($"{component.name}"); - sink.componentType = ComponentType.Sink; - sink.SetComponent(component); - registry.Add(component.name, sink); - } - } - if (data.production_system.racks != null) - { - foreach (var component in data.production_system.racks) - { - var rack = _rackPool.GetItem($"{component.name}"); - rack.componentType = ComponentType.Rack; - rack.SetComponent(component); - registry.Add(component.name, rack); - } - } - if (data.production_system.asrs != null) - { - foreach (var component in data.production_system.asrs) - { - var asrs = _asrsPool.GetItem($"{component.name}"); - asrs.componentType = ComponentType.ASRS; - asrs.SetComponent(component); - registry.Add(component.name, asrs); - } - } - if (data.production_system.robot_arms != null) - { - foreach (var component in data.production_system.robot_arms) - { - var robotArm = _robotArmPool.GetItem($"{component.name}"); - robotArm.componentType = ComponentType.RobotArm; - robotArm.SetComponent(component); - registry.Add(component.name, robotArm); - } - } - if (data.production_system.processors != null) - { - foreach (var component in data.production_system.processors) - { - var processor = _processorPool.GetItem($"{component.name}"); - processor.componentType = ComponentType.Processor; - processor.SetComponent(component); - registry.Add(component.name, processor); - } - } + SpawnGroup(ps.sources, _sourcePool, ComponentType.Source, (c, d) => c.SetComponent(d), registry); + SpawnGroup(ps.sinks, _sinkPool, ComponentType.Sink, (c, d) => c.SetComponent(d), registry); + SpawnGroup(ps.racks, _rackPool, ComponentType.Rack, (c, d) => c.SetComponent(d), registry); + SpawnGroup(ps.asrs, _asrsPool, ComponentType.ASRS, (c, d) => c.SetComponent(d), registry); + SpawnGroup(ps.robot_arms, _robotArmPool, ComponentType.RobotArm, (c, d) => c.SetComponent(d), registry); + SpawnGroup(ps.processors, _processorPool, ComponentType.Processor, (c, d) => c.SetComponent(d), registry); } - if (data.infrastructure != null) + + var infra = data.infrastructure; + if (infra != null) { - if (data.infrastructure.queues != null) - { - foreach (var component in data.infrastructure.queues) - { - var queue = _queuePool.GetItem($"{component.name}"); - queue.componentType = ComponentType.Queue; - queue.SetComponent(component); - registry.Add(component.name, queue); - } - } - if (data.infrastructure.resources != null) - { - foreach (var component in data.infrastructure.resources) - { - var worker = _workerPool.GetItem($"{component.name}"); - worker.componentType = ComponentType.Worker; - worker.SetComponent(component); - registry.Add(component.name, worker); - } - } + SpawnGroup(infra.queues, _queuePool, ComponentType.Queue, (c, d) => c.SetComponent(d), registry); + SpawnGroup(infra.resources, _workerPool, ComponentType.Worker, (c, d) => c.SetComponent(d), registry); } return registry; } + private void SpawnGroup( + List items, + GameObjectPool pool, + ComponentType type, + Action setup, + Dictionary registry) + where TComp : ComponentBase + where TData : ComponentDataBase + { + if (items == null) return; + foreach (var item in items) + { + var comp = pool.GetItem(item.name); + comp.componentType = type; + setup(comp, item); + _uiBinder.BindStandardComponent(comp); + registry.Add(item.name, comp); + } + } + public ComponentBase FindActiveItem(ComponentType type, string componentId) { switch (type) diff --git a/Assets/Scripts/Simulator/Components/ComponentUIBinder.cs b/Assets/Scripts/Simulator/Components/ComponentUIBinder.cs new file mode 100644 index 00000000..82ee1f50 --- /dev/null +++ b/Assets/Scripts/Simulator/Components/ComponentUIBinder.cs @@ -0,0 +1,89 @@ +using UnityEngine; + +namespace Simulator.Data +{ + public class ComponentUIBinder + { + private ProgressPopupView _progressPopupView; + + private SourceProperty _sourceProperty; + private SinkProperty _sinkProperty; + private RackProperty _rackProperty; + private QueueProperty _queueProperty; + private ASRSProperty _asrsProperty; + private RobotArmProperty _robotArmProperty; + private ProcessorProperty _processorProperty; + private ConveyorProperty _conveyorProperty; + private NodeProperty _nodeProperty; + + public void Initialize() + { + _progressPopupView = Object.FindAnyObjectByType(FindObjectsInactive.Include); + + _sourceProperty = Object.FindAnyObjectByType(); + _sinkProperty = Object.FindAnyObjectByType(); + _rackProperty = Object.FindAnyObjectByType(); + _queueProperty = Object.FindAnyObjectByType(); + _asrsProperty = Object.FindAnyObjectByType(); + _robotArmProperty = Object.FindAnyObjectByType(); + _processorProperty = Object.FindAnyObjectByType(); + _conveyorProperty = Object.FindAnyObjectByType(); + _nodeProperty = Object.FindAnyObjectByType(); + } + + public void BindStandardComponent(ComponentBase component) + { + switch (component.componentType) + { + case ComponentType.Source: + if (_sourceProperty != null) + component.onComponentClicked += _sourceProperty.SetPropertyWindow; + if (_progressPopupView != null) + component.onComponentClicked += _progressPopupView.Show; + break; + case ComponentType.Sink: + if (_sinkProperty != null) + component.onComponentClicked += _sinkProperty.SetPropertyWindow; + if (_progressPopupView != null) + component.onComponentClicked += _progressPopupView.Show; + break; + case ComponentType.Processor: + if (_processorProperty != null) + component.onComponentClicked += _processorProperty.SetPropertyWindow; + if (_progressPopupView != null) + component.onComponentClicked += _progressPopupView.Show; + break; + case ComponentType.Rack: + if (_rackProperty != null) + component.onComponentClicked += _rackProperty.SetPropertyWindow; + break; + case ComponentType.Queue: + if (_queueProperty != null) + component.onComponentClicked += _queueProperty.SetPropertyWindow; + break; + case ComponentType.ASRS: + if (_asrsProperty != null) + component.onComponentClicked += _asrsProperty.SetPropertyWindow; + break; + case ComponentType.RobotArm: + if (_robotArmProperty != null) + component.onComponentClicked += _robotArmProperty.SetPropertyWindow; + break; + case ComponentType.Worker: + break; + } + } + + public void BindConveyor(ConveyorComponent conveyor) + { + if (_conveyorProperty != null) + conveyor.onConveyorClicked += _conveyorProperty.SetPropertyWindow; + } + + public void BindNode(NodeComponent node) + { + if (_nodeProperty != null) + node.onConveyorClicked += _nodeProperty.SetPropertyWindow; + } + } +} diff --git a/Assets/Scripts/Simulator/Components/ComponentUIBinder.cs.meta b/Assets/Scripts/Simulator/Components/ComponentUIBinder.cs.meta new file mode 100644 index 00000000..57124836 --- /dev/null +++ b/Assets/Scripts/Simulator/Components/ComponentUIBinder.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 21af2d92753e97e47b93dcfabfd452e5 \ No newline at end of file diff --git a/Assets/Scripts/Simulator/Components/ComponentsManager.cs b/Assets/Scripts/Simulator/Components/ComponentsManager.cs index ce0c2f9d..de517b7e 100644 --- a/Assets/Scripts/Simulator/Components/ComponentsManager.cs +++ b/Assets/Scripts/Simulator/Components/ComponentsManager.cs @@ -1,12 +1,9 @@ using Cysharp.Threading.Tasks; -using SampleProject.Config; using Simulator.Config; using Simulator.Data.Transport; using System; using System.Collections.Generic; -using UnityEngine; using UVC.Core; -using UVC.Data; using UVC.Factory; using UVC.Network; @@ -26,10 +23,13 @@ namespace Simulator.Data private ComponentPoolManager _poolManager; private ComponentMqttHandler _mqttHandler; + public ComponentUIBinder UIBinder => _poolManager.UIBinder; + protected override void Init() { _poolManager = new ComponentPoolManager(transform); _poolManager.InitializeAllPools(); + _poolManager.InitializeUIBinder(); _mqttHandler = new ComponentMqttHandler(_poolManager); } @@ -52,57 +52,75 @@ namespace Simulator.Data public void SetData(Totaljson totaljson) { - var data = totaljson.data.rows[0]; - webconfigData = data.webConfig; - logicDetailData = data.data; - SimulationConfig.userId = int.Parse(data.userId); + var row = totaljson?.data?.rows?[0]; + if (row == null) return; + + webconfigData = row.webConfig; + logicDetailData = row.data; + + SimulationConfig.userId = int.Parse(row.userId); PathIndexer.Build(logicDetailData); - onProjectNameReceived?.Invoke(data.name); - onUserNameReceived?.Invoke(data.user.name); - componentDatas = _poolManager.SpawnComponents(data.data); + onProjectNameReceived?.Invoke(row.name); + onUserNameReceived?.Invoke(row.user?.name); - if (data.data.camAngle != null) + componentDatas = _poolManager.SpawnComponents(logicDetailData); + + ApplyCamera(logicDetailData); + ApplyTemplates(logicDetailData); + ApplyTransportSystem(logicDetailData); + ApplyConveyors(logicDetailData); + } + + private void ApplyCamera(LogicDetailData logic) + { + var cam = logic?.camAngle; + if (cam != null) + FactoryCameraController.Instance.SetCamera(cam); + } + + private void ApplyTemplates(LogicDetailData logic) + { + var prefabs = logic?.templates?.prefabs; + if (prefabs is { Count: > 0 }) + PrefabManager.Instance.SetPrefabs(prefabs); + } + + private void ApplyTransportSystem(LogicDetailData logic) + { + var ts = logic?.transport_system; + if (ts == null) return; + + var networks = ts.node_networks; + if (networks is { Count: > 0 }) { - FactoryCameraController.Instance.SetCamera(data.data.camAngle); - } - if (logicDetailData.templates != null) - { - if (logicDetailData.templates.prefabs.Count >= 1) + foreach (var net in networks) { - PrefabManager.Instance.SetPrefabs(logicDetailData.templates.prefabs); + AGVNodeManager.Instance.SpawnNode(net.nodes); + AGVNodeManager.Instance.LinkNode(net.edges); } } - if (logicDetailData.transport_system != null) + + var managers = ts.transport_managers; + if (managers is not { Count: > 0 }) return; + + foreach (var manager in managers) { - if (logicDetailData.transport_system.node_networks != null && logicDetailData.transport_system.node_networks.Count >= 1) - { - foreach (var node_network in logicDetailData.transport_system.node_networks) - { - AGVNodeManager.Instance.SpawnNode(node_network.nodes); - AGVNodeManager.Instance.LinkNode(node_network.edges); - } - } - if (logicDetailData.transport_system.transport_managers != null && logicDetailData.transport_system.transport_managers.Count >= 1) - { - foreach (var transport_manager in logicDetailData.transport_system.transport_managers) - { - if (transport_manager.vehicle_fleets != null && transport_manager.vehicle_fleets.Count >= 1) - { - foreach (var vehicle in transport_manager.vehicle_fleets) - { - AGVManager.Instance.SpawnAGV(vehicle.vehicles, transport_manager.manager_type); - } - } - } - } - } - if (logicDetailData.production_system.conveyors != null && logicDetailData.production_system.conveyors.Count >= 1) - { - ConveyorManager.Instance.Build(logicDetailData.production_system.conveyors); + var fleets = manager.vehicle_fleets; + if (fleets is not { Count: > 0 }) continue; + + foreach (var fleet in fleets) + AGVManager.Instance.SpawnAGV(fleet.vehicles, manager.manager_type); } } + private void ApplyConveyors(LogicDetailData logic) + { + var conveyors = logic?.production_system?.conveyors; + if (conveyors is { Count: > 0 }) + ConveyorManager.Instance.Build(conveyors); + } + public void SetMQTT(SimulatorCodeDataClass sdata) { codedata = sdata; diff --git a/Assets/Scripts/Simulator/Components/Conveyor/ConveyorComponent.cs b/Assets/Scripts/Simulator/Components/Conveyor/ConveyorComponent.cs index f1e268d5..b34fa337 100644 --- a/Assets/Scripts/Simulator/Components/Conveyor/ConveyorComponent.cs +++ b/Assets/Scripts/Simulator/Components/Conveyor/ConveyorComponent.cs @@ -31,8 +31,7 @@ public class ConveyorComponent : ComponentBase { spline = GetComponent(); occupancy = new bool[Mathf.Max(1, segmentCount)]; - EntityManager.Instance.OnEntityDestroyed += UnSetEntity; - EntityManager.Instance.onEntityGet += UnSetEntity; + EntityManager.Instance.OnEntityTransferred += UnSetEntity; } // Update is called once per frame @@ -78,7 +77,6 @@ public class ConveyorComponent : ComponentBase public void SetComponent(ConveyorPath conveyorData) { this.conveyorPath = conveyorData; - onConveyorClicked += FindAnyObjectByType().SetPropertyWindow; var box=gameObject.AddComponent(); box.isTrigger = true; } @@ -106,7 +104,7 @@ public class ConveyorComponent : ComponentBase public override void SetEntity(string key, string name = "") { - var entity = EntityManager.Instance.GetEntity(key, this,name); + var entity = EntityManager.Instance.GetEntity(key, name); SetConveyorEntity(entity); } public void UnSetEntity(Entity entity) @@ -122,7 +120,7 @@ public class ConveyorComponent : ComponentBase { var data = datas.GetDataObject("data"); var entityId = data.GetString("entity_id_original"); - var entity = EntityManager.Instance.GetEntity(entityId,this); + var entity = EntityManager.Instance.GetEntity(entityId); var cTarget = entity.gameObject.GetComponent(); if (ConveyorQueue.Contains(cTarget)) { @@ -273,8 +271,7 @@ public class ConveyorComponent : ComponentBase { if (EntityManager.Instance != null) { - EntityManager.Instance.OnEntityDestroyed -= UnSetEntity; - EntityManager.Instance.onEntityGet -= UnSetEntity; + EntityManager.Instance.OnEntityTransferred -= UnSetEntity; } } } diff --git a/Assets/Scripts/Simulator/Components/Conveyor/ConveyorManager.cs b/Assets/Scripts/Simulator/Components/Conveyor/ConveyorManager.cs index 5d4acd81..6b4f73cb 100644 --- a/Assets/Scripts/Simulator/Components/Conveyor/ConveyorManager.cs +++ b/Assets/Scripts/Simulator/Components/Conveyor/ConveyorManager.cs @@ -177,11 +177,15 @@ namespace Simulator.Data mesher.Rebuild(); if (mesher.startCap!=null && mesher.startCap.InstanceCount >= 1) { - mesher.startCap.instances[0].GetComponent().SetComponent(fromNode); + var startNode = mesher.startCap.instances[0].GetComponent(); + startNode.SetComponent(fromNode); + ComponentsManager.Instance.UIBinder.BindNode(startNode); } if (mesher.endCap!=null&&mesher.endCap.InstanceCount>=1) { - mesher.endCap.instances[0].GetComponent().SetComponent(toNode); + var endNode = mesher.endCap.instances[0].GetComponent(); + endNode.SetComponent(toNode); + ComponentsManager.Instance.UIBinder.BindNode(endNode); } // ▼ 추가: station 인접 정보 기록(후처리에서 cap/코너 결정) @@ -191,6 +195,7 @@ namespace Simulator.Data if (string.Equals(toNode.node_type, "station")) AddStationAdj(toNode.name, (fromNode.name, toNode.name), capIndex: 1, otherNode: fromNode.name); go.SetComponent(path); + ComponentsManager.Instance.UIBinder.BindConveyor(go); } // ▼ 추가: station 인접 정보 수집 diff --git a/Assets/Scripts/Simulator/Components/Conveyor/NodeComponent.cs b/Assets/Scripts/Simulator/Components/Conveyor/NodeComponent.cs index 5ef0830e..38ddb02d 100644 --- a/Assets/Scripts/Simulator/Components/Conveyor/NodeComponent.cs +++ b/Assets/Scripts/Simulator/Components/Conveyor/NodeComponent.cs @@ -10,7 +10,6 @@ public class NodeComponent : ComponentBase private void Awake() { - onConveyorClicked += FindAnyObjectByType().SetPropertyWindow; FitCollider(); } public void SetComponent(ConveyorNode conveyorNode) diff --git a/Assets/Scripts/Simulator/Components/QueueComponent.cs b/Assets/Scripts/Simulator/Components/QueueComponent.cs index 816b8d69..4a45a1ec 100644 --- a/Assets/Scripts/Simulator/Components/QueueComponent.cs +++ b/Assets/Scripts/Simulator/Components/QueueComponent.cs @@ -14,7 +14,6 @@ namespace Simulator.Data { this.queueData = queueData; data = queueData; - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; FitCollider(); SetPosition(); SetRotation(); @@ -27,7 +26,7 @@ namespace Simulator.Data public override void SetEntity(string key, string name = "") { - var entity=EntityManager.Instance.GetEntity(key, this,name); + var entity=EntityManager.Instance.GetEntity(key, name); PlaceEntity(entity); } public void PlaceEntity(Entity entity) diff --git a/Assets/Scripts/Simulator/Components/RackComponent.cs b/Assets/Scripts/Simulator/Components/RackComponent.cs index 8b2a5821..e4f0e713 100644 --- a/Assets/Scripts/Simulator/Components/RackComponent.cs +++ b/Assets/Scripts/Simulator/Components/RackComponent.cs @@ -17,7 +17,6 @@ namespace Simulator.Data { this.data = data; rackData= data; SpawnCell(data.rack_layout,false); - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; rackData.rack_layout.onLayoutChanged += OnLayoutChanged; rackData.rack_layout.onLayoutChanged += FitCollider; rackData.rack_layout.onLayoutChanged += SetPosition; @@ -35,7 +34,7 @@ namespace Simulator.Data { var x = (int)coordinates.GetInt("x"); var y = (int)coordinates.GetInt("y"); var z = (int)coordinates.GetInt("z"); - var entity=EntityManager.Instance.GetEntities(entityids,this); + var entity=EntityManager.Instance.GetEntities(entityids); SetEntityToCell(entity[0], (x, y, z)); } @@ -43,7 +42,7 @@ namespace Simulator.Data { { var datas = modelData.GetDataObject("data"); var entityid = datas.GetString("entity_id"); - var entity = EntityManager.Instance.GetEntity(entityid, this); + var entity = EntityManager.Instance.GetEntity(entityid); entity.transform.SetParent(cellComponents[(-1, 0, 0)].Socket.transform); entity.transform.localPosition = new Vector3(0, -0.25f, -0.25f); entity.transform.localRotation= Quaternion.identity; @@ -77,7 +76,7 @@ namespace Simulator.Data { foreach (var entity in entity_Ids) { - entities.Add(EntityManager.Instance.SpawnEntity(entity.GetString("value"), this, prefab.GetString("name"))); + entities.Add(EntityManager.Instance.SpawnEntity(entity.GetString("value"), prefab.GetString("name"))); } int index = 0; for (int x = fx; x <= tx; x++) diff --git a/Assets/Scripts/Simulator/Components/Resource/Processor/ProcessorComponent.cs b/Assets/Scripts/Simulator/Components/Resource/Processor/ProcessorComponent.cs index 50da3e10..95b30f95 100644 --- a/Assets/Scripts/Simulator/Components/Resource/Processor/ProcessorComponent.cs +++ b/Assets/Scripts/Simulator/Components/Resource/Processor/ProcessorComponent.cs @@ -38,8 +38,6 @@ public class ProcessorComponent : ComponentBase { this.processorData = processorData; data = processorData; - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; - onComponentClicked += FindAnyObjectByType(FindObjectsInactive.Include).Show; ChangeMesh(); processorData.onModelTypeChanged += ChangeMesh; FitCollider(); @@ -49,44 +47,47 @@ public class ProcessorComponent : ComponentBase public override void GetModelData(DataObject modelData) { - var name = modelData.GetString("event_name"); + var eventName = modelData.GetString("event_name"); var data = modelData.GetDataObject("data"); - switch (name) + switch (eventName) { - case "loading": - SetEntity(data.GetString("entity_id")); - inputCount++; - ProgressDatabase.Instance.CollectData(processorData.name, (inputCount++.ToString(), inputCount.ToString())); - break; - case "started": - break; - case "consumed": - var destoryentities = new List(); - destoryentities.Add(data.GetString("entity_id")); - EntityManager.Instance.DestroyEnity(destoryentities); - break; - case "completed": - var prefabs = data.GetDataArray("entity_ids"); - if (prefabs == null) - { - return; - } - var entityid = prefabs[0].GetString("entity_id"); - var prefabName = prefabs[0].GetString("name"); - var newentity=EntityManager.Instance.SpawnEntity(entityid, this, prefabName); - newentity.transform.parent = Socket.transform; - newentity.transform.localPosition = new Vector3(0, 0, 0); - newentity.transform.localRotation = Quaternion.identity; - ProgressDatabase.Instance.CollectData(processorData.name, (inputCount.ToString(), inputCount++.ToString())); - break; - case "unloading": - break; + case "loading": HandleLoading(data); break; + case "consumed": HandleConsumed(data); break; + case "completed": HandleCompleted(data); break; } } + private void HandleLoading(DataObject data) + { + SetEntity(data.GetString("entity_id")); + inputCount++; + ProgressDatabase.Instance.CollectData(processorData.name, (inputCount.ToString(), outputCount.ToString())); + } + + private void HandleConsumed(DataObject data) + { + EntityManager.Instance.DestroyEnity(new List { data.GetString("entity_id") }); + } + + private void HandleCompleted(DataObject data) + { + var prefabs = data.GetDataArray("entity_ids"); + if (prefabs == null) return; + + var entityId = prefabs[0].GetString("entity_id"); + var prefabName = prefabs[0].GetString("name"); + var newEntity = EntityManager.Instance.SpawnEntity(entityId, prefabName); + newEntity.transform.parent = Socket.transform; + newEntity.transform.localPosition = Vector3.zero; + newEntity.transform.localRotation = Quaternion.identity; + + outputCount++; + ProgressDatabase.Instance.CollectData(processorData.name, (inputCount.ToString(), outputCount.ToString())); + } + public override void SetEntity(string key, string name = "") { - entity = EntityManager.Instance.GetEntity(key, this,name); + entity = EntityManager.Instance.GetEntity(key, name); entity.transform.parent = Socket.transform; entity.transform.localPosition = new Vector3(0, 0, 0); entity.transform.localRotation = Quaternion.identity; @@ -125,26 +126,28 @@ public class ProcessorComponent : ComponentBase private void ChangeMesh() { if (string.IsNullOrEmpty(processorData.model_type)) - { processorData.model_type = "processor_workbench"; - } - if(string.Equals(processorData.model_type, "processor_worker")) - { - Socket.transform.localPosition = new Vector3(0, 0.5f, -0.5f); - } - else - { - Socket.transform.localPosition = new Vector3(0, 1f, 0f); - } - if(string.Equals(processorData.model_type, "processor_conveyor_port")) - { - Glass.SetActive(true); - } - else - { - Glass.SetActive(false); - } - meshFilter.sharedMesh = meshDict[processorData.model_type]; + + UpdateSocketPosition(); + UpdateGlassVisibility(); + ApplyMesh(); + } + + private void UpdateSocketPosition() + { + Socket.transform.localPosition = string.Equals(processorData.model_type, "processor_worker") + ? new Vector3(0, 0.5f, -0.5f) + : new Vector3(0, 1f, 0f); + } + + private void UpdateGlassVisibility() + { + Glass.SetActive(string.Equals(processorData.model_type, "processor_conveyor_port")); + } + + private void ApplyMesh() + { + meshFilter.sharedMesh = meshDict[processorData.model_type]; meshRenderer.sharedMaterials = matDict[processorData.model_type].ToArray(); } } diff --git a/Assets/Scripts/Simulator/Components/Resource/RobotArm/RobotArmComponent.cs b/Assets/Scripts/Simulator/Components/Resource/RobotArm/RobotArmComponent.cs index b80d61a7..c44428c8 100644 --- a/Assets/Scripts/Simulator/Components/Resource/RobotArm/RobotArmComponent.cs +++ b/Assets/Scripts/Simulator/Components/Resource/RobotArm/RobotArmComponent.cs @@ -23,7 +23,6 @@ public class RobotArmComponent : ComponentBase { this.data = data; robotArmData = data; - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; FitCollider(); SetPosition(); SetRotation(); @@ -43,7 +42,7 @@ public class RobotArmComponent : ComponentBase var datas = modelData.GetDataObject("data"); moveSpeed = (float)datas.GetFloat("processing_time"); //targetPosition = ComponentsManager.Instance.componentDatas[datas.GetString("to")].transform.position; - targetPosition = EntityManager.Instance.GetEntity(datas.GetString("entity_id"), this).transform.position+new Vector3(0,0.25f,0); + targetPosition = EntityManager.Instance.GetEntity(datas.GetString("entity_id")).transform.position+new Vector3(0,0.25f,0); getdata = true; break; case "loading": @@ -61,7 +60,7 @@ public class RobotArmComponent : ComponentBase public override void SetEntity(string key, string name = "") { - gripEntity = EntityManager.Instance.GetEntity(key, this); + gripEntity = EntityManager.Instance.GetEntity(key); gripEntity.transform.parent = gripper.transform; gripEntity.transform.localPosition = new Vector3(-0.25f, 0, 0); } diff --git a/Assets/Scripts/Simulator/Components/SinkComponent.cs b/Assets/Scripts/Simulator/Components/SinkComponent.cs index e6435f2b..878a8486 100644 --- a/Assets/Scripts/Simulator/Components/SinkComponent.cs +++ b/Assets/Scripts/Simulator/Components/SinkComponent.cs @@ -14,8 +14,6 @@ public class SinkComponent : ComponentBase { this.sinkData = sinkData; data = sinkData; - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; - onComponentClicked += FindAnyObjectByType(FindObjectsInactive.Include).Show; FitCollider(); SetPosition(); SetRotation(); @@ -23,7 +21,7 @@ public class SinkComponent : ComponentBase public override void SetEntity(string key, string name = "") { - EntityManager.Instance.GetEntity(key, this, name); + EntityManager.Instance.GetEntity(key, name); } public override void GetModelData(DataObject modelData) diff --git a/Assets/Scripts/Simulator/Components/SourceComponent.cs b/Assets/Scripts/Simulator/Components/SourceComponent.cs index 07d2892c..657b536d 100644 --- a/Assets/Scripts/Simulator/Components/SourceComponent.cs +++ b/Assets/Scripts/Simulator/Components/SourceComponent.cs @@ -20,8 +20,7 @@ namespace Simulator.Data { this.sourceData = sourceData; data = sourceData; - onComponentClicked += FindAnyObjectByType().SetPropertyWindow; - onComponentClicked += FindAnyObjectByType(FindObjectsInactive.Include).Show; + EntityManager.Instance.OnEntityTransferred += HandleEntityTransferred; FitCollider(); SetPosition(); } @@ -38,7 +37,7 @@ namespace Simulator.Data public override void SetEntity(string key, string name = "") { - PlaceNext(EntityManager.Instance.GetEntity(key, this, name)); + PlaceNext(EntityManager.Instance.GetEntity(key, name)); } void PlaceNext(Entity entity) @@ -102,7 +101,7 @@ namespace Simulator.Data } // 여러 개를 한 번에 스폰 - var entities = EntityManager.Instance.SpawnEntites(entityIds, this); + var entities = EntityManager.Instance.SpawnEntites(entityIds); if (entities == null || entities.Count == 0) { return; @@ -117,12 +116,29 @@ namespace Simulator.Data */ } + private void HandleEntityTransferred(Entity entity) + { + if (possessEntities.Contains(entity)) + { + DecreaseEntity(entity); + } + } + public override void DecreaseEntity(Entity entity) { possessEntities.Remove(entity); ReflowEntities(); } + protected override void OnDestroy() + { + base.OnDestroy(); + if (EntityManager.Instance != null) + { + EntityManager.Instance.OnEntityTransferred -= HandleEntityTransferred; + } + } + public void ReflowEntities() { // 위치 인덱스 초기화 diff --git a/Assets/Scripts/Simulator/Model/EntityManager.cs b/Assets/Scripts/Simulator/Model/EntityManager.cs index c393e5af..0e2de52e 100644 --- a/Assets/Scripts/Simulator/Model/EntityManager.cs +++ b/Assets/Scripts/Simulator/Model/EntityManager.cs @@ -4,7 +4,6 @@ using System.Collections.Generic; using UnityEngine; using UVC.Core; using UVC.Pool; -using Simulator.Data; public class EntityManager : SingletonScene { @@ -14,10 +13,10 @@ public class EntityManager : SingletonScene }; private Dictionary entityDatas = new Dictionary(); - Dictionary possessComponents = new Dictionary(); public Vector3 ObjectSize; public event Action OnEntityDestroyed; + public event Action OnEntityTransferred; private GameObjectPool? entityPool; public GameObjectPool EntityPool @@ -31,7 +30,6 @@ public class EntityManager : SingletonScene return entityPool!; } } - public event Action onEntityGet; protected override void Init() { @@ -51,7 +49,8 @@ public class EntityManager : SingletonScene entityPool = new GameObjectPool(prefab, transform); ObjectSize = prefab.GetComponent().sharedMesh.bounds.size; } - public Entity SpawnEntity(string entityName, ComponentBase component, string prefabName) + + public Entity SpawnEntity(string entityName, string prefabName) { var entity = entityPool.GetItem($"{entityName}"); entity.name = entityName; @@ -59,62 +58,56 @@ public class EntityManager : SingletonScene if (!entityDatas.ContainsKey(entityName)) { entityDatas.Add(entityName, entity); - possessComponents.Add(entity, component); } else { entityDatas[entityName] = entity; - possessComponents[entity] = component; } - return entity; + return entity; } - public List SpawnEntites(List entityNames, ComponentBase component) + public List SpawnEntites(List entityNames) { List entities = new List(); foreach (var entityName in entityNames) { - //Debug.Log($"spawn{entityName}"); var entity = entityPool.GetItem($"{entityName}"); entity.name = entityName; if (!entityDatas.ContainsKey(entityName)) { entityDatas.Add(entityName, entity); entities.Add(entity); - possessComponents.Add(entity, component); } } return entities; } - public Entity GetEntity(string entityName, ComponentBase component, string prefabName = null) + public Entity GetEntity(string entityName, string prefabName = null) { if (entityDatas.ContainsKey(entityName)) { var entity = entityDatas[entityName]; - possessComponents[entity].DecreaseEntity(entity); - possessComponents[entity] = component; - onEntityGet?.Invoke(entity); + OnEntityTransferred?.Invoke(entity); return entity; } else { - return SpawnEntity(entityName, component, prefabName); + return SpawnEntity(entityName, prefabName); } } - public List GetEntities(List entityNames, ComponentBase component, List prefabNames = null) + public List GetEntities(List entityNames, List prefabNames = null) { List entities = new List(); foreach (var entityName in entityNames) { - var entity = GetEntity(entityName, component); + var entity = GetEntity(entityName); entities.Add(entity); } return entities; } - public void SetEntity(Entity entity,string prefabName) + public void SetEntity(Entity entity, string prefabName) { var prefabData = PrefabManager.Instance.GetPrefab(prefabName); if (!string.IsNullOrEmpty(prefabName) && prefabData != null) @@ -134,8 +127,7 @@ public class EntityManager : SingletonScene if (entityDatas.ContainsKey(entityName)) { var entity = entityDatas[entityName]; - possessComponents[entity].DecreaseEntity(entity); - possessComponents.Remove(entity); + OnEntityTransferred?.Invoke(entity); OnEntityDestroyed?.Invoke(entity); Destroy(entity.gameObject); entityDatas.Remove(entityName); diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/ASRSProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/ASRSProperty.cs index ab3a1657..6cc9dda6 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/ASRSProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/ASRSProperty.cs @@ -33,7 +33,7 @@ public class ASRSProperty : MonoBehaviour public void InitAsrsProperty(ASRSDataClass asrs) { - List entries = new List + var entries = new List { new StringProperty("name", "이름", asrs.name) { @@ -45,13 +45,6 @@ public class ASRSProperty : MonoBehaviour }.Bind( setter: v => {asrs.label = v;SaveChange(asrs,v,"label"); } ), - /* - new Vector2Property("Position","X,Y 좌표(m)", new Vector2(asrs.physical.position.x,asrs.physical.position.z)) - { - IsReadOnly=false - }.Bind( - setter: v => {asrs.physical.position.x = v.x;asrs.physical.position.z = v.y; SaveChange(asrs,v,"physical.position"); } - )*/ CreatePositionGroup(asrs), new BoolProperty("limited","용량 무제한", asrs.is_unlimited) { @@ -62,126 +55,72 @@ public class ASRSProperty : MonoBehaviour CreateRackLayoutGroup(asrs), new ButtonProperty("InitializeButton","초기 재고 설정",""){ }.BindClick(()=>FindAnyObjectByType(FindObjectsInactive.Include).Open(asrs)), - /* - new IntProperty("entityperblock","칸당 개체 개수", asrs.entity_count_per_block) - { - IsReadOnly=false - }.Bind( - setter: v => {asrs.entity_count_per_block=v; SaveChange(asrs,v,"entity_count_per_block"); } - ), - */ - new EnumProperty("display_mode_ReceicingTimePolicy", "입고 시간 정책",asrs.receiving_time_policy.policy).Bind( - setter: v=>{asrs.receiving_time_policy=PolicyFactory.Create(v.ToString());SaveChange(asrs,PolicyFactory.Create(v.ToString()),"receiving_time_policy");} - ), - CreateReceivingTimePolicy_Constant(asrs), - CreateReceivingTimePolicy_Normal(asrs), - CreateReceivingTimePolicy_Uniform(asrs), - CreateReceivingTimePolicy_Exponential(asrs), - CreateReceivingTimePolicy_Triangular(asrs), + }; - new EnumProperty("display_mode_ShippingTimePolicy", "출고 시간 정책",asrs.shipping_time_policy.policy).Bind( - setter: v=>{asrs.shipping_time_policy=PolicyFactory.Create(v.ToString());SaveChange(asrs,PolicyFactory.Create(v.ToString()),"shipping_time_policy");} - ), - CreateShippingTimePolicy_Constant(asrs), - CreateShippingTimePolicy_Normal(asrs), - CreateShippingTimePolicy_Uniform(asrs), - CreateShippingTimePolicy_Exponential(asrs), - CreateShippingTimePolicy_Triangular(asrs), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ReceivingTimePolicy", "입고 시간 정책", "display_mode_ReceicingTimePolicy", + () => asrs.receiving_time_policy, v => asrs.receiving_time_policy = v, + "receiving_time_policy", asrs, SaveChange)); - new EnumProperty("display_mode_StorageCostPolicy", "보관 비용 정책",asrs.storage_cost_policy.policy).Bind( - setter: v=>{asrs.storage_cost_policy=PolicyFactory.Create(v.ToString());SaveChange(asrs,PolicyFactory.Create(v.ToString()),"storage_cost_policy");} - ), - CreateStorageCostPolicy_Constant(asrs), - CreateStorageCostPolicy_Normal(asrs), - CreateStorageCostPolicy_Uniform(asrs), - CreateStorageCostPolicy_Exponential(asrs), - CreateStorageCostPolicy_Triangular(asrs), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ShippingTimePolicy", "출고 시간 정책", "display_mode_ShippingTimePolicy", + () => asrs.shipping_time_policy, v => asrs.shipping_time_policy = v, + "shipping_time_policy", asrs, SaveChange)); - new EnumProperty("display_mode_HorizonSpeedPolicy", "크레인 수평 이동 속도",asrs.horizon_speed_policy.policy).Bind( - setter: v=>{asrs.horizon_speed_policy=PolicyFactory.Create(v.ToString());SaveChange(asrs,PolicyFactory.Create(v.ToString()),"horizon_speed_policy");} - ), - CreateHorizonSpeedPolicy_Constant(asrs), - CreateHorizonSpeedPolicy_Normal(asrs), - CreateHorizonSpeedPolicy_Uniform(asrs), - CreateHorizonSpeedPolicy_Exponential(asrs), - CreateHorizonSpeedPolicy_Triangular(asrs), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "StorageCostPolicy", "보관 비용 정책", "display_mode_StorageCostPolicy", + () => asrs.storage_cost_policy, v => asrs.storage_cost_policy = v, + "storage_cost_policy", asrs, SaveChange)); - new EnumProperty("display_mode_VerticalSpeedPolicy", "크레인 수직 이동 속도",asrs.vertical_speed_policy.policy).Bind( - setter: v=>{asrs.vertical_speed_policy=PolicyFactory.Create(v.ToString());SaveChange(asrs,PolicyFactory.Create(v.ToString()),"vertical_speed_policy");} - ), - CreateVerticalSpeedPolicy_Constant(asrs), - CreateVerticalSpeedPolicy_Normal(asrs), - CreateVerticalSpeedPolicy_Uniform(asrs), - CreateVerticalSpeedPolicy_Exponential(asrs), - CreateVerticalSpeedPolicy_Triangular(asrs), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "HorizonSpeedPolicy", "크레인 수평 이동 속도", "display_mode_HorizonSpeedPolicy", + () => asrs.horizon_speed_policy, v => asrs.horizon_speed_policy = v, + "horizon_speed_policy", asrs, SaveChange)); - new EnumProperty("display_mode_ForkCycleTimePolicy", "크레인 포크 이동 시간",asrs.fork_cycle_time_policy.policy).Bind( - setter: v=>{asrs.fork_cycle_time_policy=PolicyFactory.Create(v.ToString());SaveChange(asrs,PolicyFactory.Create(v.ToString()),"fork_cycle_time_policy");} - ), - CreateForkCycleTimePolicy_Constant(asrs), - CreateForkCycleTimePolicy_Normal(asrs), - CreateForkCycleTimePolicy_Uniform(asrs), - CreateForkCycleTimePolicy_Exponential(asrs), - CreateForkCycleTimePolicy_Triangular(asrs), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "VerticalSpeedPolicy", "크레인 수직 이동 속도", "display_mode_VerticalSpeedPolicy", + () => asrs.vertical_speed_policy, v => asrs.vertical_speed_policy = v, + "vertical_speed_policy", asrs, SaveChange)); - new BoolProperty("fms_input_enabled","입력에 FMS 사용", asrs.fms_input_enabled) + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ForkCycleTimePolicy", "크레인 포크 이동 시간", "display_mode_ForkCycleTimePolicy", + () => asrs.fork_cycle_time_policy, v => asrs.fork_cycle_time_policy = v, + "fork_cycle_time_policy", asrs, SaveChange)); + + entries.Add(new BoolProperty("fms_input_enabled","입력에 FMS 사용", asrs.fms_input_enabled) { IsReadOnly=true }.Bind( setter: v => {asrs.fms_input_enabled=v; SaveChange(asrs,v,"fms_input_enabled"); } - ), - new BoolProperty("fms_output_enabled","출력에 FMS 사용", asrs.fms_output_enabled) + )); + entries.Add(new BoolProperty("fms_output_enabled","출력에 FMS 사용", asrs.fms_output_enabled) { IsReadOnly=true }.Bind( setter: v => {asrs.fms_output_enabled=v; SaveChange(asrs,v,"fms_output_enabled"); } - ), - }; + )); + propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_ReceivingTimePolicy(asrs.receiving_time_policy.policy.ToString()); - HandleDisplayModeChanged_ShippingTimePolicy(asrs.shipping_time_policy.policy.ToString()); - HandleDisplayModeChanged_StorageCostPolicy(asrs.storage_cost_policy.policy.ToString()); - HandleDisplayModeChanged_HorizonSpeedPolicy(asrs.horizon_speed_policy.policy.ToString()); - HandleDisplayModeChanged_VerticalSpeedPolicy(asrs.vertical_speed_policy.policy.ToString()); - HandleDisplayModeChanged_ForkCycleTimePolicy(asrs.fork_cycle_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ReceivingTimePolicy", asrs.receiving_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ShippingTimePolicy", asrs.shipping_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "StorageCostPolicy", asrs.storage_cost_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "HorizonSpeedPolicy", asrs.horizon_speed_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "VerticalSpeedPolicy", asrs.vertical_speed_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ForkCycleTimePolicy", asrs.fork_cycle_time_policy.policy.ToString()); } private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e) { Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}"); - // 동적 그룹 표시/비표시 테스트 - if (e.PropertyId == "display_mode_ReceicingTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ReceivingTimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_ShippingTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ShippingTimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_StorageCostPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_StorageCostPolicy(selectedMode); - } - if (e.PropertyId == "display_mode_HorizonSpeedPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_HorizonSpeedPolicy(selectedMode); - } - if (e.PropertyId == "display_mode_VerticalSpeedPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_VerticalSpeedPolicy(selectedMode); - } - if (e.PropertyId == "display_mode_ForkCycleTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ForkCycleTimePolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ReceicingTimePolicy", "ReceivingTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ShippingTimePolicy", "ShippingTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_StorageCostPolicy", "StorageCostPolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_HorizonSpeedPolicy", "HorizonSpeedPolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_VerticalSpeedPolicy", "VerticalSpeedPolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ForkCycleTimePolicy", "ForkCycleTimePolicy"); + if (e.PropertyId == "limited") { bool flag = Convert.ToBoolean(e.NewValue); @@ -241,732 +180,6 @@ public class ASRSProperty : MonoBehaviour return group; } - #region 입고 시간 정책 - private PropertyGroup CreateReceivingTimePolicy_Constant(ASRSDataClass asrs) - { - var group = new PropertyGroup("ReceivingTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Constant_Value", "상수 값", (asrs.receiving_time_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Constant).value = v;SaveChange(asrs,v,"receiving_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Normal(ASRSDataClass asrs) - { - var group = new PropertyGroup("ReceivingTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Normal_Mean", "정규 분포 표준치", (asrs.receiving_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Normal).mean = v;SaveChange(asrs,v,"receiving_time_policy.mean"); } - ), - new FloatProperty("ReceivingTimePolicy_Normal_Gap", "정규 분포 표준 편차", (asrs.receiving_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Normal).stddev = v;SaveChange(asrs,v,"receiving_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Uniform(ASRSDataClass asrs) - { - var group = new PropertyGroup("ReceivingTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Uniform_Min", "균등 분포 최소값", (asrs.receiving_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Uniform).min_val = v;SaveChange(asrs,v,"receiving_time_policy.min_val"); } - ), - new FloatProperty("ReceivingTimePolicy_Uniform_Max", "균등 분포 최대값", (asrs.receiving_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Uniform).max_val = v;SaveChange(asrs,v,"receiving_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Exponential(ASRSDataClass asrs) - { - var group = new PropertyGroup("ReceivingTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Exponential_Mean", "지수 분포 평균치", (asrs.receiving_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Exponential).mean = v;SaveChange(asrs,v,"receiving_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Triangular(ASRSDataClass asrs) - { - var group = new PropertyGroup("ReceivingTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Triangular_Min", "지수 분포 최소값", (asrs.receiving_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Triangular).min_val = v;SaveChange(asrs,v,"receiving_time_policy.min_val"); } - ), - new FloatProperty("ReceivingTimePolicy_Triangular_Mean", "지수 분포 최빈값", (asrs.receiving_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Triangular).mode = v;SaveChange(asrs,v,"receiving_time_policy.mode"); } - ), - new FloatProperty("ReceivingTimePolicy_Triangular_Max", "지수 분포 최대값", (asrs.receiving_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.receiving_time_policy as Policy_Triangular).max_val = v;SaveChange(asrs,v,"receiving_time_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_ReceivingTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 출고 시간 정책 - private PropertyGroup CreateShippingTimePolicy_Constant(ASRSDataClass asrs) - { - var group = new PropertyGroup("ShippingTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Constant_Value", "상수 값", (asrs.shipping_time_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Constant).value = v;SaveChange(asrs,v,"shipping_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Normal(ASRSDataClass asrs) - { - var group = new PropertyGroup("ShippingTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Normal_Mean", "정규 분포 표준치", (asrs.shipping_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Normal).mean = v;SaveChange(asrs,v,"shipping_time_policy.mean"); } - ), - new FloatProperty("ShippingTimePolicy_Normal_Gap", "정규 분포 표준 편차", (asrs.shipping_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Normal).stddev = v;SaveChange(asrs,v,"shipping_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Uniform(ASRSDataClass asrs) - { - var group = new PropertyGroup("ShippingTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Uniform_Min", "균등 분포 최소값", (asrs.shipping_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Uniform).min_val = v;SaveChange(asrs,v,"shipping_time_policy.min_val"); } - ), - new FloatProperty("ShippingTimePolicy_Uniform_Max", "균등 분포 최대값", (asrs.shipping_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Uniform).max_val = v;SaveChange(asrs,v,"shipping_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Exponential(ASRSDataClass asrs) - { - var group = new PropertyGroup("ShippingTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Exponential_Mean", "지수 분포 평균치", (asrs.shipping_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Exponential).mean = v;SaveChange(asrs,v,"shipping_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Triangular(ASRSDataClass asrs) - { - var group = new PropertyGroup("ShippingTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Triangular_Min", "지수 분포 최소값", (asrs.shipping_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Triangular).min_val = v;SaveChange(asrs,v,"shipping_time_policy.min_val"); } - ), - new FloatProperty("ShippingTimePolicy_Triangular_Mean", "지수 분포 최빈값", (asrs.shipping_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Triangular).mode = v;SaveChange(asrs,v,"shipping_time_policy.mode"); } - ), - new FloatProperty("ShippingTimePolicy_Triangular_Max", "지수 분포 최대값", (asrs.shipping_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.shipping_time_policy as Policy_Triangular).max_val = v;SaveChange(asrs,v,"shipping_time_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_ShippingTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 보관 비용 정책 - private PropertyGroup CreateStorageCostPolicy_Constant(ASRSDataClass asrs) - { - var group = new PropertyGroup("StorageCostPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Constant_Value", "상수 값", (asrs.storage_cost_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Constant).value = v;SaveChange(asrs,v,"storage_cost_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Normal(ASRSDataClass asrs) - { - var group = new PropertyGroup("StorageCostPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Normal_Mean", "정규 분포 표준치", (asrs.storage_cost_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Normal).mean = v;SaveChange(asrs,v,"storage_cost_policy.mean"); } - ), - new FloatProperty("StorageCostPolicy_Normal_Gap", "정규 분포 표준 편차", (asrs.storage_cost_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Normal).stddev = v;SaveChange(asrs,v,"storage_cost_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Uniform(ASRSDataClass asrs) - { - var group = new PropertyGroup("StorageCostPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Uniform_Min", "균등 분포 최소값", (asrs.storage_cost_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Uniform).min_val = v;SaveChange(asrs,v,"storage_cost_policy.min_val"); } - ), - new FloatProperty("StorageCostPolicy_Uniform_Max", "균등 분포 최대값", (asrs.storage_cost_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Uniform).max_val = v;SaveChange(asrs,v,"storage_cost_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Exponential(ASRSDataClass asrs) - { - var group = new PropertyGroup("StorageCostPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Exponential_Mean", "지수 분포 평균치", (asrs.storage_cost_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Exponential).mean = v;SaveChange(asrs,v,"storage_cost_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Triangular(ASRSDataClass asrs) - { - var group = new PropertyGroup("StorageCostPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Triangular_Min", "지수 분포 최소값", (asrs.storage_cost_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Triangular).min_val = v;SaveChange(asrs,v,"storage_cost_policy.min_val"); } - ), - new FloatProperty("StorageCostPolicy_Triangular_Mean", "지수 분포 최빈값", (asrs.storage_cost_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Triangular).mode = v;SaveChange(asrs,v,"storage_cost_policy.mode"); } - ), - new FloatProperty("StorageCostPolicy_Triangular_Max", "지수 분포 최대값", (asrs.storage_cost_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.storage_cost_policy as Policy_Triangular).max_val = v;SaveChange(asrs,v,"storage_cost_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_StorageCostPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("StorageCostPolicy_Constant", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Normal", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Triangular", false); - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Triangular", true); - break; - } - } - #endregion - - #region 크레인 수평 이동 속도 - private PropertyGroup CreateHorizonSpeedPolicy_Constant(ASRSDataClass asrs) - { - var group = new PropertyGroup("HorizonSpeedPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("HorizonSpeedPolicy_Constant_Value", "상수 값", (asrs.horizon_speed_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Constant).value = v;SaveChange(asrs,v,"horizon_speed_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateHorizonSpeedPolicy_Normal(ASRSDataClass asrs) - { - var group = new PropertyGroup("HorizonSpeedPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("HorizonSpeedPolicy_Normal_Mean", "정규 분포 표준치", (asrs.horizon_speed_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Normal).mean = v;SaveChange(asrs,v,"horizon_speed_policy.mean"); } - ), - new FloatProperty("HorizonSpeedPolicy_Normal_Gap", "정규 분포 표준 편차", (asrs.horizon_speed_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Normal).stddev = v;SaveChange(asrs,v,"horizon_speed_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateHorizonSpeedPolicy_Uniform(ASRSDataClass asrs) - { - var group = new PropertyGroup("HorizonSpeedPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("HorizonSpeedPolicy_Uniform_Min", "균등 분포 최소값", (asrs.horizon_speed_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Uniform).min_val = v;SaveChange(asrs,v,"horizon_speed_policy.min_val"); } - ), - new FloatProperty("HorizonSpeedPolicy_Uniform_Max", "균등 분포 최대값", (asrs.horizon_speed_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Uniform).max_val = v;SaveChange(asrs,v,"horizon_speed_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateHorizonSpeedPolicy_Exponential(ASRSDataClass asrs) - { - var group = new PropertyGroup("HorizonSpeedPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("HorizonSpeedPolicy_Exponential_Mean", "지수 분포 평균치", (asrs.horizon_speed_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Exponential).mean = v;SaveChange(asrs,v,"horizon_speed_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateHorizonSpeedPolicy_Triangular(ASRSDataClass asrs) - { - var group = new PropertyGroup("HorizonSpeedPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("HorizonSpeedPolicy_Triangular_Min", "지수 분포 최소값", (asrs.horizon_speed_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Triangular).min_val = v;SaveChange(asrs,v,"horizon_speed_policy.min_val"); } - ), - new FloatProperty("HorizonSpeedPolicy_Triangular_Mean", "지수 분포 최빈값", (asrs.horizon_speed_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Triangular).mode = v;SaveChange(asrs,v,"horizon_speed_policy.mode"); } - ), - new FloatProperty("HorizonSpeedPolicy_Triangular_Max", "지수 분포 최대값", (asrs.horizon_speed_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.horizon_speed_policy as Policy_Triangular).max_val = v;SaveChange(asrs,v,"horizon_speed_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_HorizonSpeedPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Constant", false); - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Normal", false); - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Triangular", false); - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("HorizonSpeedPolicy_Triangular", true); - break; - } - } - #endregion - - #region 크레인 수직 이동 속도 - private PropertyGroup CreateVerticalSpeedPolicy_Constant(ASRSDataClass asrs) - { - var group = new PropertyGroup("VerticalSpeedPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("VerticalSpeedPolicy_Constant_Value", "상수 값", (asrs.vertical_speed_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Constant).value = v;SaveChange(asrs,v,"vertical_speed_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateVerticalSpeedPolicy_Normal(ASRSDataClass asrs) - { - var group = new PropertyGroup("VerticalSpeedPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("VerticalSpeedPolicy_Normal_Mean", "정규 분포 표준치", (asrs.vertical_speed_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Normal).mean = v;SaveChange(asrs,v,"vertical_speed_policy.mean"); } - ), - new FloatProperty("VerticalSpeedPolicy_Normal_Gap", "정규 분포 표준 편차", (asrs.vertical_speed_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Normal).stddev = v;SaveChange(asrs,v,"vertical_speed_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateVerticalSpeedPolicy_Uniform(ASRSDataClass asrs) - { - var group = new PropertyGroup("VerticalSpeedPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("VerticalSpeedPolicy_Uniform_Min", "균등 분포 최소값", (asrs.vertical_speed_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Uniform).min_val = v;SaveChange(asrs,v,"vertical_speed_policy.min_val"); } - ), - new FloatProperty("VerticalSpeedPolicy_Uniform_Max", "균등 분포 최대값", (asrs.vertical_speed_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Uniform).max_val = v;SaveChange(asrs,v,"vertical_speed_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateVerticalSpeedPolicy_Exponential(ASRSDataClass asrs) - { - var group = new PropertyGroup("VerticalSpeedPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("VerticalSpeedPolicy_Exponential_Mean", "지수 분포 평균치", (asrs.vertical_speed_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Exponential).mean = v;SaveChange(asrs,v,"vertical_speed_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateVerticalSpeedPolicy_Triangular(ASRSDataClass asrs) - { - var group = new PropertyGroup("VerticalSpeedPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("VerticalSpeedPolicy_Triangular_Min", "지수 분포 최소값", (asrs.vertical_speed_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Triangular).min_val = v;SaveChange(asrs,v,"vertical_speed_policy.min_val"); } - ), - new FloatProperty("VerticalSpeedPolicy_Triangular_Mean", "지수 분포 최빈값", (asrs.vertical_speed_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Triangular).mode = v;SaveChange(asrs,v,"vertical_speed_policy.mode"); } - ), - new FloatProperty("VerticalSpeedPolicy_Triangular_Max", "지수 분포 최대값", (asrs.vertical_speed_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.vertical_speed_policy as Policy_Triangular).max_val = v;SaveChange(asrs,v,"vertical_speed_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_VerticalSpeedPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Constant", false); - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Normal", false); - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Triangular", false); - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("VerticalSpeedPolicy_Triangular", true); - break; - } - } - #endregion - - #region 크레인 포크 이동 시간 - private PropertyGroup CreateForkCycleTimePolicy_Constant(ASRSDataClass asrs) - { - var group = new PropertyGroup("ForkCycleTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ForkCycleTimePolicy_Constant_Value", "상수 값", (asrs.fork_cycle_time_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Constant).value = v;SaveChange(asrs,v,"fork_cycle_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateForkCycleTimePolicy_Normal(ASRSDataClass asrs) - { - var group = new PropertyGroup("ForkCycleTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ForkCycleTimePolicy_Normal_Mean", "정규 분포 표준치", (asrs.fork_cycle_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Normal).mean = v;SaveChange(asrs,v,"fork_cycle_time_policy.mean"); } - ), - new FloatProperty("ForkCycleTimePolicy_Normal_Gap", "정규 분포 표준 편차", (asrs.fork_cycle_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Normal).stddev = v;SaveChange(asrs,v,"fork_cycle_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateForkCycleTimePolicy_Uniform(ASRSDataClass asrs) - { - var group = new PropertyGroup("ForkCycleTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ForkCycleTimePolicy_Uniform_Min", "균등 분포 최소값", (asrs.fork_cycle_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Uniform).min_val = v;SaveChange(asrs,v,"fork_cycle_time_policy.min_val"); } - ), - new FloatProperty("ForkCycleTimePolicy_Uniform_Max", "균등 분포 최대값", (asrs.fork_cycle_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Uniform).max_val = v;SaveChange(asrs,v,"fork_cycle_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateForkCycleTimePolicy_Exponential(ASRSDataClass asrs) - { - var group = new PropertyGroup("ForkCycleTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ForkCycleTimePolicy_Exponential_Mean", "지수 분포 평균치", (asrs.fork_cycle_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Exponential).mean = v;SaveChange(asrs,v,"fork_cycle_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateForkCycleTimePolicy_Triangular(ASRSDataClass asrs) - { - var group = new PropertyGroup("ForkCycleTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ForkCycleTimePolicy_Triangular_Min", "지수 분포 최소값", (asrs.fork_cycle_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Triangular).min_val = v;SaveChange(asrs,v,"fork_cycle_time_policy.min_val"); } - ), - new FloatProperty("ForkCycleTimePolicy_Triangular_Mean", "지수 분포 최빈값", (asrs.fork_cycle_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Triangular).mode = v;SaveChange(asrs,v,"fork_cycle_time_policy.mode"); } - ), - new FloatProperty("ForkCycleTimePolicy_Triangular_Max", "지수 분포 최대값", (asrs.fork_cycle_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(asrs.fork_cycle_time_policy as Policy_Triangular).max_val = v;SaveChange(asrs,v,"fork_cycle_time_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_ForkCycleTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Triangular", false); - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ForkCycleTimePolicy_Triangular", true); - break; - } - } - #endregion - public void CleanupByLayoutShrink(ASRSDataClass ASRS) { if (ASRS == null) return; @@ -979,7 +192,6 @@ public class ASRSProperty : MonoBehaviour { if (e == null || e.from_position == null || e.to_position == null) return true; - // 범위 정규화 var minX = Math.Min(e.from_position.x, e.to_position.x); var maxX = Math.Max(e.from_position.x, e.to_position.x); @@ -989,10 +201,8 @@ public class ASRSProperty : MonoBehaviour var minZ = Math.Min(e.from_position.z, e.to_position.z); var maxZ = Math.Max(e.from_position.z, e.to_position.z); - // 방어(원하면 0-based로 바꾸거나, min<1 허용 등 정책 조정) if (minX < 1 || minY < 1 || minZ < 1) return true; - // “감소된(잘린) 영역과 겹치면 삭제” == “새 레이아웃 박스에 완전히 포함되지 않으면 삭제” if (maxX > asrs_Layout.x) return true; if (maxY > asrs_Layout.y) return true; if (maxZ > asrs_Layout.z) return true; diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/NodeProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/NodeProperty.cs index 90e1bf49..50707b85 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/NodeProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/NodeProperty.cs @@ -34,7 +34,7 @@ public class NodeProperty : MonoBehaviour public void InitNodeProperty(ConveyorNode node) { - List entries = new List + var entries = new List { new StringProperty("name", "이름", node.name) { @@ -60,28 +60,22 @@ public class NodeProperty : MonoBehaviour }.Bind( setter: v => {node.capacity = v;SaveChange(node,v,"capacity"); } ), - new EnumProperty("display_mode_ProcessingTimePolicy", "보관 비용 정책",node.processing_time_policy.policy).Bind( - setter: v=>{node.processing_time_policy=PolicyFactory.Create(v.ToString());SaveChange(node,PolicyFactory.Create(v.ToString()),"processing_time_policy");} - ), - CreateProcessingTimePolicy_Constant(node), - CreateProcessingTimePolicy_Normal(node), - CreateProcessingTimePolicy_Uniform(node), - CreateProcessingTimePolicy_Exponential(node), - CreateProcessingTimePolicy_Triangular(node) }; + + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ProcessingTimePolicy", "보관 비용 정책", "display_mode_ProcessingTimePolicy", + () => node.processing_time_policy, v => node.processing_time_policy = v, + "processing_time_policy", node, SaveChange)); + propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_ProcessingTimePolicy(node.processing_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ProcessingTimePolicy", node.processing_time_policy.policy.ToString()); HandleDisplayModeChanged_InputOutput(node.node_type); } private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e) { - if (e.PropertyId == "display_mode_ProcessingTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ProcessingTimePolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ProcessingTimePolicy", "ProcessingTimePolicy"); } private PropertyGroup CreateInputDetailGroup(ConveyorNode node) @@ -142,10 +136,8 @@ public class NodeProperty : MonoBehaviour private void HandleDisplayModeChanged_InputOutput(string mode) { - // 모든 조건부 그룹 숨김 propertyWindow.SetGroupVisibility("inputs", false); propertyWindow.SetGroupVisibility("outputs", false); - // 선택된 모드에 따라 해당 그룹만 표시 switch (mode) { case "start": @@ -157,127 +149,6 @@ public class NodeProperty : MonoBehaviour } } - #region 처리 시간 정책 - private PropertyGroup CreateProcessingTimePolicy_Constant(ConveyorNode node) - { - var group = new PropertyGroup("ProcessingTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Constant_Value", "상수 값", (node.processing_time_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Constant).value = v;SaveChange(node,v,"processing_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Normal(ConveyorNode node) - { - var group = new PropertyGroup("ProcessingTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Normal_Mean", "정규 분포 표준치", (node.processing_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Normal).mean = v;SaveChange(node,v,"processing_time_policy.mean"); } - ), - new FloatProperty("ProcessingTimePolicy_Normal_Gap", "정규 분포 표준 편차", (node.processing_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Normal).stddev = v;SaveChange(node,v,"processing_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Uniform(ConveyorNode node) - { - var group = new PropertyGroup("ProcessingTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Uniform_Min", "균등 분포 최소값", (node.processing_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Uniform).min_val = v;SaveChange(node,v,"processing_time_policy.min_val"); } - ), - new FloatProperty("ProcessingTimePolicy_Uniform_Max", "균등 분포 최대값", (node.processing_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Uniform).max_val = v;SaveChange(node,v,"processing_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Exponential(ConveyorNode node) - { - var group = new PropertyGroup("ProcessingTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Exponential_Mean", "지수 분포 평균치", (node.processing_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Exponential).mean = v;SaveChange(node,v,"processing_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Triangular(ConveyorNode node) - { - var group = new PropertyGroup("ProcessingTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Triangular_Min", "지수 분포 최소값", (node.processing_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Triangular).min_val = v;SaveChange(node,v,"processing_time_policy.min_val"); } - ), - new FloatProperty("ProcessingTimePolicy_Triangular_Mean", "지수 분포 최빈값", (node.processing_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Triangular).mode = v;SaveChange(node,v,"processing_time_policy.mode"); } - ), - new FloatProperty("ProcessingTimePolicy_Triangular_Max", "지수 분포 최대값", (node.processing_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(node.processing_time_policy as Policy_Triangular).max_val = v;SaveChange(node,v,"processing_time_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_ProcessingTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Triangular", false); - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Triangular", true); - break; - } - } - #endregion - private void OnDestroy() { if (propertyWindow != null) diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs new file mode 100644 index 00000000..a7085579 --- /dev/null +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs @@ -0,0 +1,127 @@ +using System; +using System.Collections.Generic; +using UVC.UI.Window.PropertyWindow; + +public static class PolicyPropertyBuilder +{ + public static List CreatePolicyEntries( + string groupPrefix, + string displayLabel, + string displayModeId, + Func policyGetter, + Action policySetter, + string savePath, + object dataObject, + Action saveChange) + { + var entries = new List(); + + entries.Add(new EnumProperty(displayModeId, displayLabel, policyGetter().policy).Bind( + setter: v => + { + var newPolicy = PolicyFactory.Create(v.ToString()); + policySetter(newPolicy); + saveChange(dataObject, PolicyFactory.Create(v.ToString()), savePath); + })); + + entries.Add(CreateConstantGroup(groupPrefix, policyGetter, savePath, dataObject, saveChange)); + entries.Add(CreateNormalGroup(groupPrefix, policyGetter, savePath, dataObject, saveChange)); + entries.Add(CreateUniformGroup(groupPrefix, policyGetter, savePath, dataObject, saveChange)); + entries.Add(CreateExponentialGroup(groupPrefix, policyGetter, savePath, dataObject, saveChange)); + entries.Add(CreateTriangularGroup(groupPrefix, policyGetter, savePath, dataObject, saveChange)); + + return entries; + } + + public static void HandleDisplayModeChanged(PropertyWindow pw, string groupPrefix, string mode) + { + string[] types = { "Constant", "Normal", "Uniform", "Exponential", "Triangular" }; + foreach (var t in types) + pw.SetGroupVisibility($"{groupPrefix}_{t}", string.Equals(mode, t)); + } + + public static bool TryHandleDisplayModeChanged( + PropertyValueChangedEventArgs e, PropertyWindow pw, string displayModeId, string groupPrefix) + { + if (e.PropertyId != displayModeId) return false; + HandleDisplayModeChanged(pw, groupPrefix, e.NewValue.ToString()); + return true; + } + + static PropertyGroup CreateConstantGroup(string prefix, Func getter, + string savePath, object data, Action save) + { + var g = new PropertyGroup($"{prefix}_Constant", "", isExpanded: true); + g.AddItems(new IPropertyItem[] + { + new FloatProperty($"{prefix}_Constant_Value", "상수 값", + (getter() as Policy_Constant)?.value ?? 0f) + .Bind(setter: v => { (getter() as Policy_Constant).value = v; save(data, v, $"{savePath}.value"); }) + }); + return g; + } + + static PropertyGroup CreateNormalGroup(string prefix, Func getter, + string savePath, object data, Action save) + { + var g = new PropertyGroup($"{prefix}_Normal", "", isExpanded: true); + g.AddItems(new IPropertyItem[] + { + new FloatProperty($"{prefix}_Normal_Mean", "정규 분포 표준치", + (getter() as Policy_Normal)?.mean ?? 0f) + .Bind(setter: v => { (getter() as Policy_Normal).mean = v; save(data, v, $"{savePath}.mean"); }), + new FloatProperty($"{prefix}_Normal_Gap", "정규 분포 표준 편차", + (getter() as Policy_Normal)?.stddev ?? 0f) + .Bind(setter: v => { (getter() as Policy_Normal).stddev = v; save(data, v, $"{savePath}.stddev"); }) + }); + return g; + } + + static PropertyGroup CreateUniformGroup(string prefix, Func getter, + string savePath, object data, Action save) + { + var g = new PropertyGroup($"{prefix}_Uniform", "", isExpanded: true); + g.AddItems(new IPropertyItem[] + { + new FloatProperty($"{prefix}_Uniform_Min", "균등 분포 최소값", + (getter() as Policy_Uniform)?.min_val ?? 0f) + .Bind(setter: v => { (getter() as Policy_Uniform).min_val = v; save(data, v, $"{savePath}.min_val"); }), + new FloatProperty($"{prefix}_Uniform_Max", "균등 분포 최대값", + (getter() as Policy_Uniform)?.max_val ?? 0f) + .Bind(setter: v => { (getter() as Policy_Uniform).max_val = v; save(data, v, $"{savePath}.max_val"); }) + }); + return g; + } + + static PropertyGroup CreateExponentialGroup(string prefix, Func getter, + string savePath, object data, Action save) + { + var g = new PropertyGroup($"{prefix}_Exponential", "", isExpanded: true); + g.AddItems(new IPropertyItem[] + { + new FloatProperty($"{prefix}_Exponential_Mean", "지수 분포 평균치", + (getter() as Policy_Exponential)?.mean ?? 0f) + .Bind(setter: v => { (getter() as Policy_Exponential).mean = v; save(data, v, $"{savePath}.mean"); }) + }); + return g; + } + + static PropertyGroup CreateTriangularGroup(string prefix, Func getter, + string savePath, object data, Action save) + { + var g = new PropertyGroup($"{prefix}_Triangular", "", isExpanded: true); + g.AddItems(new IPropertyItem[] + { + new FloatProperty($"{prefix}_Triangular_Min", "삼각 분포 최소값", + (getter() as Policy_Triangular)?.min_val ?? 0f) + .Bind(setter: v => { (getter() as Policy_Triangular).min_val = v; save(data, v, $"{savePath}.min_val"); }), + new FloatProperty($"{prefix}_Triangular_Mean", "삼각 분포 최빈값", + (getter() as Policy_Triangular)?.mode ?? 0f) + .Bind(setter: v => { (getter() as Policy_Triangular).mode = v; save(data, v, $"{savePath}.mode"); }), + new FloatProperty($"{prefix}_Triangular_Max", "삼각 분포 최대값", + (getter() as Policy_Triangular)?.max_val ?? 0f) + .Bind(setter: v => { (getter() as Policy_Triangular).max_val = v; save(data, v, $"{savePath}.max_val"); }) + }); + return g; + } +} diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs.meta b/Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs.meta new file mode 100644 index 00000000..14f5d382 --- /dev/null +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/PolicyPropertyBuilder.cs.meta @@ -0,0 +1,2 @@ +fileFormatVersion: 2 +guid: 8fe0b5ea62f853a4daa30fae82e3082e \ No newline at end of file diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/ProcessorProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/ProcessorProperty.cs index df841de3..3f0b6b16 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/ProcessorProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/ProcessorProperty.cs @@ -88,16 +88,10 @@ public class ProcessorProperty : MonoBehaviour foreach (var prefab in PrefabManager.Instance.prefabDict.Keys) entries.Add(CreateOutputPrefabDetailGroup(processor, prefab)); - entries.Add(new EnumProperty("display_mode_ProcessingTimePolicy", "처리 시간 정책", processor.processing_time_policy.policy).Bind( - setter: v => - { - processor.processing_time_policy = PolicyFactory.Create(v.ToString()); SaveChange(processor, PolicyFactory.Create(v.ToString()), "processing_time_policy"); - })); - entries.Add(CreateProcessingTimePolicy_Constant(processor)); - entries.Add(CreateProcessingTimePolicy_Normal(processor)); - entries.Add(CreateProcessingTimePolicy_Uniform(processor)); - entries.Add(CreateProcessingTimePolicy_Exponential(processor)); - entries.Add(CreateProcessingTimePolicy_Triangular(processor)); + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ProcessingTimePolicy", "처리 시간 정책", "display_mode_ProcessingTimePolicy", + () => processor.processing_time_policy, v => processor.processing_time_policy = v, + "processing_time_policy", processor, SaveChange)); entries.Add(BuildOutputTagChanges()); entries.Add(new ListProperty("outputTagType_string", "", new List { "set" }, "set")); @@ -107,28 +101,15 @@ public class ProcessorProperty : MonoBehaviour entries.Add(new ButtonProperty("AddTagChangeButton", "태그 변경 추가", "").BindClick(SaveOutputTag)); entries.Add(CreateOutputTags(processor)); + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ReadyTimePolicy", "준비 시간 정책", "display_mode_ReadyTimePolicy", + () => processor.ready_time_policy, v => processor.ready_time_policy = v, + "ready_time_policy", processor, SaveChange)); - entries.Add(new EnumProperty("display_mode_ReadyTimePolicy", "준비 시간 정책", processor.ready_time_policy.policy).Bind( - setter: v => - { - processor.ready_time_policy = PolicyFactory.Create(v.ToString()); SaveChange(processor, PolicyFactory.Create(v.ToString()), "ready_time_policy"); - })); - entries.Add(CreateReadyTimePolicy_Constant(processor)); - entries.Add(CreateReadyTimePolicy_Normal(processor)); - entries.Add(CreateReadyTimePolicy_Uniform(processor)); - entries.Add(CreateReadyTimePolicy_Exponential(processor)); - entries.Add(CreateReadyTimePolicy_Triangular(processor)); - - entries.Add(new EnumProperty("display_mode_DefectTimePolicy", "불량률 정책", processor.defect_rate_policy.policy).Bind( - setter: v => - { - processor.defect_rate_policy = PolicyFactory.Create(v.ToString()); SaveChange(processor, PolicyFactory.Create(v.ToString()), "defect_rate_policy"); - })); - entries.Add(CreateDefectRatePolicy_Constant(processor)); - entries.Add(CreateDefectRatePolicy_Normal(processor)); - entries.Add(CreateDefectRatePolicy_Uniform(processor)); - entries.Add(CreateDefectRatePolicy_Exponential(processor)); - entries.Add(CreateDefectRatePolicy_Triangular(processor)); + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "DefectRatePolicy", "불량률 정책", "display_mode_DefectTimePolicy", + () => processor.defect_rate_policy, v => processor.defect_rate_policy = v, + "defect_rate_policy", processor, SaveChange)); entries.Add(CreateRequireResourceGroup(processor)); @@ -137,9 +118,9 @@ public class ProcessorProperty : MonoBehaviour propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_ProcessingTimePolicy(processor.processing_time_policy.policy.ToString()); - HandleDisplayModeChanged_ReadyTimePolicy(processor.ready_time_policy.policy.ToString()); - HandleDisplayModeChanged_DefectRatePolicy(processor.defect_rate_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ProcessingTimePolicy", processor.processing_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ReadyTimePolicy", processor.ready_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "DefectRatePolicy", processor.defect_rate_policy.policy.ToString()); SyncInputPrefabDetailVisibility(processor); SyncOutputPrefabDetailVisibility(processor); SyncOutputTagType(ComponentsManager.webconfigData.tags[0].type); @@ -147,22 +128,10 @@ public class ProcessorProperty : MonoBehaviour private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e) { - // 동적 그룹 표시/비표시 테스트 - if (e.PropertyId == "display_mode_ProcessingTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ProcessingTimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_ReadyTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ReadyTimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_DefectPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_DefectRatePolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ProcessingTimePolicy", "ProcessingTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ReadyTimePolicy", "ReadyTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_DefectTimePolicy", "DefectRatePolicy"); + if (e.PropertyId == "input_selection_policy") { SyncInputPrefabDetailVisibility(processor); @@ -197,7 +166,7 @@ public class ProcessorProperty : MonoBehaviour return group; } - #region + #region public ListProperty BuildOutputTagChanges() { @@ -635,7 +604,6 @@ public class ProcessorProperty : MonoBehaviour { var group = new PropertyGroup("RequireResource", "자원 할당", isExpanded: true); - // 1) required_resources 인덱스화 var requiredIndex = BuildRequiredIndex(processor); int count = 0; @@ -644,18 +612,14 @@ public class ProcessorProperty : MonoBehaviour if (!string.Equals(resource.type, "worker")) continue; - // 2) 매칭 키 결정: 여기서는 resource.name을 키로 쓴다고 가정 - var key = resource.name; // ★ label 말고 name/id 권장 + var key = resource.name; bool isRequired = key != null && requiredIndex.ContainsKey(key); - // 3) 초기값을 isRequired로 var property = new BoolProperty($"required_resource[{count++}]", resource.label, isRequired); - // 4) (선택) 변경 시 processor.required_resources 업데이트 + Patch 저장까지 Bind로 연결 property.Bind(setter: v => { SetRequiredResource(processor, key, v); - // SaveChange(processor or sourceRoot, processorRequiredPath...) 형태로 패치 기록 }); group.AddItem(property); @@ -680,13 +644,9 @@ public class ProcessorProperty : MonoBehaviour { name = resourceName, count = 1, - selection_policy = "random" // 기본값 정책은 규칙에 맞춰 결정 + selection_policy = "random" }); } - else - { - // 이미 있으면 유지 (필요 시 count/policy 기본 보정) - } } else { @@ -695,372 +655,6 @@ public class ProcessorProperty : MonoBehaviour } } - #region 처리 시간 정책 - private PropertyGroup CreateProcessingTimePolicy_Constant(ProcessorDataClass processor) - { - var group = new PropertyGroup("ProcessingTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Constant_Value", "상수 값", (processor.processing_time_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Constant).value = v;SaveChange(processor,v,"processing_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Normal(ProcessorDataClass processor) - { - var group = new PropertyGroup("ProcessingTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Normal_Mean", "정규 분포 표준치", (processor.processing_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Normal).mean = v;SaveChange(processor,v,"processing_time_policy.mean"); } - ), - new FloatProperty("ProcessingTimePolicy_Normal_Gap", "정규 분포 표준 편차", (processor.processing_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Normal).stddev = v;SaveChange(processor,v,"processing_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Uniform(ProcessorDataClass processor) - { - var group = new PropertyGroup("ProcessingTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Uniform_Min", "균등 분포 최소값", (processor.processing_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Uniform).min_val = v;SaveChange(processor,v,"processing_time_policy.min_val"); } - ), - new FloatProperty("ProcessingTimePolicy_Uniform_Max", "균등 분포 최대값", (processor.processing_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Uniform).max_val = v;SaveChange(processor,v,"processing_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Exponential(ProcessorDataClass processor) - { - var group = new PropertyGroup("ProcessingTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Exponential_Mean", "지수 분포 평균치", (processor.processing_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Exponential).mean = v;SaveChange(processor,v,"processing_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateProcessingTimePolicy_Triangular(ProcessorDataClass processor) - { - var group = new PropertyGroup("ProcessingTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ProcessingTimePolicy_Triangular_Min", "지수 분포 최소값", (processor.processing_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Triangular).min_val = v;SaveChange(processor,v,"processing_time_policy.min_val"); } - ), - new FloatProperty("ProcessingTimePolicy_Triangular_Mean", "지수 분포 최빈값", (processor.processing_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Triangular).mode = v;SaveChange(processor,v,"processing_time_policy.mode"); } - ), - new FloatProperty("ProcessingTimePolicy_Triangular_Max", "지수 분포 최대값", (processor.processing_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(processor.processing_time_policy as Policy_Triangular).max_val = v;SaveChange(processor,v,"processing_time_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_ProcessingTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ProcessingTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 준비 시간 정책 - private PropertyGroup CreateReadyTimePolicy_Constant(ProcessorDataClass processor) - { - var group = new PropertyGroup("ReadyTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReadyTimePolicy_Constant_Value", "상수 값", (processor.ready_time_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Constant).value = v;SaveChange(processor,v,"ready_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateReadyTimePolicy_Normal(ProcessorDataClass processor) - { - var group = new PropertyGroup("ReadyTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReadyTimePolicy_Normal_Mean", "정규 분포 표준치", (processor.ready_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Normal).mean = v;SaveChange(processor,v,"ready_time_policy.mean"); } - ), - new FloatProperty("ReadyTimePolicy_Normal_Gap", "정규 분포 표준 편차", (processor.ready_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Normal).stddev = v;SaveChange(processor,v,"ready_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateReadyTimePolicy_Uniform(ProcessorDataClass processor) - { - var group = new PropertyGroup("ReadyTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReadyTimePolicy_Uniform_Min", "균등 분포 최소값", (processor.ready_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Uniform).min_val = v;SaveChange(processor,v,"ready_time_policy.min_val"); } - ), - new FloatProperty("ReadyTimePolicy_Uniform_Max", "균등 분포 최대값", (processor.ready_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Uniform).max_val = v;SaveChange(processor,v,"ready_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateReadyTimePolicy_Exponential(ProcessorDataClass processor) - { - var group = new PropertyGroup("ReadyTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReadyTimePolicy_Exponential_Mean", "지수 분포 평균치", (processor.ready_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Exponential).mean = v;SaveChange(processor,v,"ready_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateReadyTimePolicy_Triangular(ProcessorDataClass processor) - { - var group = new PropertyGroup("ReadyTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReadyTimePolicy_Triangular_Min", "지수 분포 최소값", (processor.ready_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Triangular).min_val = v;SaveChange(processor,v,"ready_time_policy.min_val"); } - ), - new FloatProperty("ReadyTimePolicy_Triangular_Mean", "지수 분포 최빈값", (processor.ready_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Triangular).mode = v;SaveChange(processor,v,"ready_time_policy.mode"); } - ), - new FloatProperty("ReadyTimePolicy_Triangular_Max", "지수 분포 최대값", (processor.ready_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(processor.ready_time_policy as Policy_Triangular).max_val = v;SaveChange(processor,v,"ready_time_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_ReadyTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ReadyTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 불량률 정책 - private PropertyGroup CreateDefectRatePolicy_Constant(ProcessorDataClass processor) - { - var group = new PropertyGroup("DefectRatePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("DefectRatePolicy_Constant_Value", "상수 값", (processor.defect_rate_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Constant).value = v;SaveChange(processor,v,"defect_rate_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateDefectRatePolicy_Normal(ProcessorDataClass processor) - { - var group = new PropertyGroup("DefectRatePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("DefectRatePolicy_Normal_Mean", "정규 분포 표준치", (processor.defect_rate_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Normal).mean = v;SaveChange(processor,v,"defect_rate_policy.mean"); } - ), - new FloatProperty("DefectRatePolicy_Normal_Gap", "정규 분포 표준 편차", (processor.defect_rate_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Normal).stddev = v;SaveChange(processor,v,"defect_rate_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateDefectRatePolicy_Uniform(ProcessorDataClass processor) - { - var group = new PropertyGroup("DefectRatePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("DefectRatePolicy_Uniform_Min", "균등 분포 최소값", (processor.defect_rate_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Uniform).min_val = v;SaveChange(processor,v,"defect_rate_policy.min_val"); } - ), - new FloatProperty("DefectRatePolicy_Uniform_Max", "균등 분포 최대값", (processor.defect_rate_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Uniform).max_val = v;SaveChange(processor,v,"defect_rate_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateDefectRatePolicy_Exponential(ProcessorDataClass processor) - { - var group = new PropertyGroup("DefectRatePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("DefectRatePolicy_Exponential_Mean", "지수 분포 평균치", (processor.defect_rate_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Exponential).mean = v;SaveChange(processor,v,"defect_rate_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateDefectRatePolicy_Triangular(ProcessorDataClass processor) - { - var group = new PropertyGroup("DefectRatePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("DefectRatePolicy_Triangular_Min", "지수 분포 최소값", (processor.defect_rate_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Triangular).min_val = v;SaveChange(processor,v,"defect_rate_policy.min_val"); } - ), - new FloatProperty("DefectRatePolicy_Triangular_Mean", "지수 분포 최빈값", (processor.defect_rate_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Triangular).mode = v;SaveChange(processor,v,"defect_rate_policy.mode"); } - ), - new FloatProperty("DefectRatePolicy_Triangular_Max", "지수 분포 최대값", (processor.defect_rate_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(processor.defect_rate_policy as Policy_Triangular).max_val = v;SaveChange(processor,v,"defect_rate_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_DefectRatePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("DefectRatePolicy_Constant", false); - propertyWindow.SetGroupVisibility("DefectRatePolicy_Normal", false); - propertyWindow.SetGroupVisibility("DefectRatePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("DefectRatePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("DefectRatePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("DefectRatePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("DefectRatePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("DefectRatePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("DefectRatePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("DefectRatePolicy_Triangular", true); - break; - } - } - #endregion - private Dictionary BuildRequiredIndex(ProcessorDataClass processor) { var dict = new Dictionary(StringComparer.Ordinal); @@ -1080,4 +674,4 @@ public class ProcessorProperty : MonoBehaviour if (propertyWindow != null) propertyWindow.PropertyValueChanged -= OnPropertyValueChanged; } -} \ No newline at end of file +} diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/QueueProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/QueueProperty.cs index 2cefe86a..2c2795a6 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/QueueProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/QueueProperty.cs @@ -31,7 +31,7 @@ public class QueueProperty : MonoBehaviour public void InitNodeProperty(QueueDataClass queue) { - List entries = new List + var entries = new List { new StringProperty("name", "이름", queue.name) { @@ -60,21 +60,16 @@ public class QueueProperty : MonoBehaviour }.Bind( setter: v => { queue.queue_type = v; SaveChange(queue, v, "queue_type"); } ), - new EnumProperty("display_mode_CostPolicy", "대기 비용 처리 정책",queue.cost_policy.policy) - { - IsReadOnly=false - }.Bind( - setter: v=>{queue.cost_policy=PolicyFactory.Create(v.ToString());SaveChange(queue,PolicyFactory.Create(v.ToString()),"cost_policy");} - ), - CreateCostPolicy_Constant(queue), - CreateCostPolicy_Normal(queue), - CreateCostPolicy_Uniform(queue), - CreateCostPolicy_Exponential(queue), - CreateCostTimePolicy_Triangular(queue), }; + + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "CostPolicy", "대기 비용 처리 정책", "display_mode_CostPolicy", + () => queue.cost_policy, v => queue.cost_policy = v, + "cost_policy", queue, SaveChange)); + propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_CostPolicy(queue.cost_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "CostPolicy", queue.cost_policy.policy.ToString()); propertyWindow.SetPropertyEnabled("capacity", !queue.is_unlimited); } @@ -82,12 +77,8 @@ public class QueueProperty : MonoBehaviour { Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}"); - // 동적 그룹 표시/비표시 테스트 - if (e.PropertyId == "display_mode_CostPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_CostPolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_CostPolicy", "CostPolicy"); + if (e.PropertyId == "is_unlimited") { bool flag = Convert.ToBoolean(e.NewValue); @@ -119,127 +110,6 @@ public class QueueProperty : MonoBehaviour return group; } - #region 입고 시간 정책 - private PropertyGroup CreateCostPolicy_Constant(QueueDataClass queue) - { - var group = new PropertyGroup("CostPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("CostPolicy_Constant_Value", "상수 값", (queue.cost_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Constant).value = v;SaveChange(queue,v,"cost_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateCostPolicy_Normal(QueueDataClass queue) - { - var group = new PropertyGroup("CostPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("CostPolicy_Normal_Mean", "정규 분포 표준치", (queue.cost_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Normal).mean = v;SaveChange(queue,v,"cost_policy.mean"); } - ), - new FloatProperty("CostPolicy_Normal_Gap", "정규 분포 표준 편차", (queue.cost_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Normal).stddev = v;SaveChange(queue,v,"cost_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateCostPolicy_Uniform(QueueDataClass queue) - { - var group = new PropertyGroup("CostPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("CostPolicy_Uniform_Min", "균등 분포 최소값", (queue.cost_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Uniform).min_val = v;SaveChange(queue,v,"cost_policy.min_val"); } - ), - new FloatProperty("CostPolicy_Uniform_Max", "균등 분포 최대값", (queue.cost_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Uniform).max_val = v;SaveChange(queue,v,"cost_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateCostPolicy_Exponential(QueueDataClass queue) - { - var group = new PropertyGroup("CostPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("CostPolicy_Exponential_Mean", "지수 분포 평균치", (queue.cost_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Exponential).mean = v;SaveChange(queue,v,"cost_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateCostTimePolicy_Triangular(QueueDataClass queue) - { - var group = new PropertyGroup("CostPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("CostPolicy_Triangular_Min", "지수 분포 최소값", (queue.cost_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Triangular).min_val = v;SaveChange(queue,v,"cost_policy.min_val"); } - ), - new FloatProperty("CostPolicy_Triangular_Mean", "지수 분포 최빈값", (queue.cost_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Triangular).mode = v;SaveChange(queue,v,"cost_policy.mode"); } - ), - new FloatProperty("CostPolicy_Triangular_Max", "지수 분포 최대값", (queue.cost_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(queue.cost_policy as Policy_Triangular).max_val = v;SaveChange(queue,v,"cost_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_CostPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("CostPolicy_Constant", false); - propertyWindow.SetGroupVisibility("CostPolicy_Normal", false); - propertyWindow.SetGroupVisibility("CostPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("CostPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("CostPolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("CostPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("CostPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("CostPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("CostPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("CostPolicy_Triangular", true); - break; - } - } - #endregion - private void OnDestroy() { if (propertyWindow != null) diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/RackProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/RackProperty.cs index fc4258da..c037155e 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/RackProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/RackProperty.cs @@ -34,7 +34,7 @@ public class RackProperty : MonoBehaviour public void InitRackProperty(RackDataClass rack) { - List entries = new List + var entries = new List { new StringProperty("name", "이름", rack.name) { @@ -54,83 +54,53 @@ public class RackProperty : MonoBehaviour setter: v => {rack.is_unlimited=v; SaveChange(rack,v,"is_unlimited"); } ), CreateRackLayoutGroup(rack), - /* - new IntProperty("entityperblock","칸당 개체 개수", rack.entity_count_per_block) - { - IsReadOnly=false - }.Bind( - setter: v => {rack.entity_count_per_block=v; SaveChange(rack,v,"entity_count_per_block"); } - ), - */ new ButtonProperty("InitializeButton","초기 재고 설정",""){ }.BindClick(()=>FindAnyObjectByType(FindObjectsInactive.Include).OpenRack(rack,PathIndexer.GetNodePath(rack))), - new EnumProperty("display_mode_ReceicingTimePolicy", "입고 시간 정책",rack.receiving_time_policy.policy).Bind( - setter: v=>{rack.receiving_time_policy=PolicyFactory.Create(v.ToString());SaveChange(rack,PolicyFactory.Create(v.ToString()),"receiving_time_policy");} - ), - CreateReceivingTimePolicy_Constant(rack), - CreateReceivingTimePolicy_Normal(rack), - CreateReceivingTimePolicy_Uniform(rack), - CreateReceivingTimePolicy_Exponential(rack), - CreateReceivingTimePolicy_Triangular(rack), + }; - new EnumProperty("display_mode_ShippingTimePolicy", "출고 시간 정책",rack.shipping_time_policy.policy).Bind( - setter: v=>{rack.shipping_time_policy=PolicyFactory.Create(v.ToString());SaveChange(rack,PolicyFactory.Create(v.ToString()),"shipping_time_policy");} - ), - CreateShippingTimePolicy_Constant(rack), - CreateShippingTimePolicy_Normal(rack), - CreateShippingTimePolicy_Uniform(rack), - CreateShippingTimePolicy_Exponential(rack), - CreateShippingTimePolicy_Triangular(rack), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ReceivingTimePolicy", "입고 시간 정책", "display_mode_ReceicingTimePolicy", + () => rack.receiving_time_policy, v => rack.receiving_time_policy = v, + "receiving_time_policy", rack, SaveChange)); - new EnumProperty("display_mode_StorageCostPolicy", "보관 비용 정책",rack.storage_cost_policy.policy).Bind( - setter: v=>{rack.storage_cost_policy=PolicyFactory.Create(v.ToString());SaveChange(rack,PolicyFactory.Create(v.ToString()),"storage_cost_policy");} - ), - CreateStorageCostPolicy_Constant(rack), - CreateStorageCostPolicy_Normal(rack), - CreateStorageCostPolicy_Uniform(rack), - CreateStorageCostPolicy_Exponential(rack), - CreateStorageCostPolicy_Triangular(rack), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "ShippingTimePolicy", "출고 시간 정책", "display_mode_ShippingTimePolicy", + () => rack.shipping_time_policy, v => rack.shipping_time_policy = v, + "shipping_time_policy", rack, SaveChange)); - new BoolProperty("fms_input_enabled","입력에 FMS 사용", rack.fms_input_enabled) + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "StorageCostPolicy", "보관 비용 정책", "display_mode_StorageCostPolicy", + () => rack.storage_cost_policy, v => rack.storage_cost_policy = v, + "storage_cost_policy", rack, SaveChange)); + + entries.Add(new BoolProperty("fms_input_enabled","입력에 FMS 사용", rack.fms_input_enabled) { IsReadOnly=true }.Bind( setter: v => {rack.fms_input_enabled=v; SaveChange(rack,v,"fms_input_enabled"); } - ), - new BoolProperty("fms_output_enabled","출력에 FMS 사용", rack.fms_output_enabled) + )); + entries.Add(new BoolProperty("fms_output_enabled","출력에 FMS 사용", rack.fms_output_enabled) { IsReadOnly=true }.Bind( setter: v => {rack.fms_output_enabled=v; SaveChange(rack,v,"fms_output_enabled"); } - ), - }; + )); + propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_ReceivingTimePolicy(rack.receiving_time_policy.policy.ToString()); - HandleDisplayModeChanged_ShippingTimePolicy(rack.shipping_time_policy.policy.ToString()); - HandleDisplayModeChanged_StorageCostPolicy(rack.storage_cost_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ReceivingTimePolicy", rack.receiving_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "ShippingTimePolicy", rack.shipping_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "StorageCostPolicy", rack.storage_cost_policy.policy.ToString()); } private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e) { Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}"); - // 동적 그룹 표시/비표시 테스트 - if (e.PropertyId == "display_mode_ReceicingTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ReceivingTimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_ShippingTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_ShippingTimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_StorageCostPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_StorageCostPolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ReceicingTimePolicy", "ReceivingTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_ShippingTimePolicy", "ShippingTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_StorageCostPolicy", "StorageCostPolicy"); + if(e.PropertyId== "limited") { bool flag=Convert.ToBoolean(e.NewValue); @@ -190,369 +160,6 @@ public class RackProperty : MonoBehaviour return group; } - #region 입고 시간 정책 - private PropertyGroup CreateReceivingTimePolicy_Constant(RackDataClass rack) - { - var group = new PropertyGroup("ReceivingTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Constant_Value", "상수 값", (rack.receiving_time_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Constant).value = v;SaveChange(rack,v,"receiving_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Normal(RackDataClass rack) - { - var group = new PropertyGroup("ReceivingTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Normal_Mean", "정규 분포 표준치", (rack.receiving_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Normal).mean = v;SaveChange(rack,v,"receiving_time_policy.mean"); } - ), - new FloatProperty("ReceivingTimePolicy_Normal_Gap", "정규 분포 표준 편차", (rack.receiving_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Normal).stddev = v;SaveChange(rack,v,"receiving_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Uniform(RackDataClass rack) - { - var group = new PropertyGroup("ReceivingTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Uniform_Min", "균등 분포 최소값", (rack.receiving_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Uniform).min_val = v;SaveChange(rack,v,"receiving_time_policy.min_val"); } - ), - new FloatProperty("ReceivingTimePolicy_Uniform_Max", "균등 분포 최대값", (rack.receiving_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Uniform).max_val = v;SaveChange(rack,v,"receiving_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Exponential(RackDataClass rack) - { - var group = new PropertyGroup("ReceivingTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Exponential_Mean", "지수 분포 평균치", (rack.receiving_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Exponential).mean = v;SaveChange(rack,v,"receiving_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateReceivingTimePolicy_Triangular(RackDataClass rack) - { - var group = new PropertyGroup("ReceivingTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ReceivingTimePolicy_Triangular_Min", "지수 분포 최소값", (rack.receiving_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Triangular).min_val = v;SaveChange(rack,v,"receiving_time_policy.min_val"); } - ), - new FloatProperty("ReceivingTimePolicy_Triangular_Mean", "지수 분포 최빈값", (rack.receiving_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Triangular).mode = v;SaveChange(rack,v,"receiving_time_policy.mode"); } - ), - new FloatProperty("ReceivingTimePolicy_Triangular_Max", "지수 분포 최대값", (rack.receiving_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(rack.receiving_time_policy as Policy_Triangular).max_val = v;SaveChange(rack,v,"receiving_time_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_ReceivingTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ReceivingTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 출고 시간 정책 - private PropertyGroup CreateShippingTimePolicy_Constant(RackDataClass rack) - { - var group = new PropertyGroup("ShippingTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Constant_Value", "상수 값", (rack.shipping_time_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Constant).value = v;SaveChange(rack,v,"shipping_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Normal(RackDataClass rack) - { - var group = new PropertyGroup("ShippingTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Normal_Mean", "정규 분포 표준치", (rack.shipping_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Normal).mean = v;SaveChange(rack,v,"shipping_time_policy.mean"); } - ), - new FloatProperty("ShippingTimePolicy_Normal_Gap", "정규 분포 표준 편차", (rack.shipping_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Normal).stddev = v;SaveChange(rack,v,"shipping_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Uniform(RackDataClass rack) - { - var group = new PropertyGroup("ShippingTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Uniform_Min", "균등 분포 최소값", (rack.shipping_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Uniform).min_val = v;SaveChange(rack,v,"shipping_time_policy.min_val"); } - ), - new FloatProperty("ShippingTimePolicy_Uniform_Max", "균등 분포 최대값", (rack.shipping_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Uniform).max_val = v;SaveChange(rack,v,"shipping_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Exponential(RackDataClass rack) - { - var group = new PropertyGroup("ShippingTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Exponential_Mean", "지수 분포 평균치", (rack.shipping_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Exponential).mean = v;SaveChange(rack,v,"shipping_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateShippingTimePolicy_Triangular(RackDataClass rack) - { - var group = new PropertyGroup("ShippingTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("ShippingTimePolicy_Triangular_Min", "지수 분포 최소값", (rack.shipping_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Triangular).min_val = v;SaveChange(rack,v,"shipping_time_policy.min_val"); } - ), - new FloatProperty("ShippingTimePolicy_Triangular_Mean", "지수 분포 최빈값", (rack.shipping_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Triangular).mode = v;SaveChange(rack,v,"shipping_time_policy.mode"); } - ), - new FloatProperty("ShippingTimePolicy_Triangular_Max", "지수 분포 최대값", (rack.shipping_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(rack.shipping_time_policy as Policy_Triangular).max_val = v;SaveChange(rack,v,"shipping_time_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_ShippingTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("ShippingTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 보관 비용 정책 - private PropertyGroup CreateStorageCostPolicy_Constant(RackDataClass rack) - { - var group = new PropertyGroup("StorageCostPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Constant_Value", "상수 값", (rack.storage_cost_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Constant).value = v;SaveChange(rack,v,"storage_cost_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Normal(RackDataClass rack) - { - var group = new PropertyGroup("StorageCostPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Normal_Mean", "정규 분포 표준치", (rack.storage_cost_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Normal).mean = v;SaveChange(rack,v,"storage_cost_policy.mean"); } - ), - new FloatProperty("StorageCostPolicy_Normal_Gap", "정규 분포 표준 편차", (rack.storage_cost_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Normal).stddev = v;SaveChange(rack,v,"storage_cost_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Uniform(RackDataClass rack) - { - var group = new PropertyGroup("StorageCostPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Uniform_Min", "균등 분포 최소값", (rack.storage_cost_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Uniform).min_val = v;SaveChange(rack,v,"storage_cost_policy.min_val"); } - ), - new FloatProperty("StorageCostPolicy_Uniform_Max", "균등 분포 최대값", (rack.storage_cost_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Uniform).max_val = v;SaveChange(rack,v,"storage_cost_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Exponential(RackDataClass rack) - { - var group = new PropertyGroup("StorageCostPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Exponential_Mean", "지수 분포 평균치", (rack.storage_cost_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Exponential).mean = v;SaveChange(rack,v,"storage_cost_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateStorageCostPolicy_Triangular(RackDataClass rack) - { - var group = new PropertyGroup("StorageCostPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("StorageCostPolicy_Triangular_Min", "지수 분포 최소값", (rack.storage_cost_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Triangular).min_val = v;SaveChange(rack,v,"storage_cost_policy.min_val"); } - ), - new FloatProperty("StorageCostPolicy_Triangular_Mean", "지수 분포 최빈값", (rack.storage_cost_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Triangular).mode = v;SaveChange(rack,v,"storage_cost_policy.mode"); } - ), - new FloatProperty("StorageCostPolicy_Triangular_Max", "지수 분포 최대값", (rack.storage_cost_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(rack.storage_cost_policy as Policy_Triangular).max_val = v;SaveChange(rack,v,"storage_cost_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_StorageCostPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("StorageCostPolicy_Constant", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Normal", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("StorageCostPolicy_Triangular", false); - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("StorageCostPolicy_Triangular", true); - break; - } - } - #endregion - public void CleanupByLayoutShrink(RackDataClass rack) { if (rack == null) return; @@ -565,7 +172,6 @@ public class RackProperty : MonoBehaviour { if (e == null || e.from_position == null || e.to_position == null) return true; - // 범위 정규화 var minX = Math.Min(e.from_position.x, e.to_position.x); var maxX = Math.Max(e.from_position.x, e.to_position.x); @@ -575,10 +181,8 @@ public class RackProperty : MonoBehaviour var minZ = Math.Min(e.from_position.z, e.to_position.z); var maxZ = Math.Max(e.from_position.z, e.to_position.z); - // 방어(원하면 0-based로 바꾸거나, min<1 허용 등 정책 조정) if (minX < 1 || minY < 1 || minZ < 1) return true; - // “감소된(잘린) 영역과 겹치면 삭제” == “새 레이아웃 박스에 완전히 포함되지 않으면 삭제” if (maxX > rack_layout.x) return true; if (maxY > rack_layout.y) return true; if (maxZ > rack_layout.z) return true; diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/RobotArmProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/RobotArmProperty.cs index 631fc8de..4d0becb5 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/RobotArmProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/RobotArmProperty.cs @@ -33,7 +33,7 @@ public class RobotArmProperty : MonoBehaviour public void InitRobotArmProperty(RobotArmDataClass robotArm) { - List entries = new List + var entries = new List { new StringProperty("name", "이름", robotArm.name) { @@ -46,44 +46,32 @@ public class RobotArmProperty : MonoBehaviour setter: v => {robotArm.label = v;SaveChange(robotArm,v,"label"); } ), CreatePositionGroup(robotArm), - new EnumProperty("display_mode_RobotArmSpeedPolicy", "로봇팔 속도 정책",robotArm.robot_arm_speed_policy.policy).Bind( - setter: v=>{robotArm.robot_arm_speed_policy=PolicyFactory.Create(v.ToString());SaveChange(robotArm,PolicyFactory.Create(v.ToString()),"robot_arm_speed_policy");} - ), - CreateRobotArmSpeedPolicy_Constant(robotArm), - CreateRobotArmSpeedPolicy_Normal(robotArm), - CreateRobotArmSpeedPolicy_Uniform(robotArm), - CreateRobotArmSpeedPolicy_Exponential(robotArm), - CreateRobotArmSpeedPolicy_Triangular(robotArm), - - new EnumProperty("display_mode_FailureRatePolicy", "고장률 정책",robotArm.failure_rate_policy.policy).Bind( - setter: v=>{robotArm.failure_rate_policy=PolicyFactory.Create(v.ToString());SaveChange(robotArm,PolicyFactory.Create(v.ToString()),"failure_rate_policy");} - ), - CreateFailureRatePolicy_Constant(robotArm), - CreateFailureRatePolicy_Normal(robotArm), - CreateFailureRatePolicy_Uniform(robotArm), - CreateFailureRatePolicy_Exponential(robotArm), - CreateFailureRatePolicy_Triangular(robotArm), - - new EnumProperty("display_mode_RepairTimePolicy", "수리 시간 정책",robotArm.repair_time_policy.policy).Bind( - setter: v=>{robotArm.repair_time_policy=PolicyFactory.Create(v.ToString());SaveChange(robotArm,PolicyFactory.Create(v.ToString()),"repair_time_policy");} - ), - CreateRepairTimePolicy_Constant(robotArm), - CreateRepairTimePolicy_Normal(robotArm), - CreateRepairTimePolicy_Uniform(robotArm), - CreateRepairTimePolicy_Exponential(robotArm), - CreateRepairTimePolicy_Triangular(robotArm), - - CreateInputsGroup(robotArm), - CreateOutputsGroup(robotArm), - - CreateRequireResourceGroup(robotArm) }; + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "RobotArmSpeedPolicy", "로봇팔 속도 정책", "display_mode_RobotArmSpeedPolicy", + () => robotArm.robot_arm_speed_policy, v => robotArm.robot_arm_speed_policy = v, + "robot_arm_speed_policy", robotArm, SaveChange)); + + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "FailureRatePolicy", "고장률 정책", "display_mode_FailureRatePolicy", + () => robotArm.failure_rate_policy, v => robotArm.failure_rate_policy = v, + "failure_rate_policy", robotArm, SaveChange)); + + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "RepairTimePolicy", "수리 시간 정책", "display_mode_RepairTimePolicy", + () => robotArm.repair_time_policy, v => robotArm.repair_time_policy = v, + "repair_time_policy", robotArm, SaveChange)); + + entries.Add(CreateInputsGroup(robotArm)); + entries.Add(CreateOutputsGroup(robotArm)); + entries.Add(CreateRequireResourceGroup(robotArm)); + propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_RobotArmSpeedPolicy(robotArm.robot_arm_speed_policy.policy.ToString()); - HandleDisplayModeChanged_FailureRatePolicy(robotArm.failure_rate_policy.policy.ToString()); - HandleDisplayModeChanged_RepairTimePolicy(robotArm.repair_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "RobotArmSpeedPolicy", robotArm.robot_arm_speed_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "FailureRatePolicy", robotArm.failure_rate_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "RepairTimePolicy", robotArm.repair_time_policy.policy.ToString()); CreateCostGroup(robotArm); } @@ -92,22 +80,9 @@ public class RobotArmProperty : MonoBehaviour { Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}"); - // 동적 그룹 표시/비표시 테스트 - if (e.PropertyId == "display_mode_RobotArmSpeedPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_RobotArmSpeedPolicy(selectedMode); - } - if (e.PropertyId == "display_mode_FailureRatePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_FailureRatePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_RepairTimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_RepairTimePolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_RobotArmSpeedPolicy", "RobotArmSpeedPolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_FailureRatePolicy", "FailureRatePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_RepairTimePolicy", "RepairTimePolicy"); } private PropertyGroup CreatePositionGroup(RobotArmDataClass robotArm) @@ -134,372 +109,6 @@ public class RobotArmProperty : MonoBehaviour return group; } - #region 로봇팔 속도 정책 - private PropertyGroup CreateRobotArmSpeedPolicy_Constant(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RobotArmSpeedPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RobotArmSpeedPolicy_Constant_Value", "상수 값", (robotArm.robot_arm_speed_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Constant).value = v;SaveChange(robotArm,v,"robot_arm_speed_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateRobotArmSpeedPolicy_Normal(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RobotArmSpeedPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RobotArmSpeedPolicy_Normal_Mean", "정규 분포 표준치", (robotArm.robot_arm_speed_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Normal).mean = v;SaveChange(robotArm,v,"robot_arm_speed_policy.mean"); } - ), - new FloatProperty("RobotArmSpeedPolicy_Normal_Gap", "정규 분포 표준 편차", (robotArm.robot_arm_speed_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Normal).stddev = v;SaveChange(robotArm,v,"robot_arm_speed_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateRobotArmSpeedPolicy_Uniform(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RobotArmSpeedPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RobotArmSpeedPolicy_Uniform_Min", "균등 분포 최소값", (robotArm.robot_arm_speed_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Uniform).min_val = v;SaveChange(robotArm,v,"robot_arm_speed_policy.min_val"); } - ), - new FloatProperty("RobotArmSpeedPolicy_Uniform_Max", "균등 분포 최대값", (robotArm.robot_arm_speed_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Uniform).max_val = v;SaveChange(robotArm,v,"robot_arm_speed_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateRobotArmSpeedPolicy_Exponential(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RobotArmSpeedPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RobotArmSpeedPolicy_Exponential_Mean", "지수 분포 평균치", (robotArm.robot_arm_speed_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Exponential).mean = v;SaveChange(robotArm,v,"robot_arm_speed_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateRobotArmSpeedPolicy_Triangular(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RobotArmSpeedPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RobotArmSpeedPolicy_Triangular_Min", "지수 분포 최소값", (robotArm.robot_arm_speed_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Triangular).min_val = v;SaveChange(robotArm,v,"robot_arm_speed_policy.min_val"); } - ), - new FloatProperty("RobotArmSpeedPolicy_Triangular_Mean", "지수 분포 최빈값", (robotArm.robot_arm_speed_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Triangular).mode = v;SaveChange(robotArm,v,"robot_arm_speed_policy.mode"); } - ), - new FloatProperty("RobotArmSpeedPolicy_Triangular_Max", "지수 분포 최대값", (robotArm.robot_arm_speed_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.robot_arm_speed_policy as Policy_Triangular).max_val = v;SaveChange(robotArm,v,"robot_arm_speed_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_RobotArmSpeedPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Constant", false); - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Normal", false); - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("RobotArmSpeedPolicy_Triangular", true); - break; - } - } - #endregion - - #region 고장률 정책 - private PropertyGroup CreateFailureRatePolicy_Constant(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("FailureRatePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("FailureRatePolicy_Constant_Value", "상수 값", (robotArm.failure_rate_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Constant).value = v;SaveChange(robotArm,v,"failure_rate_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateFailureRatePolicy_Normal(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("FailureRatePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("FailureRatePolicy_Normal_Mean", "정규 분포 표준치", (robotArm.failure_rate_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Normal).mean = v;SaveChange(robotArm,v,"failure_rate_policy.mean"); } - ), - new FloatProperty("FailureRatePolicy_Normal_Gap", "정규 분포 표준 편차", (robotArm.failure_rate_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Normal).stddev = v;SaveChange(robotArm,v,"failure_rate_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateFailureRatePolicy_Uniform(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("FailureRatePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("FailureRatePolicy_Uniform_Min", "균등 분포 최소값", (robotArm.failure_rate_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Uniform).min_val = v;SaveChange(robotArm,v,"failure_rate_policy.min_val"); } - ), - new FloatProperty("FailureRatePolicy_Uniform_Max", "균등 분포 최대값", (robotArm.failure_rate_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Uniform).max_val = v;SaveChange(robotArm,v,"failure_rate_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateFailureRatePolicy_Exponential(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("FailureRatePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("FailureRatePolicy_Exponential_Mean", "지수 분포 평균치", (robotArm.failure_rate_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Exponential).mean = v;SaveChange(robotArm,v,"failure_rate_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateFailureRatePolicy_Triangular(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("FailureRatePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("FailureRatePolicy_Triangular_Min", "지수 분포 최소값", (robotArm.failure_rate_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Triangular).min_val = v;SaveChange(robotArm,v,"failure_rate_policy.min_val"); } - ), - new FloatProperty("FailureRatePolicy_Triangular_Mean", "지수 분포 최빈값", (robotArm.failure_rate_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Triangular).mode = v;SaveChange(robotArm,v,"failure_rate_policy.mode"); } - ), - new FloatProperty("FailureRatePolicy_Triangular_Max", "지수 분포 최대값", (robotArm.failure_rate_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.failure_rate_policy as Policy_Triangular).max_val = v;SaveChange(robotArm,v,"failure_rate_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_FailureRatePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("FailureRatePolicy_Constant", false); - propertyWindow.SetGroupVisibility("FailureRatePolicy_Normal", false); - propertyWindow.SetGroupVisibility("FailureRatePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("FailureRatePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("FailureRatePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("FailureRatePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("FailureRatePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("FailureRatePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("FailureRatePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("FailureRatePolicy_Triangular", true); - break; - } - } - #endregion - - #region 수리 시간 정책 - private PropertyGroup CreateRepairTimePolicy_Constant(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RepairTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RepairTimePolicy_Constant_Value", "상수 값", (robotArm.repair_time_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Constant).value = v;SaveChange(robotArm,v,"repair_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateRepairTimePolicy_Normal(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RepairTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RepairTimePolicy_Normal_Mean", "정규 분포 표준치", (robotArm.repair_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Normal).mean = v;SaveChange(robotArm,v,"repair_time_policy.mean"); } - ), - new FloatProperty("RepairTimePolicy_Normal_Gap", "정규 분포 표준 편차", (robotArm.repair_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Normal).stddev = v;SaveChange(robotArm,v,"repair_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateRepairTimePolicy_Uniform(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RepairTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RepairTimePolicy_Uniform_Min", "균등 분포 최소값", (robotArm.repair_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Uniform).min_val = v;SaveChange(robotArm,v,"repair_time_policy.min_val"); } - ), - new FloatProperty("RepairTimePolicy_Uniform_Max", "균등 분포 최대값", (robotArm.repair_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Uniform).max_val = v;SaveChange(robotArm,v,"repair_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateRepairTimePolicy_Exponential(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RepairTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RepairTimePolicy_Exponential_Mean", "지수 분포 평균치", (robotArm.repair_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Exponential).mean = v;SaveChange(robotArm,v,"repair_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateRepairTimePolicy_Triangular(RobotArmDataClass robotArm) - { - var group = new PropertyGroup("RepairTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("RepairTimePolicy_Triangular_Min", "지수 분포 최소값", (robotArm.repair_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Triangular).min_val = v;SaveChange(robotArm,v,"repair_time_policy.min_val"); } - ), - new FloatProperty("RepairTimePolicy_Triangular_Mean", "지수 분포 최빈값", (robotArm.repair_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Triangular).mode = v;SaveChange(robotArm,v,"repair_time_policy.mode"); } - ), - new FloatProperty("RepairTimePolicy_Triangular_Max", "지수 분포 최대값", (robotArm.repair_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(robotArm.repair_time_policy as Policy_Triangular).max_val = v;SaveChange(robotArm,v,"repair_time_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_RepairTimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("RepairTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("RepairTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("RepairTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("RepairTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("RepairTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("RepairTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("RepairTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("RepairTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("RepairTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("RepairTimePolicy_Triangular", true); - break; - } - } - #endregion - PropertyGroup CreateInputsGroup(RobotArmDataClass robotArm) { var group = new PropertyGroup("InputConnect", "입력 연결", isExpanded: true); @@ -532,7 +141,6 @@ public class RobotArmProperty : MonoBehaviour { var group = new PropertyGroup("RequireResource", "자원 할당", isExpanded: true); - // 1) required_resources 인덱스화 var requiredIndex = BuildRequiredIndex(robotArm); int count = 0; @@ -541,18 +149,14 @@ public class RobotArmProperty : MonoBehaviour if (!string.Equals(resource.type, "worker")) continue; - // 2) 매칭 키 결정: 여기서는 resource.name을 키로 쓴다고 가정 - var key = resource.name; // ★ label 말고 name/id 권장 + var key = resource.name; bool isRequired = key != null && requiredIndex.ContainsKey(key); - // 3) 초기값을 isRequired로 var property = new BoolProperty($"required_resource[{count++}]", resource.label, isRequired); - // 4) (선택) 변경 시 processor.required_resources 업데이트 + Patch 저장까지 Bind로 연결 property.Bind(setter: v => { SetRequiredResource(robotArm, key, v); - // SaveChange(processor or sourceRoot, processorRequiredPath...) 형태로 패치 기록 }); group.AddItem(property); @@ -577,13 +181,9 @@ public class RobotArmProperty : MonoBehaviour { name = resourceName, count = 1, - selection_policy = "random" // 기본값 정책은 규칙에 맞춰 결정 + selection_policy = "random" }); } - else - { - // 이미 있으면 유지 (필요 시 count/policy 기본 보정) - } } else { diff --git a/Assets/Scripts/Simulator/UI/PropertyWindow/SourceProperty.cs b/Assets/Scripts/Simulator/UI/PropertyWindow/SourceProperty.cs index 67f163b8..5766ca8e 100644 --- a/Assets/Scripts/Simulator/UI/PropertyWindow/SourceProperty.cs +++ b/Assets/Scripts/Simulator/UI/PropertyWindow/SourceProperty.cs @@ -46,7 +46,7 @@ public class SourceProperty : MonoBehaviour public void InitSourceProperty(SourceDataClass source) { - List entries = new List + var entries = new List { new StringProperty("name", "이름", source.name) { @@ -65,48 +65,38 @@ public class SourceProperty : MonoBehaviour }.Bind( setter: v => {source.prefab=v; SaveChange(source,v,"prefab"); } ), - new EnumProperty("display_mode_TimePolicy", "생산 간격 정책",source.spawn_time_policy.policy).Bind( - setter: v=>{source.spawn_time_policy=PolicyFactory.Create(v.ToString());SaveChange(source,PolicyFactory.Create(v.ToString()),"spawn_time_policy");} - ), - CreateSpawnTimePolicy_Constant(source), - CreateSpawnTimePolicy_Normal(source), - CreateSpawnTimePolicy_Uniform(source), - CreateSpawnTimePolicy_Exponential(source), - CreateSpawnTimePolicy_Triangular(source), + }; - new EnumProperty("display_mode_CountPolicy", "생산 개수 정책",source.spawn_count_policy.policy).Bind( - setter: v=>{source.spawn_count_policy=PolicyFactory.Create(v.ToString());SaveChange(source,PolicyFactory.Create(v.ToString()),"spawn_count_policy");} - ), - CreateSpawnCountPolicy_Constant(source), - CreateSpawnCountPolicy_Normal(source), - CreateSpawnCountPolicy_Uniform(source), - CreateSpawnCountPolicy_Exponential(source), - CreateSpawnCountPolicy_Triangular(source), + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "SpawnTimePolicy", "생산 간격 정책", "display_mode_TimePolicy", + () => source.spawn_time_policy, v => source.spawn_time_policy = v, + "spawn_time_policy", source, SaveChange)); - new BoolProperty("is_unlimited","무제한 모드",source.is_unlimited).Bind( + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "SpawnCountPolicy", "생산 개수 정책", "display_mode_CountPolicy", + () => source.spawn_count_policy, v => source.spawn_count_policy = v, + "spawn_count_policy", source, SaveChange)); + + entries.Add(new BoolProperty("is_unlimited","무제한 모드",source.is_unlimited).Bind( setter: v => {source.is_unlimited = v;SaveChange(source,v,"is_unlimited"); } - ), - new IntProperty("capacity","최대 수용 개수", source.max_spawn_limit) + )); + entries.Add(new IntProperty("capacity","최대 수용 개수", source.max_spawn_limit) { IsReadOnly=false }.Bind( setter: v => { source.max_spawn_limit = v; SaveChange(source, v, "max_spawn_limit"); } - ), + )); + + entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( + "SpawnDefectPolicy", "불량률 정책", "display_mode_DefectPolicy", + () => source.defect_rate_policy, v => source.defect_rate_policy = v, + "defect_rate_policy", source, SaveChange)); - new EnumProperty("display_mode_DefectPolicy", "불량률 정책",source.defect_rate_policy.policy).Bind( - setter: v=>{source.defect_rate_policy=PolicyFactory.Create(v.ToString());SaveChange(source,PolicyFactory.Create(v.ToString()),"defect_rate_policy");} - ), - CreateSpawnDefectPolicy_Constant(source), - CreateSpawnDefectPolicy_Normal(source), - CreateSpawnDefectPolicy_Uniform(source), - CreateSpawnDefectPolicy_Exponential(source), - CreateSpawnDefectPolicy_Triangular(source), - }; propertyWindow.LoadMixedProperties(entries); - HandleDisplayModeChanged_TimePolicy(source.spawn_time_policy.policy.ToString()); - HandleDisplayModeChanged_CountPolicy(source.spawn_count_policy.policy.ToString()); - HandleDisplayModeChanged_DefectPolicy(source.defect_rate_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "SpawnTimePolicy", source.spawn_time_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "SpawnCountPolicy", source.spawn_count_policy.policy.ToString()); + PolicyPropertyBuilder.HandleDisplayModeChanged(propertyWindow, "SpawnDefectPolicy", source.defect_rate_policy.policy.ToString()); propertyWindow.SetPropertyVisibility("capacity", !source.is_unlimited); } @@ -114,22 +104,10 @@ public class SourceProperty : MonoBehaviour { Debug.Log($"[PropertyChanged] Id:{e.PropertyId}, Type:{e.PropertyType}, Value:{e.NewValue}"); - // 동적 그룹 표시/비표시 테스트 - if (e.PropertyId == "display_mode_TimePolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_TimePolicy(selectedMode); - } - if (e.PropertyId == "display_mode_CountPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_CountPolicy(selectedMode); - } - if (e.PropertyId == "display_mode_DefectPolicy") - { - string selectedMode = e.NewValue.ToString(); - HandleDisplayModeChanged_DefectPolicy(selectedMode); - } + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_TimePolicy", "SpawnTimePolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_CountPolicy", "SpawnCountPolicy"); + PolicyPropertyBuilder.TryHandleDisplayModeChanged(e, propertyWindow, "display_mode_DefectPolicy", "SpawnDefectPolicy"); + if (e.PropertyId == "is_unlimited") { bool flag = Convert.ToBoolean(e.NewValue); @@ -161,370 +139,6 @@ public class SourceProperty : MonoBehaviour return group; } - #region 생산 간격 정책 - private PropertyGroup CreateSpawnTimePolicy_Constant(SourceDataClass source) - { - var group = new PropertyGroup("SpawnTimePolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnTimePolicy_Constant_Value", "상수 값", (source.spawn_time_policy as Policy_Constant) ?.value ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Constant).value = v;SaveChange(source,v,"spawn_time_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnTimePolicy_Normal(SourceDataClass source) - { - var group = new PropertyGroup("SpawnTimePolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnTimePolicy_Normal_Mean", "정규 분포 표준치", (source.spawn_time_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Normal).mean = v;SaveChange(source,v,"spawn_time_policy.mean"); } - ), - new FloatProperty("SpawnTimePolicy_Normal_Gap", "정규 분포 표준 편차", (source.spawn_time_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Normal).stddev = v;SaveChange(source,v,"spawn_time_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnTimePolicy_Uniform(SourceDataClass source) - { - var group = new PropertyGroup("SpawnTimePolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnTimePolicy_Uniform_Min", "균등 분포 최소값", (source.spawn_time_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Uniform).min_val = v;SaveChange(source,v,"spawn_time_policy.min_val"); } - ), - new FloatProperty("SpawnTimePolicy_Uniform_Max", "균등 분포 최대값", (source.spawn_time_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Uniform).max_val = v;SaveChange(source,v,"spawn_time_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnTimePolicy_Exponential(SourceDataClass source) - { - var group = new PropertyGroup("SpawnTimePolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnTimePolicy_Exponential_Mean", "지수 분포 평균치", (source.spawn_time_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Exponential).mean = v;SaveChange(source,v,"spawn_time_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnTimePolicy_Triangular(SourceDataClass source) - { - var group = new PropertyGroup("SpawnTimePolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnTimePolicy_Triangular_Min", "지수 분포 최소값", (source.spawn_time_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Triangular).min_val = v;SaveChange(source,v,"spawn_time_policy.min_val"); } - ), - new FloatProperty("SpawnTimePolicy_Triangular_Mean", "지수 분포 최빈값", (source.spawn_time_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Triangular).mode = v;SaveChange(source,v,"spawn_time_policy.mode"); } - ), - new FloatProperty("SpawnTimePolicy_Triangular_Max", "지수 분포 최대값", (source.spawn_time_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_time_policy as Policy_Triangular).max_val = v;SaveChange(source,v,"spawn_time_policy.max_val"); } - ), - }); - return group; - } - - private void HandleDisplayModeChanged_TimePolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Constant", false); - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Normal", false); - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Uniform", false); - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Exponential", false); - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("SpawnTimePolicy_Triangular", true); - break; - } - } - #endregion - - #region 생산 개수 정책 - private PropertyGroup CreateSpawnCountPolicy_Constant(SourceDataClass source) - { - var group = new PropertyGroup("SpawnCountPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnCountPolicy_Constant_Value", "상수 값", (source.spawn_count_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Constant).value = v;SaveChange(source,v,"spawn_count_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnCountPolicy_Normal(SourceDataClass source) - { - var group = new PropertyGroup("SpawnCountPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnCountPolicy_Normal_Mean", "정규 분포 표준치", (source.spawn_count_policy as Policy_Normal) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Normal).mean = v;SaveChange(source,v,"spawn_count_policy.mean"); } - ), - new FloatProperty("SpawnCountPolicy_Normal_Gap", "정규 분포 표준 편차", (source.spawn_count_policy as Policy_Normal) ?.stddev ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Normal).stddev = v;SaveChange(source,v,"spawn_count_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnCountPolicy_Uniform(SourceDataClass source) - { - var group = new PropertyGroup("SpawnCountPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnCountPolicy_Uniform_Min", "균등 분포 최소값", (source.spawn_count_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Uniform).min_val = v;SaveChange(source,v,"spawn_count_policy.min_val"); } - ), - new FloatProperty("SpawnCountPolicy_Uniform_Max", "균등 분포 최대값", (source.spawn_count_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Uniform).max_val = v;SaveChange(source,v,"spawn_count_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnCountPolicy_Exponential(SourceDataClass source) - { - var group = new PropertyGroup("SpawnCountPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnCountPolicy_Exponential_Mean", "지수 분포 평균치", (source.spawn_count_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Exponential).mean = v;SaveChange(source,v,"spawn_count_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnCountPolicy_Triangular(SourceDataClass source) - { - var group = new PropertyGroup("SpawnCountPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnCountPolicy_Triangular_Min", "지수 분포 최소값", (source.spawn_count_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Triangular).min_val = v;SaveChange(source,v,"spawn_count_policy.min_val"); } - ), - new FloatProperty("SpawnCountPolicy_Triangular_Mean", "지수 분포 최빈값", (source.spawn_count_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Triangular).mode = v;SaveChange(source,v,"spawn_count_policy.mode"); } - ), - new FloatProperty("SpawnCountPolicy_Triangular_Max", "지수 분포 최대값", (source.spawn_count_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(source.spawn_count_policy as Policy_Triangular).max_val = v;SaveChange(source,v,"spawn_count_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_CountPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Constant", false); - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Normal", false); - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("SpawnCountPolicy_Triangular", true); - break; - } - } - #endregion - - #region 불량률 정책 - private PropertyGroup CreateSpawnDefectPolicy_Constant(SourceDataClass source) - { - var group = new PropertyGroup("SpawnDefectPolicy_Constant", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnDefectPolicy_Constant_Value", "상수 값", (source.defect_rate_policy as Policy_Constant)?.value??0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Constant).value = v;SaveChange(source,v,"defect_rate_policy.value"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnDefectPolicy_Normal(SourceDataClass source) - { - var group = new PropertyGroup("SpawnDefectPolicy_Normal", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnDefectPolicy_Normal_Mean", "정규 분포 표준치", (source.defect_rate_policy as Policy_Normal)?.mean??0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Normal).mean = v;SaveChange(source,v,"defect_rate_policy.mean"); } - ), - new FloatProperty("SpawnDefectPolicy_Normal_Gap", "정규 분포 표준 편차", (source.defect_rate_policy as Policy_Normal)?.stddev??0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Normal).stddev = v;SaveChange(source,v,"defect_rate_policy.stddev"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnDefectPolicy_Uniform(SourceDataClass source) - { - var group = new PropertyGroup("SpawnDefectPolicy_Uniform", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnDefectPolicy_Uniform_Min", "균등 분포 최소값", (source.defect_rate_policy as Policy_Uniform) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Uniform).min_val = v;SaveChange(source,v,"defect_rate_policy.min_val"); } - ), - new FloatProperty("SpawnDefectPolicy_Uniform_Max", "균등 분포 최대값", (source.defect_rate_policy as Policy_Uniform) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Uniform).max_val = v;SaveChange(source,v,"defect_rate_policy.max_val"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnDefectPolicy_Exponential(SourceDataClass source) - { - var group = new PropertyGroup("SpawnDefectPolicy_Exponential", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnDefectPolicy_Exponential_Mean", "지수 분포 평균치", (source.defect_rate_policy as Policy_Exponential) ?.mean ?? 0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Exponential).mean = v;SaveChange(source,v,"defect_rate_policy.mean"); } - ), - }); - return group; - } - - private PropertyGroup CreateSpawnDefectPolicy_Triangular(SourceDataClass source) - { - var group = new PropertyGroup("SpawnDefectPolicy_Triangular", "", isExpanded: true); - group.AddItems(new IPropertyItem[] - { - new FloatProperty("SpawnDefectPolicy_Triangular_Min", "지수 분포 최소값", (source.defect_rate_policy as Policy_Triangular) ?.min_val ?? 0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Triangular).min_val = v;SaveChange(source,v,"defect_rate_policy.min_val"); } - ), - new FloatProperty("SpawnDefectPolicy_Triangular_Mean", "지수 분포 최빈값", (source.defect_rate_policy as Policy_Triangular) ?.mode ?? 0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Triangular).mode = v;SaveChange(source,v,"defect_rate_policy.mode"); } - ), - new FloatProperty("SpawnDefectPolicy_Triangular_Max", "지수 분포 최대값", (source.defect_rate_policy as Policy_Triangular) ?.max_val ?? 0f) - { - }.Bind( - setter: v => {(source.defect_rate_policy as Policy_Triangular).max_val = v;SaveChange(source,v,"defect_rate_policy.max_val"); } - ), - }); - return group; - } - private void HandleDisplayModeChanged_DefectPolicy(string mode) - { - // 모든 조건부 그룹 숨김 - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Constant", false); - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Normal", false); - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Uniform", false); - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Exponential", false); - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Triangular", false); - - // 선택된 모드에 따라 해당 그룹만 표시 - switch (mode) - { - case "Constant": - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Constant", true); - break; - case "Normal": - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Normal", true); - break; - case "Uniform": - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Uniform", true); - break; - case "Exponential": - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Exponential", true); - break; - case "Triangular": - propertyWindow.SetGroupVisibility("SpawnDefectPolicy_Triangular", true); - break; - } - } - #endregion - private void OnDestroy() { if (propertyWindow != null)