//生成卡仓抓卡动作 public ResInfoData GenerateTakeGelFromWare(ResInfoData take_seat, ref Sequence seque, string gelmask = "") { if (take_seat != null) { //卡仓位移动 //抓手移动到卡仓机位 var move_act = Spawn.create( MoveTo.create(Engine.getInstance().gelwareDevice, 3001, take_seat.StoreX, -1, -1), MoveTo.create(Engine.getInstance().handDevice, 3001, take_seat.X, take_seat.Y)); seque.AddAction(move_act); //抓手抓卡 var take_act = HandTakeCard.create(Engine.getInstance().handDevice, 3001, take_seat.Z, take_seat.ZLimit, take_seat.ZCatch, 0); seque.AddAction(take_act); //把测试卡放在卡仓Gel位中 var geltem = take_seat.Values[take_seat.CountX, 0]; take_seat.Values[take_seat.CountX, 0] = null; take_act.successfun = (ActionBase act) => { ResManager.getInstance().handseat_resinfo = (ResInfoData)geltem; return(true); }; take_act.destroyfun = (ActionBase act) => { take_seat.Values[take_seat.CountX, 0] = geltem; return(true); }; } else { ErrorSystem.WriteActError("卡仓无卡", true, false); } return(take_seat); }
//是否在离心机内的所有卡当前动作是离心 public bool IsCanPutCen(CentrifugeMDevice cendev) { if (actionmanager.getAllActionsCount(cendev) != 0) { return(false); } foreach (var seat in resmanager.centrifuge_list) { if (seat.Code == cendev.Centrifugem.Code.SetValue) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) != ActionPoint.ActionPointType.Centrifugal) { return(false); } } } break; } } return(true); }
//生成在普通位抓卡 public ResInfoData GenerateTakeGelFromNormal(ResInfoData take_seat, ref Sequence seque) { if (take_seat != null) { //抓手移动 seque.AddAction(MoveTo.create(Engine.getInstance().handDevice, 3001, (int)take_seat.X, (int)(take_seat.Y), 0)); //抓手抓卡 var take_act = HandTakeCard.create(Engine.getInstance().handDevice, 3001, (int)take_seat.Z, (int)take_seat.ZLimit, (int)take_seat.ZCatch, 0); seque.AddAction(take_act); //把测试卡放在Gel位中 var geltem = take_seat.Values[take_seat.CountX, 0]; if (take_seat.Values != null) { take_seat.Values[take_seat.CountX, 0] = null; } take_act.successfun = (ActionBase act) => { ResManager.getInstance().handseat_resinfo = (ResInfoData)geltem; return(true); }; take_act.destroyfun = (ActionBase act) => { take_seat.Values[take_seat.CountX, 0] = geltem; return(true); }; } else { ErrorSystem.WriteActError("普通位找不到卡", true, false); } return(take_seat); }
public override ActionBase InitAll() { var seque = Sequence.create(InitXyz.create(this, 10000, true, false, false)); foreach (var ware_seat in ResManager.getInstance().gelwarehouse_list) { seque.AddAction(MoveTo.create(this, 5000, (int)ware_seat.DetectX)); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { var res = TestGelCard(); if (res != null) { for (int i = 0; i < ware_seat.Count; i++) { ware_seat.Values[i, 0] = null; if (res[i + (int)ware_seat.DoorX]) { var resinfo = new ResInfoData(); ware_seat.Values[i, 0] = resinfo; } } } return(true); })); } seque.AddAction(ScanGelFromWare.create(handDevice, 20000, this)); seque.AddAction(MoveTo.create(this, 5000, 0)); seque.AddAction(InitXyz.create(this, 10000, true, false, false)); return(seque); }
//是否在离心机内的所有卡当前动作是离心 public bool IsCanPutCen(CentrifugeMDevice cendev) { if (actionmanager.getAllActionsCount(cendev) != 0) { return(false); } foreach (var seat in resmanager.centrifuge_list) { if (seat.Code == cendev.Centrifugem.Code.SetValue) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.PutOk) { var exp_package = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_package.GetActionTypeAt(0) != TestStepEnum.ZKDLXJ) { return(false); } } } break; } } return(true); }
/// <summary> /// 在某个资源组里面移出某个资源 /// </summary> /// <param name="assetName">资源名称</param> /// <param name="name">资源组名称</param> public static void RemoveAsset(string assetName, string name) { ResGroupCfg data = resInfo.GetGroupInfo(name); if (data != null) { if (data.keys.Contains(assetName)) { data.keys.Remove(assetName); } } foreach (ResGroupCfg sld in resInfo.groups) { if (sld.keys.Contains(assetName)) { return; } } if (resInfo.resources.Exists(a => a.name == assetName)) { ResInfoData da = resInfo.GetResInfo(assetName); if (da != null) { resInfo.resources.Remove(da); } } }
public void UpdataResInfoList() { resinfo_list.Clear(); //普通卡位 foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk && resinfo.ActionList.Count() != 0) { resinfo_list.Add(resinfo); } } } if (actionmanager.getAllActionsCount(handDevice) != 0) { return; } //检测离心机只的卡 foreach (var seat in resmanager.centrifuge_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk && resinfo.ActionList.Count() != 0) { resinfo_list.Add(resinfo); } } } }
private void LoadAllAssets() { if (needLoadAssets.Count == 0) { AllAssetLoadFinished(); } else { for (int i = needLoadAssets.Count - 1; i >= 0; i--) { //string assetName = needLoadAssets[i]; ResInfoData data = GameCfgMgr.Instance.GetResInfo(needLoadAssets[i]); ResMgr.Intstance.LoadAsset(data.name, a => { if (a == null) { LoadItemERROR(data.name); } else { LoadAssetFinished(data.name); } }); } } }
private void LoadABFinished(AssetBundle AB, string abName) { if (AB == null) { loaded = -1; Debug.LogError("加载ab失败:" + abName); ResMgr.Intstance.QueueEvent(new LoadGroupItemError(groupInfo.sceneName, abName)); } if (this.mNeedLoadABs[abName].Count > 1) { ResMgr.Intstance.LoadAll(abName, () => { this.mNeedLoadABs.Remove(abName); CheckAllAbLoadFinished(); }); } else { if (this.mNeedLoadABs[abName].Count > 0) { ResInfoData data = this.mNeedLoadABs[abName][0]; ResMgr.Intstance.LoadAsset(data.name, a => { this.mNeedLoadABs.Remove(abName); CheckAllAbLoadFinished(); }); } else { CheckAllAbLoadFinished(); } } }
public bool IsDirty(ResInfoData data) { return(data.isKeepInMemory != isKeepInMemory || data.isResourcesPath != isResourcesPath || data.name != name || data.path != path || data.isFairyGuiPack != isFairyGuiPack); }
/// <summary> /// 添加文件 /// </summary> /// <param name="path"></param> /// <param name="groupName"></param> public static string AddAssetToGroup(string path, string groupName) { ResGroupCfg data = resInfo.GetGroupInfo(groupName); if (data == null) { return(""); } string assetName = Path.GetFileNameWithoutExtension(path); if (!data.keys.Contains(assetName)) { data.keys.Add(assetName); if (!resInfo.resources.Exists(a => a.name == assetName)) { ResInfoData da = new ResInfoData(); da.name = assetName; da.path = path.Replace("\\", "/"); da.type = Path.GetExtension(path); da.isFairyGuiPack = false; if (da.type == ".bytes") { TextAsset text = AssetDatabase.LoadAssetAtPath <TextAsset>(da.path); byte [] descBytes = text.bytes; if (descBytes.Length > 4 && descBytes[0] == 0x50 && descBytes[1] == 0x4b && descBytes[2] == 0x03 && descBytes[3] == 0x04) { da.isFairyGuiPack = true; Debug.LogError(text.bytes[0] + "/" + text.bytes[1] + "/" + text.bytes[2] + "/" + text.bytes[3] + "/"); } } da.isKeepInMemory = true; da.isResourcesPath = da.path.Contains("Assets/Resources"); if (da.isResourcesPath) { string rootPath = da.path .Replace("Assets/Resources/", ""); rootPath = Path.GetDirectoryName(rootPath); da.ABName = rootPath; //da.ABName = da.path.Replace(Application.dataPath + "/Resources") } else { string rootPath = Path.GetDirectoryName(da.path); rootPath = rootPath.Substring(rootPath.LastIndexOf("/") + 1); da.ABName = rootPath.ToLower(); } resInfo.resources.Add(da); } } return(assetName); }
public ResInfo(UnityEngine.Object obj, ResInfoData data) { asset = obj; base.ABName = data.ABName; base.isFairyGuiPack = data.isFairyGuiPack; base.isKeepInMemory = data.isKeepInMemory; base.isResourcesPath = data.isResourcesPath; base.name = data.name; }
public AssetInfo(int id, string name) { NameHashCode = id; this.Name = name; data = resInfo.GetResInfo(name); if (File.Exists(data.path)) { FileInfo info = new FileInfo(data.path); size = info.Length; } }
public static ResInfoData InitAssetInfo(string groupName, string path) { string assetName = Path.GetFileNameWithoutExtension(path) + Path.GetExtension(path).Replace(".", "_"); var da = new ResInfoData(path) { path = path, type = Path.GetExtension(path) }; da.address = CheckAssetName(da.path); //url = string.Format("{0}:{1}", groupName, name); da.isResourcesPath = path.Contains("/Resources/"); var rootPath = Path.GetDirectoryName(path); rootPath = rootPath.Replace("\\", "/"); var name1 = Path.GetFileName(path); string abName = string.Empty; string url = string.Empty; if (rootPath != null) { if (da.isResourcesPath) { int index = rootPath.LastIndexOf("/Resources", StringComparison.Ordinal); if (rootPath.Length <= index + 11) { abName = string.Empty; url = "r://" + name1; } else { abName = rootPath.Substring(index + 11); url = "r://" + abName + "/" + name1; } } else { var path1 = rootPath.Replace(ResConfig.ExternalResDir + "/", "");; url = "e://" + path1 + "/" + name1; abName = path1.Replace("/", "_"); } //AssetBundle.LoadFromFileAsync() } da.ABName = abName; da.url = url; return(da); }
//生成离心机放卡动作 public bool GeneratePutGelToCent(string cen_code, ResInfoData put_seat, ResInfoData put_gel, ref Sequence seque) { var centrifuge = Engine.getInstance().cenMrg.GetCentrifugeByCode(cen_code); if (centrifuge == null) { centrifuge = Engine.getInstance().cenMrg.GetFreeCentrifuge(); } if (put_seat != null) { //打开离心机门 var opendoor_act = HandOpenCloseDoor.create(Engine.getInstance().handDevice, 5000, cen_code, true); seque.AddAction(opendoor_act); //离心机位移动 //抓手移动到离心机位 var move_act = Spawn.create( MoveTo.create(centrifuge, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX]), MoveTo.create(Engine.getInstance().handDevice, 3001, (int)put_seat.X, (int)put_seat.CenHandYP[put_seat.CountX])); seque.AddAction(move_act); //抓手放卡 var put_act = HandPutCard.create(Engine.getInstance().handDevice, 3001, (int)put_seat.ZPut); seque.AddAction(put_act); //把测试卡放在离心Gel位中 put_seat.Values[put_seat.CountX, 0] = put_gel; if (put_gel != null) { put_gel.PutOk = false; } put_act.successfun = (ActionBase act) => { if (put_gel != null) { put_gel.PutOk = true; put_gel.SetSeatInfo(put_seat); } ResManager.getInstance().handseat_resinfo = null; return(true); }; put_act.destroyfun = (ActionBase act) => { put_seat.Values[put_seat.CountX, 0] = null; ResManager.getInstance().handseat_resinfo = null; return(true); }; } else { ErrorSystem.WriteActError("离心机位已满", true, false); } return(put_seat != null); }
/// <summary> /// 获取一个资源信息根据资源名称 /// </summary> /// <param name="assetName">资源名称</param> /// <returns></returns> public ResInfoData GetResInfo(string assetName) { ResInfoData data = null; foreach (ResInfoData info in this.resources) { if (assetName == info.name) { data = info; break; } } return(data); }
/// <summary> /// 获取资源信息 /// </summary> /// <param name="assetName">资源名称</param> /// <returns></returns> public ResInfoData GetResInfo(string assetName) { ResInfoData data = null; if (this.resCfg != null) { foreach (ResInfoData info in resCfg.resources) { if (info.name == assetName) { data = info; break; } } } return(data); }
//生成放卡在普通位 public bool GeneratePutGelToNormal(ResInfoData put_seat, ResInfoData put_gel, ref Sequence seque) { if (put_seat != null) { //抓手移动 seque.AddAction(MoveTo.create(Engine.getInstance().handDevice, 3001, (int)put_seat.X, (int)(put_seat.Y), 0)); //抓手放卡 var put_act = HandPutCard.create(Engine.getInstance().handDevice, 3001, (int)put_seat.ZPut, 0); seque.AddAction(put_act); //把测试卡放在Gel位中 if (put_seat.Values != null) { put_seat.Values[put_seat.CountX, 0] = put_gel; } if (put_gel != null) { put_gel.PutOk = false; } put_act.successfun = (ActionBase act) => { if (put_gel != null) { put_gel.PutOk = true; put_gel.SetSeatInfo(put_seat); } ResManager.getInstance().handseat_resinfo = null; return(true); }; put_act.destroyfun = (ActionBase act) => { if (put_seat.Values != null) { put_seat.Values[put_seat.CountX, 0] = null; } ResManager.getInstance().handseat_resinfo = null; return(true); }; } else { ErrorSystem.WriteActError("普通位已满", true, false); } return(put_seat != null); }
//生成离心机抓卡动作 public ResInfoData GenerateTakeGelFromCent(ResInfoData take_seat, string cen_code, ref Sequence seque) { var centrifuge = Engine.getInstance().cenMrg.GetCentrifugeByCode(cen_code); if (centrifuge == null) { centrifuge = Engine.getInstance().cenMrg.GetFreeCentrifuge(); } if (take_seat != null) { //打开离心机门 var opendoor_act = HandOpenCloseDoor.create(Engine.getInstance().handDevice, 5000, cen_code, true); seque.AddAction(opendoor_act); //离心机位移动 //抓手移动到离心机位 var move_act = Spawn.create( MoveTo.create(centrifuge, 30001, -1, -1, (int)take_seat.CenGelP[take_seat.CountX]), MoveTo.create(Engine.getInstance().handDevice, 3001, (int)take_seat.X, (int)take_seat.CenHandYP[take_seat.CountX])); seque.AddAction(move_act); //抓手抓卡 var take_act = HandTakeCard.create(Engine.getInstance().handDevice, 3001, (int)take_seat.Z, (int)take_seat.ZLimit, (int)take_seat.ZCatch, 0, centrifuge); seque.AddAction(take_act); //把测试卡放在离心Gel位中 var geltem = take_seat.Values[take_seat.CountX, 0]; take_seat.Values[take_seat.CountX, 0] = null; take_act.successfun = (ActionBase act) => { ResManager.getInstance().handseat_resinfo = (ResInfoData)geltem; return(true); }; take_act.destroyfun = (ActionBase act) => { take_seat.Values[take_seat.CountX, 0] = geltem; return(true); }; } else { ErrorSystem.WriteActError("离心机位找不到卡", true, false); } return(take_seat); }
/// <summary> /// 添加资源到字典 /// </summary> /// <param name="assetName"></param> private void AddResToDic(string assetName, UnityEngine.Object obj) { if (obj == null) { return; } if (!mDic.ContainsKey(assetName)) { ResInfoData data = GameCfgMgr.Instance.GetResInfo(assetName); if (data == null) { Debug.LogError("加载了无效的资源 assetName =" + assetName); } else { ResInfo info = new ResInfo(obj, data); mDic[assetName] = info; } } }
/// <summary> /// 获得这个资源组里面的所有AB /// </summary> /// <returns></returns> public Dictionary <string, List <ResInfoData> > GetGroupABs(ResGroupCfg groupData) { Dictionary <string, List <ResInfoData> > aBToAssets = new Dictionary <string, List <ResInfoData> >(); foreach (string str in groupData.keys) { ResInfoData data = GetResInfo(str); if (data != null) { if (!data.isResourcesPath) { if (!string.IsNullOrEmpty(data.ABName)) { if (aBToAssets.ContainsKey(data.ABName)) { aBToAssets[data.ABName].Add(data); } else { aBToAssets[data.ABName] = new List <ResInfoData>() { data }; } } else { if (!AppConst.DebugMode) { Debug.LogError("这个资源不存在ab里面 资源名称:" + str + "abName:" + data.ABName); } } } } else { Debug.LogError("资源未配置到资源设置,请打开 Tool->资源配置 资源名称:" + str); } } return(aBToAssets); }
//生成卡仓放卡动作 public bool GeneratePutGelToWare(ResInfoData put_seat, ResInfoData put_gel, ref Sequence seque) { if (put_seat != null) { var move_act = Spawn.create( MoveTo.create(Engine.getInstance().gelwareDevice, 3001, (int)(put_seat.StoreX), -1, -1), MoveTo.create(Engine.getInstance().handDevice, 3001, (int)put_seat.X, (int)put_seat.Y)); seque.AddAction(move_act); //抓手放卡 var put_act = HandPutCard.create(Engine.getInstance().handDevice, 3001, (int)put_seat.ZPut); seque.AddAction(put_act); //把测试卡放在离心Gel位中 put_seat.Values[put_seat.CountX, 0] = put_gel; if (put_gel != null) { put_gel.PutOk = false; } put_act.successfun = (ActionBase act) => { if (put_gel != null) { put_gel.PutOk = true; put_gel.SetSeatInfo(put_seat); } ResManager.getInstance().handseat_resinfo = null; return(true); }; put_act.destroyfun = (ActionBase act) => { put_seat.Values[put_seat.CountX, 0] = null; ResManager.getInstance().handseat_resinfo = null; return(true); }; } else { ErrorSystem.WriteActError("卡仓位已满", true, false); } return(put_seat != null); }
public void Save() { var MainPanel = (this.View as ShowDeepPlateView).MainPanel; var gds = MainPanel.GetControls <Grid>(); foreach (var gd in gds) { if (gd.DataContext != null) { if (gd.Tag is VBJ vbj) { if (gd.DataContext is object[,] vals) { int X = vals.GetLength(0); int Y = vals.GetLength(1); for (int i = 0; i < X; i++) { for (int j = 0; j < Y; j++) { if (vals[i, j] != null) { var resinfo_tem = new ResInfoData(); resinfo_tem.Values = vbj.Values; resinfo_tem.SetCode("userfill"); resinfo_tem.SetCode("userfill"); vals[i, j] = resinfo_tem; } vbj.SetValue(i, j, vals[i, j]); } } } } } } this.RequestClose(); }
/// <summary> /// 从AB里面加载资源 这里一定要保证AB是先加载过的 不会主动加载AB /// </summary> /// <typeparam name="T">资源类型</typeparam> /// <param name="assteName">资源名称</param> /// <param name="type">资源类型</param> /// <param name="callBaclk">回调</param> /// <param name="keepInMemory">是否常驻内存</param> public void LoadAsset(string assetName, Type type, Action <UnityEngine.Object> callBaclk = null) { if (mDic.ContainsKey(assetName)) { if (callBaclk != null) { callBaclk(mDic[assetName].asset); } return; } UnityEngine.Object obj = null; ResInfoData data = GameCfgMgr.Instance.GetResInfo(assetName); if (data != null) { if (data.isResourcesPath) { obj = Resources.Load(data.ABName + "/" + assetName, type); AddResToDic(assetName, obj); if (callBaclk != null) { callBaclk(obj); } } else { bool isEditorLoad = false; #if UNITY_EDITOR if (AppConst.DebugMode) { isEditorLoad = true; obj = UnityEditor.AssetDatabase.LoadAssetAtPath(data.path, type); AddResToDic(assetName, obj); if (callBaclk != null) { callBaclk(obj); } } #endif Action <UnityEngine.Object> loadAsseted = assetObj => { AddResToDic(assetName, obj); if (callBaclk != null) { callBaclk(obj); } }; if (!isEditorLoad) { if (!string.IsNullOrEmpty(data.ABName)) { ABMgr.Instance.LoadAB(data.ABName, ab => { if (ab != null) { obj = ab.LoadAsset(data.name + data.type, type); loadAsseted(obj); } else { Debug.LogError("加载ab失败:" + data.ABName); if (callBaclk != null) { callBaclk(obj); } } }); } else { Debug.LogError("想要加载的AB名字为空:" + assetName); if (callBaclk != null) { callBaclk(obj); } } } } } else { Debug.LogError("要加载的资源未配置:" + assetName); } }
public void ActLogic(List <T_GelStep> act_group, List <T_GelStep> act_group_next, double dt) { if (act_group != null && act_group.Count != 0 && act_group[0].State == 0) { int next_state = 2; var seque_act = Sequence.create(); var exper_package = ((ExperimentPackage)act_group[0].ExperPackage); seque_act.exp_pack = exper_package; AbstractCanDevice device = null; foreach (var act in act_group) { resmanager.tip_count += act.InjectCount; } if (act_group[0].InjectCount != 0) { var act_next = act_group_next == null ? null : act_group_next[0]; device = injectorDevice; act_group.Sort((a, b) => { return(((ExperimentPackage)a.ExperPackage).piercer_index > ((ExperimentPackage)b.ExperPackage).piercer_index ? 1 : -1); }); seque_act = generater.GenerateAction(act_group); if (act_next != null && act_next.InjectCount == 0) { seque_act.AddAction(SkCallBackFun.create((ActionBase act_tem) => { inj_wait_time = 9999; return(true); })); } } else { var act = act_group[0]; var act_next = act_group_next == null ? null : act_group_next[0]; var resinfo = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_GelSeat"); if (resinfo == null) { resinfo = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_Centrifuge"); } if ((resinfo == null || !resinfo.PutOk) && act.StepClass != TestStepEnum.LoadGel) { return; } switch (act.StepClass) { case TestStepEnum.LoadGel: { if (actionmanager.getAllActionsCount(handDevice) == 0) { var take_seat = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_GelSeat", "", "3"); var paper_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "4", null, exper_package.is_crossmatching); if (paper_seat != null) { device = handDevice; if (take_seat != null) { generater.GenerateTakeGelFromNormal(take_seat, ref seque_act); } else { seque_act.AddAction(HandTakeGelFromWare.create(handDevice, 3001, gelwareDevice, exper_package.gel_mask_id, exper_package.GetGelMask(), exper_package.GetSampleCode(act.SampleIndex))); } seque_act.AddAction(HandPutGelToNormal.create(handDevice, 3001, gelwareDevice, paper_seat)); if (act_next != null && act_next.StepClass != TestStepEnum.LoadGel) { seque_act.AddAction(SkCallBackFun.create((ActionBase act_tem) => { hand_wait_time = 999999; var ware_act = MoveTo.create(gelwareDevice, 3000, 0); ware_act.runAction(gelwareDevice); return(true); })); } exper_package.piercer_index = paper_seat.CountX; paper_seat.Values[paper_seat.CountX, 0] = new ResInfoData(); seque_act.destroyfun = (ActionBase act_tem) => { paper_seat.Values[paper_seat.CountX, 0] = null; return(true); }; next_state = 2; } else { next_state = 0; } } else { next_state = 0; } } break; case TestStepEnum.KaiKongGel: { int handrx = 0; int injrx = 0; var device_hand = new ActionDevice(handDevice); var device_inj = new ActionDevice(injectorDevice); next_state = 0; if (resinfo.Purpose != "4") { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "4"); if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { device = handDevice; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); next_state = 0; } } else { bool is_next_kaikong = act_next != null ? act_next.StepClass == TestStepEnum.KaiKongGel : false; var paper_seat = resmanager.GetResByCode(exper_package.GetGelMask(), "T_BJ_GelSeat", "", "4"); int yb = is_next_kaikong ? -1 : 0; if (paper_seat != null && device_hand.GetRealX(ref handrx) && (handrx + 1000) < paper_seat.X && ActionDevice.hand_tx < paper_seat.X && device_inj.GetRealX(ref injrx) && (injrx + 1000) < paper_seat.InjectorX && ActionDevice.inj_tx < paper_seat.InjectorX + 1000) { device = piercerDevice; seque_act.AddAction(PaperCard.create(piercerDevice, 3000, paper_seat, yb)); seque_act.AddAction(SkCallBackFun.create((ActionBase acttem) => { exper_package.is_open = true; resmanager.gel_count++; return(true); })); next_state = 2; } } } break; case TestStepEnum.JYJS: { exper_package.is_jyjs = true; next_state = 2; } break; case TestStepEnum.ZKDFY: { next_state = 0; if (resinfo.Purpose == "1") { next_state = 0; exper_package.hatch_cur_time += dt; if (exper_package.hatch_cur_time >= exper_package.hatch_time) { next_state = 2; } } else if (!(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "1"); if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { device = handDevice; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } exper_package.hatch_cur_time = 0; generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); next_state = 0; } else { next_state = 0; } } } break; case TestStepEnum.ZKDLXJ: { if (actionmanager.getAllActionsCount(handDevice) == 0) { next_state = 0; if (resinfo.Purpose != "lxj" && !(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { //查看可用离心机 var centrifuge_list = resmanager.centrifuge_list.Where(item => item.Status == 1).ToList(); centrifuge_list.Sort((a, b) => { return(a.LastUseTime < b.LastUseTime ? 1 : -1); }); foreach (var seat in centrifuge_list) { CentrifugeMDevice cendev = cenMrg.GetCentrifugeByCode(seat.Code); if (seat.Status == 1 && cendev != null) { device = handDevice; bool is_last_cent = seat == centrifuge_list[centrifuge_list.Count - 1]; bool iscanputcen = IsCanPutCen(cendev); var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); if (iscanputcen == false) { put_seat = null; } //放进待定位 if (put_seat == null && resinfo.Purpose != "3" && is_last_cent) { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { var spaw = Spawn.create(); var put_seque = Sequence.create(); if (put_seat.Purpose == "lxj") { //打开离心机门 var opendoor_act = HandOpenCloseDoor.create(handDevice, 5000, cendev.Centrifugem.Code.SetValue, true); put_seque.AddAction(opendoor_act); } var put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref put_seque); spaw.AddAction(put_seque); seque_act.AddAction(spaw); if (put_seat.Purpose == "lxj") { spaw.AddAction(MoveTo.create(cendev, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX])); generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque_act); } else { generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); } seat.LastUseTime = Engine.getInstance().getSystemMs(); break; } else { next_state = 0; } } } } } else { next_state = 0; } } break; case TestStepEnum.PutPeiGelBack: { var put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "2"); if (put_seat != null && resinfo.Purpose == "lxj") { device = handDevice; var put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque_act); next_state = 2; } } break; case TestStepEnum.XJPD: { var put_seat = resmanager.GetResByCode("", "T_BJ_Camera"); //相机位 var wasted_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat", "", "1"); //垃圾位 var daiding_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); //待定位 if (put_seat != null && wasted_seat != null && !(resinfo.Purpose == "4" && actionmanager.getAllActionsCount(piercerDevice) != 0)) { device = handDevice; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque_act.AddAction(MoveTo.create(handDevice, 3000, (int)put_seat.X, (int)(put_seat.Y), -1)); seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, (int)(put_seat.Z))); //拍照分析 seque_act.AddAction(SkCallBackFun.create((ActionBase acttem) => { opDevice.CameraLight(true); bool result = true; if (cameraDevice.IsOpen == false) { result = cameraDevice.Open(); } var bm = cameraDevice.CaptureImage(); cameraDevice.Save(bm, exper_package); opDevice.CameraLight(false); return(true); })); //是否还有动作 if (exper_package.action_list.Count > 1 && daiding_seat != null) { seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); generater.GeneratePutGelToNormal(daiding_seat, put_gel, ref seque_act); } else { seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque_act.AddAction(MoveTo.create(handDevice, 3000, (int)wasted_seat.X, (int)(wasted_seat.Y))); seque_act.AddAction(HandPutCard.create(handDevice, 3000, (int)wasted_seat.ZPut, 0)); seque_act.AddAction(SkCallBackFun.create((ActionBase act_tem) => { DelPackage(exper_package); return(true); })); } next_state = 2; } } break; case TestStepEnum.ECONOMIZECOUNTTIME: { next_state = 0; if (exper_package.is_open) { exper_package.after_kktime -= dt; if (exper_package.after_kktime <= 0) { device = handDevice; next_state = 2; exper_package.after_kktime = 0; ResInfoData put_gel = null; if (resinfo.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(resinfo, resinfo.CenCode, ref seque_act); } else { put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque_act); } var wasted_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat"); //垃圾位 seque_act.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque_act.AddAction(MoveTo.create(handDevice, 3000, (int)wasted_seat.X, (int)(wasted_seat.Y))); seque_act.AddAction(HandPutCard.create(handDevice, 3000, (int)wasted_seat.ZPut, 0)); } } } break; } } if (device != null) { seque_act.AddAction(SkCallBackFun.create((ActionBase act) => { foreach (var act_tem in act_group) { act_tem.State = next_state; } return(true); })); foreach (var act_tem in act_group) { act_tem.State = 1; } seque_act.runAction(device); } else { foreach (var act_tem in act_group) { act_tem.State = next_state; } } } }
//离心开始逻辑 public bool CenRunLogic(CentrifugeMDevice cendev) { bool is_allcenact = true; //是否全是离心动作 bool is_allputok = true; //是否全是已放好 bool is_empty = true; //是否为空 bool is_gelfull = false; //是否已满 bool is_gelsoon = false; //是否有卡快要离心 int gel_count = 0; List <ResInfoData> resinfo_list = new List <ResInfoData>(); if (experiment_package_list.Count == 0) { return(false); } foreach (var seat in resmanager.centrifuge_list) { if (seat.Code == cendev.Centrifugem.Code.SetValue) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.PutOk) { is_empty = false; var exp_pack = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_pack == null) { exp_pack = GetExpPackageByMask(resinfo.GetCodeAt(0)); } System.Diagnostics.Debug.Assert(exp_pack != null); if (exp_pack == null) { return(false); } is_allcenact = is_allcenact && exp_pack.GetActionTypeAt(0) == TestStepEnum.ZKDLXJ; is_allputok = is_allputok && resinfo.PutOk; resinfo_list.Add(resinfo); gel_count++; } } is_gelfull = gel_count >= seat.Values.Length; } } if ((is_gelfull == false && actionmanager.getAllActionsCount(handDevice) != 0) || actionmanager.getAllActionsCount(cendev) != 0) { return(false); } //普通卡位是否有卡快要离心 foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.PutOk && resinfo.FindCode("pei*", false) == false) { var exp_pack = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_pack == null) { continue; } is_gelsoon = (exp_pack.GetActionTypeAt(0) == TestStepEnum.ZKDLXJ) || (exp_pack.GetActionTypeAt(0) == TestStepEnum.ZKDFY && exp_pack.GetActionTypeAt(1) == TestStepEnum.ZKDLXJ && exp_pack.hatch_time - exp_pack.hatch_cur_time <= 20000); if (seat.Purpose == 4 && exp_pack.FindAct(TestStepEnum.ZKDLXJ) && exp_pack.FindAct(TestStepEnum.ZKDFY) == false) { is_gelsoon = true; } if (is_gelsoon) { break; } } } if (is_gelsoon) { break; } } //检测是否满足运行条件 if (is_allcenact && is_allputok && !is_empty && (!is_gelsoon || is_gelfull)) { int hspeed = (int)cendev.Centrifugem.HightSpeed.SetValue; int lspeed = (int)cendev.Centrifugem.LowSpeed.SetValue; int htime = (int)cendev.Centrifugem.HightSpeedTime.SetValue; int ltime = (int)cendev.Centrifugem.LowSpeedTime.SetValue; int uphtime = (int)cendev.Centrifugem.AddHSpeedTime.SetValue; int upltime = (int)cendev.Centrifugem.AddLSpeedTime.SetValue; int stime = (int)cendev.Centrifugem.StopSpeedTime.SetValue; //配平卡动作(如果离心机内卡是单数就再放一张配平卡) var seque_pei = Sequence.create(); var seque = Sequence.create(); if (resinfo_list.Count() % 2 != 0) { var spaw = Spawn.create(); var put_seque = Sequence.create(); //得到配平卡 var pei_gel = resmanager.GetResByCode("pei" + cendev.Centrifugem.Code.SetValue, "T_BJ_GelSeat"); var put_gel = generater.GenerateTakeGelFromNormal(pei_gel, ref put_seque); T_GelStep[] pei_step = { new T_GelStep(), new T_GelStep() }; pei_step[0].StepClass = TestStepEnum.ZKDLXJ; pei_step[1].StepClass = TestStepEnum.PutPeiGelBack; var exp_pack = ExperimentPackage.Create(pei_step.ToList(), pei_gel.GetCodeAt(0), "123", 8, 0, 1, 0, false, 0, 0, false); exp_pack.is_jyjs = true; experiment_package_list.Add(exp_pack); resinfo_list.Add(put_gel); var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); spaw.AddAction(put_seque); spaw.AddAction(MoveTo.create(cendev, 30001, -1, -1, put_seat.CenGelP[put_seat.CountX])); seque_pei.AddAction(spaw); generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque_pei); } seque_pei.AddAction(HandOpenCloseDoor.create(handDevice, 5000, cendev.Centrifugem.Code.SetValue, false)); seque.AddAction(SkWaitForAction.create(handDevice, seque_pei)); seque.AddAction(CentrifugeStart.create(cendev, 6000000, hspeed, lspeed, htime, ltime, uphtime, upltime, stime)); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { foreach (var resinfo in resinfo_list) { var exp_pack = GetExpPackageByMask(resinfo.GetGelMask()); if (exp_pack == null) { exp_pack = GetExpPackageByMask(resinfo.GetCodeAt(0)); } System.Diagnostics.Debug.Assert(exp_pack != null); var act = exp_pack.GetActionAt(0); act.State = 2; } return(true); })); seque_pei.runAction(handDevice); seque.runAction(cendev); return(true); } return(false); }
//放卡到离心逻辑 public bool CenPutLogic(CentrifugeMDevice cendev) { if (resmanager.handseat_resinfo != null || actionmanager.getAllActionsCount(piercerDevice) != 0 || actionmanager.getAllActionsCount(handDevice) != 0 || actionmanager.getAllActionsCount(cendev) != 0) { return(false); } bool isallcen = true;//是否在离心机内的所有卡当前动作是离心 foreach (var seat in resmanager.centrifuge_list) { if (seat.Code == cendev.Centrifugem.Code.SetValue) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { isallcen = resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Centrifugal; if (isallcen == false) { break; } } } break; } } //普通卡位 List <ResInfoData> resinfo_list = new List <ResInfoData>(); foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Centrifugal) { resinfo_list.Add(resinfo); } } } } //把卡转到离心位 if (resinfo_list.Count != 0) { var seque = Sequence.create(); bool is_put = false; seque.AddAction(InitXyz.create(cendev, 30000, false, false, true)); foreach (var resinfo in resinfo_list) { var put_seat = resmanager.GetResByCode("null", "T_BJ_Centrifuge", cendev.Centrifugem.Code.SetValue); if (isallcen == false) { put_seat = null; } if (put_seat == null && resinfo.Purpose != "3") { put_seat = resmanager.GetResByCode("null", "T_BJ_GelSeat", "", "3"); } if (put_seat != null) { var put_gel = generater.GenerateTakeGelFromNormal(resinfo, ref seque); if (put_seat.Purpose == "lxj") { generater.GeneratePutGelToCent(cendev.Centrifugem.Code.SetValue, put_seat, put_gel, ref seque); } else { generater.GeneratePutGelToNormal(put_seat, put_gel, ref seque); } is_put = true; } } if (is_put) { seque.runAction(handDevice); return(true); } } return(false); }
//垃圾箱逻辑 public bool RubbishLogic(double dt) { if (actionmanager.getAllActionsCount(handDevice) != 0) { return(false); } //普通卡位 ResInfoData camer_gel = null; if (resmanager.handseat_resinfo != null && resmanager.handseat_resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { camer_gel = resmanager.handseat_resinfo; camer_gel.Purpose = "hand"; } if (camer_gel == null) { foreach (var seat in resmanager.gelseat_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { camer_gel = resinfo; } break; } } if (camer_gel != null) { break; } } } //检测离心机只的卡 if (camer_gel == null) { foreach (var seat in resmanager.centrifuge_list) { for (int i = 0; i < seat.Values.Length; i++) { ResInfoData resinfo = (ResInfoData)seat.Values[i, 0]; if (seat.Status == 1 && resinfo != null && resinfo.InjectFinish && resinfo.PutOk) { if (resinfo.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { resinfo.Purpose = "lxj"; resinfo.CenCode = seat.Code; camer_gel = resinfo; break; } } } if (camer_gel != null) { break; } } } //把卡转到垃圾位 if (camer_gel != null && camer_gel.GetActionAt(0) == ActionPoint.ActionPointType.Rubbish) { var seque = Sequence.create(); bool is_put = false; var put_seat = resmanager.GetResByCode("", "T_BJ_WastedSeat"); if (put_seat != null) { ResInfoData put_gel = null; if (camer_gel.Purpose == "lxj") { put_gel = generater.GenerateTakeGelFromCent(camer_gel, camer_gel.CenCode, ref seque); } else if (camer_gel.Purpose == "hand") { put_gel = camer_gel; } else { put_gel = generater.GenerateTakeGelFromNormal(camer_gel, ref seque); } seque.AddAction(MoveTo.create(handDevice, 3000, (int)put_seat.X, (int)(put_seat.Y))); seque.AddAction(HandPutCard.create(handDevice, 3000, (int)put_seat.ZPut, 0)); seque.AddAction(MoveTo.create(handDevice, 3000, -1, -1, 0)); seque.AddAction(SkCallBackFun.create((ActionBase acttem) => { if (camer_gel.Purpose == "hand") { resmanager.handseat_resinfo = null; } put_gel.RemoveActionAt(0); return(true); })); is_put = true; } if (is_put) { seque.runAction(handDevice); return(true); } } return(false); }
//把转换为action point public ActionPoint GelStepToActionPoint(T_GelStep gel_step, TestStepEnum type) { if (gel_step.StepClass == TestStepEnum.FPYT && gel_step.GetLiquidInfo().IsDetector&& type != TestStepEnum.MixLiquid && type != TestStepEnum.SpuLiquid) { type = TestStepEnum.FollowAbsLiquid; } ActionPoint action_point = new ActionPoint(-1, -1, -1, type); var resmanager = ResManager.getInstance(); var exp_pack = ((ExperimentPackage)gel_step.ExperPackage); if (gel_step.StepClass == TestStepEnum.FPYT) { //是否为混合 bool is_mix = gel_step.is_mix; var fpytinfo = gel_step.GetFpytInfo(); var liquidinfo = gel_step.GetLiquidInfo(); action_point.deep = (int)liquidinfo.Deep; action_point.deepspeed = (int)liquidinfo.DeeSpeed; action_point.detectordeep = (int)liquidinfo.DetectorDeep; action_point.tube = (int)(fpytinfo.TubeValue >> gel_step.SampleIndex); action_point.capacity = (int)liquidinfo.Vol; action_point.absbspeed = (int)liquidinfo.AbsSpeed; action_point.spuspeed = (int)liquidinfo.SpuSpeed; action_point.backcapacity = (int)liquidinfo.BackCapacity; action_point.backspeed = (int)liquidinfo.BackCapacitySpeed; action_point.mixtimes = (int)(gel_step.is_spu?fpytinfo.MixTimes:0); action_point.mixdeep = (int)fpytinfo.MixDeep; action_point.spucapacity = (int)fpytinfo.Vol; if (action_point.type == TestStepEnum.AbsLiquid || action_point.type == TestStepEnum.FollowAbsLiquid) { ResInfoData abs_tager = null;//吸取的液体 if (liquidinfo.LiquidType == "病人红细胞" || liquidinfo.LiquidType == "病人血清") { abs_tager = resmanager.GetResByCode(exp_pack.GetSampleCode(gel_step.SampleIndex), "T_BJ_SampleRack"); } else { abs_tager = resmanager.GetResByCode(liquidinfo.LiquidType, "T_BJ_AgentiaWarehouse"); } System.Diagnostics.Debug.Assert(abs_tager != null); action_point.x = abs_tager.InjectorX; action_point.y = abs_tager.InjectorY; action_point.z = abs_tager.InjectorZ; } else if (action_point.type == TestStepEnum.MixLiquid) { //查找deep盘 ResInfoData deep_plane = resmanager.GetResByCode(gel_step.MixCode, "T_BJ_DeepPlate"); if (deep_plane == null) { //deep_plane = resmanager.GetFreeDeepPlate(5); deep_plane = resmanager.GetResByCode("null", "T_BJ_DeepPlate"); deep_plane.Values[deep_plane.CountX, deep_plane.CountY] = deep_plane; } System.Diagnostics.Debug.Assert(deep_plane != null); if (deep_plane.FindCode(gel_step.MixCode, false) == false) { deep_plane.AddCode(gel_step.MixCode); } action_point.x = deep_plane.InjectorX; action_point.y = deep_plane.InjectorY; action_point.z = deep_plane.InjectorZ; } else if (action_point.type == TestStepEnum.SpuLiquid) { //查找gel卡 ResInfoData gel_seat = resmanager.GetResByCode(exp_pack.GetGelMask(), "T_BJ_GelSeat"); System.Diagnostics.Debug.Assert(gel_seat != null); action_point.x = gel_seat.InjectorX; action_point.y = gel_seat.InjectorY; action_point.z = gel_seat.InjectorZ; action_point.tube_gap = gel_seat.InjectorGap; } } return(action_point); }
public static bool Update() { bool ret = false; if (resInfo == null) { return(ret); } if (loaclFileresInfo == null || loaclFileresInfo.groups.Count != resInfo.groups.Count || loaclFileresInfo.resources.Count != resInfo.resources.Count) { ret = true; } else { if (loaclFileresInfo == null || loaclFileresInfo.groups.Count == resInfo.groups.Count) { foreach (ResGroupCfg da in loaclFileresInfo.groups) { bool flag = false; foreach (ResGroupCfg da2 in resInfo.groups) { if (da.groupName == da2.groupName && !ListIsSame(da.keys, da2.keys)) { flag = true; break; } } if (flag) { ret = true; break; } } if (!ListIsSame(loaclFileresInfo.groups, resInfo.groups)) { ret = true; } } if (loaclFileresInfo == null || loaclFileresInfo.resources.Count == resInfo.resources.Count) { foreach (ResInfoData da in loaclFileresInfo.resources) { ResInfoData da2 = resInfo.GetResInfo(da.address); if (da2 == null || da.IsDirty(da2)) { ret = true; break; } } } } if (!ret) { return(false); } string jsonStr = JsonUtility.ToJson(resInfo, true); loaclFileresInfo = JsonUtility.FromJson <ResJsonData>(jsonStr); if (!System.IO.Directory.Exists(Path.GetDirectoryName(ResConfig.ResJsonCfgFilePath))) { System.IO.Directory.CreateDirectory(Path.GetDirectoryName(ResConfig.ResJsonCfgFilePath)); } File.WriteAllText(ResConfig.ResJsonCfgFilePath, jsonStr); UnityEditor.AssetDatabase.SaveAssets(); UnityEditor.AssetDatabase.Refresh(); return(true); }