200 lines
8.8 KiB
C#
200 lines
8.8 KiB
C#
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<IPropertyEntry>
|
|
{
|
|
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<InitialInventoryWindow>(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;
|
|
}
|
|
}
|