using Simulator.Data; using System; using System.Collections; using System.Collections.Generic; using UnityEngine; using UVC.UI.Window.PropertyWindow; public enum SpawnPolicy { Constant, Normal, Uniform, Exponential, Triangular } public class SourceProperty : MonoBehaviour { [SerializeField] private PropertyWindow propertyWindow; private void Awake() { propertyWindow.PropertyValueChanged += OnPropertyValueChanged; } public void SetProertyWindow(ComponentType type, ComponentDataBase data) { Debug.Log(data); switch (type) { case ComponentType.Source: InitSourceProperty(data as SourceDataClass); break; } } 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 InitSourceProperty(SourceDataClass source) { List entries = new List { new StringProperty("name", "이름", source.name) { IsReadOnly=true }, new StringProperty("label", "라벨", source.label) { IsReadOnly=false }.Bind( setter: v => {source.label = v;SaveChange(source,v,"label"); } ), CreatePositionGroup(source), new ListProperty("prefabType","생성될 개체 유형",new List(PrefabManager.Instance.prefabDict.Keys),source.prefab) { IsReadOnly=false }.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,v.ToString(),"spawn_time_policy.type");} ), 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,v.ToString(),"spawn_count_policy.type");} ), CreateSpawnCountPolicy_Constant(source), CreateSpawnCountPolicy_Normal(source), CreateSpawnCountPolicy_Uniform(source), CreateSpawnCountPolicy_Exponential(source), CreateSpawnCountPolicy_Triangular(source), 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) { IsReadOnly=false }.Bind( setter: v => { source.max_spawn_limit = v; SaveChange(source, v, "max_spawn_limit"); } ), new EnumProperty("display_mode_DefectPolicy", "불량률 정책",source.defect_rate_policy.policy).Bind( setter: v=>{source.defect_rate_policy=PolicyFactory.Create(v.ToString());SaveChange(source,v.ToString(),"defect_rate_policy.type");} ), 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()); propertyWindow.SetPropertyVisibility("capacity", !source.is_unlimited); } private void OnPropertyValueChanged(object sender, PropertyValueChangedEventArgs e) { 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); } if (e.PropertyId == "is_unlimited") { bool flag = Convert.ToBoolean(e.NewValue); propertyWindow.SetPropertyVisibility("capacity", !flag); } } private PropertyGroup CreatePositionGroup(SourceDataClass source) { var group = new PropertyGroup("robotArm_position", "위치 및 회전", isExpanded: true); group.AddItems(new IPropertyItem[] { new FloatProperty("x_position", "X 좌표(m)", source.physical.position.x) { }.Bind( setter: v => {source.physical.position.x = v;SaveChange(source,v,"physical.position.x"); } ), new FloatProperty("y_position", "y 좌표(m)", source.physical.position.y) { }.Bind( setter: v => {source.physical.position.y = v;SaveChange(source,v,"physical.position.y"); } ), new FloatProperty("orientation", "회전(°)", source.physical.orientation) { }.Bind( setter: v => {source.physical.orientation = v;SaveChange(source,v,"physical.orientation");propertyWindow.ApplyExternalValue("orientation",RotationSnap.snaporientaion(v),false); } ), }); 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 }