using Simulator.Data; using System; using System.Collections.Generic; using UnityEngine; using UVC.UI.Window.PropertyWindow; public class RackProperty : MonoBehaviour { [SerializeField] private PropertyWindow propertyWindow; private void Awake() { propertyWindow.PropertyValueChanged += OnPropertyValueChanged; } public void SetPropertyWindow(ComponentType type, ComponentDataBase data) { Debug.Log(PlayerPropertyDataBase.isPlaying); Debug.Log("rack"); if (PlayerPropertyDataBase.isPlaying) { return; } InitRackProperty(data as RackDataClass); } void SaveChange(object source, object value, string name) { var path = PathIndexer.GetNodePath(source); Patch updateData = new Patch(); updateData.value = value; UpdateValueStack.AddPatch($"{path}.{name}", value); } public void InitRackProperty(RackDataClass rack) { var entries = new List { new StringProperty("name", "이름", rack.name) { IsReadOnly=true }, new StringProperty("label", "라벨", rack.label) { IsReadOnly=false }.Bind( setter: v => {rack.label = v;SaveChange(rack,v,"label"); } ), CreatePositionGroup(rack), new BoolProperty("limited","용량 무제한", rack.is_unlimited) { IsReadOnly=false }.Bind( setter: v => {rack.is_unlimited=v; SaveChange(rack,v,"is_unlimited"); } ), CreateRackLayoutGroup(rack), new ButtonProperty("InitializeButton","초기 재고 설정",""){ }.BindClick(()=>FindAnyObjectByType(FindObjectsInactive.Include).OpenRack(rack,PathIndexer.GetNodePath(rack))), }; entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "ReceivingTimePolicy", "입고 시간 정책", "display_mode_ReceicingTimePolicy", () => rack.receiving_time_policy, v => rack.receiving_time_policy = v, "receiving_time_policy", rack, SaveChange)); entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "ShippingTimePolicy", "출고 시간 정책", "display_mode_ShippingTimePolicy", () => rack.shipping_time_policy, v => rack.shipping_time_policy = v, "shipping_time_policy", rack, SaveChange)); 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"); } )); 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); 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}"); 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); propertyWindow.SetPropertyEnabled("x", !flag); propertyWindow.SetPropertyEnabled("z", !flag); propertyWindow.SetPropertyEnabled("entityperblock", !flag); propertyWindow.SetPropertyEnabled("InitializeButton", !flag); } } private PropertyGroup CreatePositionGroup(RackDataClass rack) { return PropertyHelper.CreatePositionGroup("rack_position", rack, propertyWindow, SaveChange); } private PropertyGroup CreateRackLayoutGroup(RackDataClass rack) { var group = new PropertyGroup("racklayout", "랙 구조", isExpanded: true); group.AddItems(new IPropertyItem[] { new IntProperty("x", "행 개수(x)", rack.rack_layout.x) { }.Bind( setter: v => {rack.rack_layout.x = v;SaveChange(rack,v,"rack_layout.x");CleanupByLayoutShrink(rack); } ), new IntProperty("y", "열 개수(y)", rack.rack_layout.z) { IsReadOnly=true }.Bind( setter: v => {rack.rack_layout.z = v;SaveChange(rack,v,"rack_layout.z");CleanupByLayoutShrink(rack); } ), new IntProperty("z", "층 수(z)", rack.rack_layout.y) { }.Bind( setter: v => {rack.rack_layout.y = v;SaveChange(rack,v,"rack_layout.y");CleanupByLayoutShrink(rack); } ), }); return group; } public void CleanupByLayoutShrink(RackDataClass rack) { if (rack == null) return; rack.initialize.RemoveAll(e => IsOutOfNewBounds(e, rack.rack_layout)); SaveChange(rack, rack.initialize, "initialize"); } private bool IsOutOfNewBounds(InitializeEntry e, rack_layout rack_layout) { 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); var minY = Math.Min(e.from_position.y, e.to_position.y); var maxY = Math.Max(e.from_position.y, e.to_position.y); var minZ = Math.Min(e.from_position.z, e.to_position.z); var maxZ = Math.Max(e.from_position.z, e.to_position.z); 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; return false; } private void OnDestroy() { if (propertyWindow != null) propertyWindow.PropertyValueChanged -= OnPropertyValueChanged; } }