using Simulator.Data; using System; using System.Collections.Generic; using UnityEngine; using UVC.UI.Window.PropertyWindow; public class ASRSProperty : MonoBehaviour { [SerializeField] private PropertyWindow propertyWindow; private void Awake() { propertyWindow.PropertyValueChanged += OnPropertyValueChanged; } public void SetPropertyWindow(ComponentType type, ComponentDataBase data) { if (PlayerPropertyDataBase.isPlaying) { return; } Debug.Log(data); InitAsrsProperty(data as ASRSDataClass); } 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 InitAsrsProperty(ASRSDataClass asrs) { var entries = new List { new StringProperty("name", "이름", asrs.name) { IsReadOnly=true }, new StringProperty("label", "라벨", asrs.label) { IsReadOnly=false }.Bind( setter: v => {asrs.label = v;SaveChange(asrs,v,"label"); } ), CreatePositionGroup(asrs), new BoolProperty("limited","용량 무제한", asrs.is_unlimited) { IsReadOnly=false }.Bind( setter: v => {asrs.is_unlimited=v; SaveChange(asrs,v,"is_unlimited"); } ), CreateRackLayoutGroup(asrs), new ButtonProperty("InitializeButton","초기 재고 설정",""){ }.BindClick(()=>FindAnyObjectByType(FindObjectsInactive.Include).Open(asrs)), }; entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "ReceivingTimePolicy", "입고 시간 정책", "display_mode_ReceicingTimePolicy", () => asrs.receiving_time_policy, v => asrs.receiving_time_policy = v, "receiving_time_policy", asrs, SaveChange)); entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "ShippingTimePolicy", "출고 시간 정책", "display_mode_ShippingTimePolicy", () => asrs.shipping_time_policy, v => asrs.shipping_time_policy = v, "shipping_time_policy", asrs, SaveChange)); entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "StorageCostPolicy", "보관 비용 정책", "display_mode_StorageCostPolicy", () => asrs.storage_cost_policy, v => asrs.storage_cost_policy = v, "storage_cost_policy", asrs, SaveChange)); entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "HorizonSpeedPolicy", "크레인 수평 이동 속도", "display_mode_HorizonSpeedPolicy", () => asrs.horizon_speed_policy, v => asrs.horizon_speed_policy = v, "horizon_speed_policy", asrs, SaveChange)); entries.AddRange(PolicyPropertyBuilder.CreatePolicyEntries( "VerticalSpeedPolicy", "크레인 수직 이동 속도", "display_mode_VerticalSpeedPolicy", () => asrs.vertical_speed_policy, v => asrs.vertical_speed_policy = v, "vertical_speed_policy", asrs, SaveChange)); 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"); } )); 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); 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}"); 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); propertyWindow.SetPropertyEnabled("x_layout", !flag); propertyWindow.SetPropertyEnabled("z_layout", !flag); propertyWindow.SetPropertyEnabled("entityperblock", !flag); propertyWindow.SetPropertyEnabled("InitializeButton", !flag); } } private PropertyGroup CreatePositionGroup(ASRSDataClass asrs) { return PropertyHelper.CreatePositionGroup("asrs_position", asrs, propertyWindow, SaveChange); } private PropertyGroup CreateRackLayoutGroup(ASRSDataClass asrs) { var group = new PropertyGroup("asrslayout", "자동 창고 구조", isExpanded: true); group.AddItems(new IPropertyItem[] { new IntProperty("x_layout", "행 개수(x)", asrs.asrs_layout.x) { }.Bind( setter: v => {asrs.asrs_layout.x = v;SaveChange(asrs,v,"asrs_layout.x");CleanupByLayoutShrink(asrs); } ), new IntProperty("y_layout", "열 개수(y)", asrs.asrs_layout.z) { IsReadOnly=true }.Bind( setter: v => {asrs.asrs_layout.z = v;SaveChange(asrs,v,"asrs_layout.z");CleanupByLayoutShrink(asrs); } ), new IntProperty("z_layout", "층 수(z)", asrs.asrs_layout.y) { }.Bind( setter: v => {asrs.asrs_layout.y = v;SaveChange(asrs,v,"asrs_layout.y");CleanupByLayoutShrink(asrs); } ), }); return group; } public void CleanupByLayoutShrink(ASRSDataClass ASRS) { if (ASRS == null) return; ASRS.initialize.RemoveAll(e => IsOutOfNewBounds(e, ASRS.asrs_layout)); SaveChange(ASRS, ASRS.initialize, "initialize"); } private bool IsOutOfNewBounds(InitializeEntry e, rack_layout asrs_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 > asrs_Layout.x) return true; if (maxY > asrs_Layout.y) return true; if (maxZ > asrs_Layout.z) return true; return false; } private void OnDestroy() { if (propertyWindow != null) propertyWindow.PropertyValueChanged -= OnPropertyValueChanged; } }