using System; using System.Collections; using System.Collections.Generic; using System.Linq; using Cysharp.Threading.Tasks; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using Sirenix.OdinInspector; using Sirenix.OdinInspector.Editor; using Stary.Evo; using Stary.Evo.Editor; using Stary.Evo.Editor.Entity; using UnityEditor; using UnityEngine; using UnityEngine.Serialization; public class CreatPointModelWindow : OdinEditorWindow { private static List _modelTypes; public static List ScenarioTypes; [MenuItem("Evo/创建ModelLibrary")] private static async void Init() { _modelTypes = await GetModelTypes(); ScenarioTypes = await GetScenarioTypes(); // Get existing open window or if none, make a new one: CreatPointModelWindow window = (CreatPointModelWindow)EditorWindow.GetWindow(typeof(CreatPointModelWindow)); window.Show(); } protected override void OnEnable() { base.OnEnable(); documentFileid = EditorPrefs.GetString("documentFileid"); modelType = EditorPrefs.GetString("modelType"); scenarioType = EditorPrefs.GetString("scenarioType"); } [TitleGroup("创建")] [HorizontalGroup("创建/数据")] [HideLabel] [InfoBox("Model名称")] public string modelName; [TitleGroup("创建")] [HorizontalGroup("创建/数据")] [HideLabel] [InfoBox("Model描述")] [ValueDropdown("GetModelType")] [OnValueChanged("SetModelType")] public string modelType; [TitleGroup("创建")] [HorizontalGroup("创建/数据")] [HideLabel] [InfoBox("Scenario描述")] [ValueDropdown("GetScenarioType")] [OnValueChanged("SetScenarioType")] public string scenarioType; [TitleGroup("上传")] [HorizontalGroup("上传/文件")] [HideLabel] [ReadOnly] [InfoBox("文件所对应数据库id")] public string documentFileid; private List GetModelType() => _modelTypes; private List GetScenarioType() => ScenarioTypes; private void SetModelType() => EditorPrefs.SetString("modelType", modelType); private void SetScenarioType() => EditorPrefs.SetString("scenarioType", scenarioType); [TitleGroup("上传")] [Button("创建Model", ButtonSizes.Large)] public async void CreatModel() { if (string.IsNullOrEmpty(modelName) || string.IsNullOrEmpty(modelType) || string.IsNullOrEmpty(scenarioType) || string.IsNullOrEmpty(documentFileid)) { EditorUtility.DisplayDialog("提示", "modelName和modelType和scenarioType和documentFileid不能为空", "确定"); return; } string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return; } var pointModelEntity = new { Name = modelName, ModelType = modelType, ScenarioType = scenarioType, DocumentFileid = documentFileid, }; string postData = JsonConvert.SerializeObject(pointModelEntity); ResultMessageEntity entity = await WebRequestSystem.Post($"{ip}/ModelLibrary/AddModel", postData); if (entity.code == 200) { EditorUtility.DisplayDialog("提示", "创建成功", "确定"); modelName = ""; documentFileid = ""; EditorPrefs.SetString("documentFileid", ""); EditorPrefs.SetString("modelType", ""); EditorPrefs.SetString("scenarioType", ""); } else if (entity.code == 4009) { EditorUtility.DisplayDialog("提示", $"创建失败,存在相同名称元素", "确定"); } } [TitleGroup("上传")] [VerticalGroup("上传/文件/上传")] [HideLabel] [Sirenix.OdinInspector.FilePath(AbsolutePath = false, Extensions = "$modelType")] [OnValueChanged("UpdateModel")] public string modelPath; [TitleGroup("上传")] [VerticalGroup("上传/文件/上传")] [ReadOnly] [HideLabel, ProgressBar(0, 100f)] public float modelUpdateInterval = 0f; public async void UpdateModel() { if (string.IsNullOrEmpty(modelPath)) { EditorUtility.DisplayDialog("提示", "modelPath不能为空", "确定"); return; } string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return; } var messageEntity = await WebRequestSystem.PostFile(ip + "/FileLoad/UpLoadFile", new[] { modelPath }, (progress) => { modelUpdateInterval = progress * 100f; if (progress >= 1) { EditorUtility.DisplayDialog("提示", $"上传成功!", "确定"); } }); if (messageEntity.code == 200) { List resultMessageEntities = JsonConvert.DeserializeObject>(messageEntity.data.ToString()); if (resultMessageEntities.Count > 0) { foreach (var resultMessageEntity in resultMessageEntities) { var data = JsonConvert.DeserializeObject(resultMessageEntity.data.ToString()) as JObject; documentFileid = data["id"].ToString(); EditorPrefs.SetString("documentFileid", documentFileid); } } } } [FormerlySerializedAs("PointModelEntities")] [ListDrawerSettings(DraggableItems = false, ShowFoldout = false, ShowPaging = false, ShowItemCount = false, HideRemoveButton = true, HideAddButton = true)] [TitleGroup("预览模型")] public List pointModelEntities; protected override async void Initialize() { base.Initialize(); string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return; } ResultMessageEntity entity = await WebRequestSystem.Get(ip, "/ModelLibrary/FindModelAll"); if (entity.code == 200) { var modelLibraryResponses = JsonConvert.DeserializeObject>(entity.data.ToString()); pointModelEntities = modelLibraryResponses.Select(x => new PointModelEntity(this) { id = x.id, Name = x.Name, ModelType = x.ModelType, ScenarioType = x.ScenarioType, DocumentFileid = x.DocumentFileid, }).ToList(); } } private static async UniTask> GetModelTypes() { string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return null; } ResultMessageEntity entity = await WebRequestSystem.Get(ip, "/ModelLibrary/FindModelType"); if (entity.code == 200) { var modelTypes = JsonConvert.DeserializeObject(entity.data.ToString()); return modelTypes.ToList(); } else { return null; } } private static async UniTask> GetScenarioTypes() { string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return null; } ResultMessageEntity entity = await WebRequestSystem.Get(ip, "/SceneWork/FindScenarioType"); if (entity.code == 200) { var scenarioTypes = JsonConvert.DeserializeObject>(entity.data.ToString()); return scenarioTypes; } else { return null; } } [Serializable] public class PointModelEntity { private readonly CreatPointModelWindow window; /// /// id /// [HideInInspector] public string id; /// /// 模型名称 /// [TitleGroup("$id")] [HorizontalGroup("$id/数据")] [HideLabel] [InfoBox("模型名称")] public string Name; /// /// 模型标签 /// [TitleGroup("$id")] [HorizontalGroup("$id/数据")] [HideLabel] [InfoBox("模型标签")] [ValueDropdown("GetModelType")] public string ModelType; /// /// 场景标签 /// [TitleGroup("$id")] [HorizontalGroup("$id/数据")] [HideLabel] [InfoBox("场景标签")] [ValueDropdown("GetScenarioType")] public string ScenarioType; /// /// 文件id /// [TitleGroup("$id")] [HorizontalGroup("$id/数据")] [HideLabel] [ReadOnly] [InfoBox("文件id")] public string DocumentFileid; public PointModelEntity(CreatPointModelWindow window) { this.window = window; } [TitleGroup("$id")] [HorizontalGroup("$id/button")] [Button("", Icon = SdfIconType.ArrowUpCircleFill, IconAlignment = IconAlignment.RightEdge)] public async void UpdatePointCloud() { string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return; } var pointModelEntity = new { Name = Name, ModelType = ModelType, ScenarioType = ScenarioType, DocumentFileid = DocumentFileid, }; string body = JsonConvert.SerializeObject(pointModelEntity); ResultMessageEntity entity = await WebRequestSystem.Put($"{ip}/ModelLibrary/UpdateModel", body); if (entity.code == 200) { EditorUtility.DisplayDialog("提示", $"更新成功{pointModelEntity}", "确定"); } } [TitleGroup("$id")] [HorizontalGroup("$id/button")] [Button("", Icon = SdfIconType.XCircle, IconAlignment = IconAlignment.RightEdge)] public async void DeletePointCloud() { string ip = EditorPrefs.GetString("ip"); if (string.IsNullOrEmpty(ip)) { EditorUtility.DisplayDialog("提示", "ip不能为空", "确定"); return; } ResultMessageEntity entity = await WebRequestSystem.Delete(ip, $"/ModelLibrary/DeleteModelbyid/{id}"); if (entity.code == 200) { window.pointModelEntities.Remove(this); EditorUtility.DisplayDialog("提示", "删除成功", "确定"); } } private List GetModelType() { return window.GetModelType(); } private List GetScenarioType() { return window.GetScenarioType(); } } }