CHIVA\bj 11 месяцев назад
Родитель
Сommit
48655be5b1
25 измененных файлов с 641 добавлено и 96 удалено
  1. 9 3
      Framework/BuilderDriver/OperationListener.cs
  2. 18 4
      Framework/Scripts/Init/GameLaunch.cs
  3. 106 14
      Framework/Scripts/Proxys/ToolConfigProxy.cs
  4. 25 0
      Framework/Scripts/UI/PCController/ExamManagerForPC.cs
  5. 2 2
      Framework/Scripts/UI/PCController/OperateSetting.cs
  6. 2 2
      Framework/SimulationToolDev/CVR_Interactable/Example/Scripts/OperationData-Example/OPTrigger_OpQuestionElement.cs
  7. 2 1
      Framework/SimulationToolDev/CVR_Interactable/Example/Scripts/OperationData-Example/OPTrigger_SelectToolElemet.cs
  8. 5 0
      Framework/SimulationToolDev/CVR_Interactable/Example/Scripts/OperationData-Example/OpTrigger_PlaySoundElement.cs
  9. 2 1
      Framework/SimulationToolDev/OperationDriver/OperationData-Example/TriggerMode/OpTrigger_GoNext.cs
  10. 8 4
      Framework/SimulationToolDev/OperationDriver/OperationData-Example/TriggerMode/OpTrigger_Toolbackpack/OpTrigger_ToolPack.cs
  11. 54 1
      Framework/SimulationToolDev/Process/Scripts/Manager/FreeProcessManagement.cs
  12. 103 0
      Framework/SimulationToolDev/Process/Scripts/Manager/FreeProcessMark.cs
  13. 11 0
      Framework/SimulationToolDev/Process/Scripts/Manager/FreeProcessMark.cs.meta
  14. 9 1
      Framework/SimulationToolDev/Process/Scripts/Manager/ProcessElement.cs
  15. 21 5
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/ArrowTipsPanel.cs
  16. 3 3
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/ImageAndTextNamePanel.cs
  17. 19 0
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/LogSystemForm.cs
  18. 1 1
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel.cs
  19. 70 0
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel/OperateStep.cs
  20. 77 6
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel/OperateStep/FistStepItem.cs
  21. 12 1
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel/OperateStep/SecondStepItem.cs
  22. 39 38
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/QuestionPanel.cs
  23. 38 5
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/ToolLibraryForm.cs
  24. 2 2
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/ToolLibraryForm/ToolLibrarySelectElement.cs
  25. 3 2
      OperationUIFrame/OperationUIFrameV2/Scripts/UI/ToolLibraryForm/ToolLibrarySelectElement/ToolItemPrefab.cs

+ 9 - 3
Framework/BuilderDriver/OperationListener.cs

@@ -151,6 +151,8 @@ public class OpDataInfo
 
         if (finished)
         {
+            //操作时停止语音播放
+            SoundManager.Instance.StopBg();
             OpenQuestion();
         }
 
@@ -216,11 +218,15 @@ public class OpDataInfo
 
         if (UIKit.GetPanel<QuestionPanel>()) UIKit.ClosePanel<QuestionPanel>();
     }
-    public void AnswerCallBack(bool result)
+    public void AnswerCallBack(int stepID,bool result)
     {
-        if (!result && OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam)
+        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam
+            || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
         {
-            ExamManagerForPC.instance.RecordFault(ProcessManagement.Instance.currentStepID, ErrorReason.AnswerWrong);
+            if (!result)
+            {
+                ExamManagerForPC.instance.RecordFault(stepID, ErrorReason.AnswerWrong);
+            }
         }
         isQuestionFinished = true;
 

+ 18 - 4
Framework/Scripts/Init/GameLaunch.cs

@@ -16,6 +16,8 @@ public class GameLaunch : MonoBehaviour
     [SerializeField]
     private bool m_isOpenAsyncLoad;
 
+    public bool isFreeMode = false;
+
     private void Start()
     {
         InitStartupData();
@@ -100,13 +102,25 @@ public class GameLaunch : MonoBehaviour
                 break;
             case "练习":
 
-                GlobalData.m_CurrentOperationMode = OperationMode.Practice;
+                if(isFreeMode)
+                {
+                    GlobalData.m_CurrentOperationMode = OperationMode.FreeParctice;
+                }
+                else
+                {
+                    GlobalData.m_CurrentOperationMode = OperationMode.Practice;
+                }
 
                 break;
             case "考核":
-
-                GlobalData.m_CurrentOperationMode = OperationMode.Exam;
-
+                if (isFreeMode)
+                {
+                    GlobalData.m_CurrentOperationMode = OperationMode.FreeExam;
+                }
+                else
+                {
+                    GlobalData.m_CurrentOperationMode = OperationMode.Exam;
+                }
                 break;
         }
     }

+ 106 - 14
Framework/Scripts/Proxys/ToolConfigProxy.cs

@@ -1,14 +1,17 @@
 using QFramework;
+using Sirenix.Utilities;
 using System.Collections;
 using System.Collections.Generic;
 using System.IO;
+using System.Linq;
+using System.Text;
 using UnityEngine;
 
 public class ToolConfigProxy : DataProxy
 {
     List<ToolConfigInfo> m_ToolConfigInfos;
 
-    Dictionary<string,Sprite> m_DicToolSprites;
+    Dictionary<string, Sprite> m_DicToolSprites;
 
     /// <summary>
     /// 目前工具间里的已经选择的所有工具信息
@@ -25,6 +28,12 @@ public class ToolConfigProxy : DataProxy
     /// </summary>
     private List<ToolConfigInfo> m_CurrentToolKitSelectToolConfigInfos;
 
+    /// <summary>
+    /// 从场景拆解出来的物体
+    /// </summary>
+    private List<ToolConfigInfo> m_DisassembleObjs;
+
+    private List<ToolConfig> m_CurrentSelectDisassembleObjs;
     /// <summary>
     /// 默认工具信息表加载路径
     /// </summary>
@@ -50,6 +59,24 @@ public class ToolConfigProxy : DataProxy
         m_CurrentToolRoomConfigInfos = new List<ToolConfigInfo>();
 
         m_CurrentToolKitSelectToolConfigInfos = new List<ToolConfigInfo>();
+
+        m_DisassembleObjs = new List<ToolConfigInfo>();
+
+        m_CurrentSelectDisassembleObjs = new List<ToolConfig>();
+    }
+
+    public void RefrushCurrentSelectDisassembleObjs(List<ToolConfig> list)
+    {
+        m_CurrentSelectDisassembleObjs = list;
+    }
+
+    /// <summary>
+    /// 获取当前拆解选中物体
+    /// </summary>
+    /// <returns></returns>
+    public List<ToolConfig> GetCurrentSelectDisassembleObjs()
+    {
+        return m_CurrentSelectDisassembleObjs;
     }
 
     public override void OnRemove()
@@ -75,6 +102,39 @@ public class ToolConfigProxy : DataProxy
     /// <returns></returns>
     public List<ToolConfigInfo> GetAllToolConfigInfoFromCTRSTCIs()
     {
+        switch (OperateSetting.Instance.m_CurrentOperationMode)
+        {
+            case OperationMode.Learn:
+            case OperationMode.Practice:
+            case OperationMode.Exam:
+            case OperationMode.Challenge:
+            case OperationMode.None:
+                return m_CurrentToolRoomConfigInfos;
+            case OperationMode.FreeParctice:
+            case OperationMode.FreeExam:
+                if (m_CurrentToolLibraryType == ToolLibraryType.ToolKit)
+                {
+                    List<ToolConfigInfo> tmpToolConfigs = new List<ToolConfigInfo>();
+                    tmpToolConfigs.AddRange(m_CurrentToolRoomConfigInfos);
+                    tmpToolConfigs.AddRange(m_DisassembleObjs);
+                    StringBuilder sb = new StringBuilder();
+                    foreach (var item in tmpToolConfigs)
+                    {
+                        sb.Append(item.toolName);
+                    }
+                    sb.AppendLine("--");
+                    foreach (var item in m_DisassembleObjs)
+                    {
+                        sb.Append(item.toolName);
+                    }
+                    Debug.Log(sb.ToString());
+                    return tmpToolConfigs;
+                }
+                else
+                {
+                    return m_CurrentToolRoomConfigInfos;
+                }
+        }
         return m_CurrentToolRoomConfigInfos;
     }
 
@@ -94,7 +154,7 @@ public class ToolConfigProxy : DataProxy
             return true;
         }
 
-        return  false;
+        return false;
     }
 
     /// <summary>
@@ -115,6 +175,31 @@ public class ToolConfigProxy : DataProxy
         m_TmpToolRoomConfigInfos.Clear();
     }
 
+    /// <summary>
+    /// 向m_CurrentToolRoomConfigInfos中添加数据信息
+    /// </summary>
+    /// <param name="toolConfigInfo"></param>
+    public void AddToolConfigInfoToAssembleObjs(ToolConfigInfo toolConfigInfo)
+    {
+        if (m_DisassembleObjs.Where(s => s.toolName == toolConfigInfo.toolName).Count() == 0)
+        {
+            m_DisassembleObjs.Add(toolConfigInfo);
+        }
+    }
+    /// <summary>
+    /// 向m_CurrentToolRoomConfigInfos中添加数据信息
+    /// </summary>
+    /// <param name="toolConfigInfo"></param>
+    public void RemoveToolConfigInfoToAssembleObjs(ToolConfig toolConfig)
+    {
+        if (m_DisassembleObjs.Where(s => s.toolName == toolConfig.toolName).Count() >= 0)
+        {
+            foreach (var item in m_DisassembleObjs.Where(s => s.toolName == toolConfig.toolName).ToArray())
+            {
+                m_DisassembleObjs.Remove(item);
+            }
+        }
+    }
     /// <summary>
     /// 从m_CurrentToolKitSelectToolConfigInfos中查找对应数据信息
     /// </summary>
@@ -221,12 +306,12 @@ public class ToolConfigProxy : DataProxy
     /// </summary>
     /// <param name="toolType"></param>
     /// <returns></returns>
-    public List<ToolConfigInfo> GetToolConfigInfosByToolType(List<ToolConfigInfo> toolConfigInfos,string toolType)
+    public List<ToolConfigInfo> GetToolConfigInfosByToolType(List<ToolConfigInfo> toolConfigInfos, string toolType)
     {
-        List<ToolConfigInfo> tmpList = new List<ToolConfigInfo>();  
+        List<ToolConfigInfo> tmpList = new List<ToolConfigInfo>();
 
         if (toolConfigInfos != null) tmpList = toolConfigInfos.FindAll(tool => tool.toolType == toolType);
-        
+
         return tmpList;
     }
 
@@ -236,7 +321,7 @@ public class ToolConfigProxy : DataProxy
     /// <param name="toolType"></param>
     /// <param name="toolName"></param>
     /// <returns></returns>
-    public List<ToolConfigInfo> GetToolConfigInfosByToolTypeAndName(string toolType,string toolName)
+    public List<ToolConfigInfo> GetToolConfigInfosByToolTypeAndName(string toolType, string toolName)
     {
         List<ToolConfigInfo> toolConfigInfos = new List<ToolConfigInfo>();
 
@@ -246,7 +331,7 @@ public class ToolConfigProxy : DataProxy
         }
         else if (string.IsNullOrEmpty(toolType) && !string.IsNullOrEmpty(toolName))
         {
-            toolConfigInfos = GetToolConfigInfosByToolNameSearch(m_ToolConfigInfos,toolName);
+            toolConfigInfos = GetToolConfigInfosByToolNameSearch(m_ToolConfigInfos, toolName);
         }
         else if (!string.IsNullOrEmpty(toolName) && !string.IsNullOrEmpty(toolType))
         {
@@ -256,7 +341,7 @@ public class ToolConfigProxy : DataProxy
         {
             toolConfigInfos = GetAllToolConfigInfos();
         }
-        
+
         return toolConfigInfos;
     }
 
@@ -272,19 +357,26 @@ public class ToolConfigProxy : DataProxy
 
         if (string.IsNullOrEmpty(toolName) && !string.IsNullOrEmpty(toolType))
         {
-            toolConfigInfos = GetToolConfigInfosByToolType(m_CurrentToolRoomConfigInfos, toolType);
+            toolConfigInfos.AddRange(GetToolConfigInfosByToolType(m_CurrentToolRoomConfigInfos, toolType));
+
+            toolConfigInfos.AddRange(GetToolConfigInfosByToolType(m_DisassembleObjs, toolType));
         }
         else if (string.IsNullOrEmpty(toolType) && !string.IsNullOrEmpty(toolName))
         {
-            toolConfigInfos = GetToolConfigInfosByToolNameSearch(m_CurrentToolRoomConfigInfos, toolName);
+            toolConfigInfos.AddRange(GetToolConfigInfosByToolNameSearch(m_CurrentToolRoomConfigInfos, toolName));
+
+            toolConfigInfos.AddRange(GetToolConfigInfosByToolNameSearch(m_DisassembleObjs, toolName));
         }
         else if (!string.IsNullOrEmpty(toolName) && !string.IsNullOrEmpty(toolType))
         {
-            toolConfigInfos = m_CurrentToolRoomConfigInfos.FindAll(tool => tool.toolType == toolType && tool.toolName.Contains(toolName));
+            toolConfigInfos.AddRange(m_CurrentToolRoomConfigInfos.FindAll(tool => tool.toolType == toolType && tool.toolName.Contains(toolName)));
+
+            toolConfigInfos.AddRange(m_DisassembleObjs.FindAll(tool => tool.toolType == toolType && tool.toolName.Contains(toolName)));
         }
         else
         {
-            toolConfigInfos = m_CurrentToolRoomConfigInfos;
+            toolConfigInfos.AddRange(m_CurrentToolRoomConfigInfos);
+            toolConfigInfos.AddRange(m_DisassembleObjs);
         }
 
         return toolConfigInfos;
@@ -346,7 +438,7 @@ public class ToolConfigProxy : DataProxy
     {
         Sprite sprite = null;
 
-        if (m_DicToolSprites.TryGetValue(toolName,out sprite))
+        if (m_DicToolSprites.TryGetValue(toolName, out sprite))
         {
             return sprite;
         }
@@ -356,7 +448,7 @@ public class ToolConfigProxy : DataProxy
 
             sprite = LoadHelper.LoadSpriteFromStreamming(tmpPath);
 
-            if (sprite != null) 
+            if (sprite != null)
             {
                 m_DicToolSprites.Add(toolName, sprite);
             }

+ 25 - 0
Framework/Scripts/UI/PCController/ExamManagerForPC.cs

@@ -225,6 +225,20 @@ public class ExamManagerForPC : MonoBehaviour
         SetelementScore();
     }
 
+    public void FreeProcessElementFinished(ProcessElement element)
+    {
+        ExamProcessElement tmpElement = m_examProcessElements.Find(t => t.elementDescript == element.processBase.GetPBDescribe());
+
+        if (tmpElement.finish == false)
+        {
+            tmpElement.finish = true;
+            tmpElement.result = tmpElement.faultCount > 0 ? false : true;
+            tmpElement.operationTime = DateTime.Now;
+        }
+
+        SetelementScore();
+    }
+
     /// <summary>
     /// 自动配分
     /// </summary>
@@ -325,6 +339,17 @@ public class ExamManagerForPC : MonoBehaviour
                     wrongErrson = "OperationError";
                 }
                 break;
+            case ErrorReason.AnswerWrong:
+
+                if (LocalizationManager.CurrentLanguage == "Chinese")
+                {
+                    wrongErrson = "回答错误";
+                }
+                else
+                {
+                    wrongErrson = "AnswerError";
+                }
+                break;
         }
 
         UIKit.GetPanel<PC_OperatePanel>().ExamInfo.ShowWrongInfo("<color=#FF9F00>" + stepName + "</color>  :  " + wrongErrson);

+ 2 - 2
Framework/Scripts/UI/PCController/OperateSetting.cs

@@ -239,7 +239,7 @@ public class OperateSetting : MonoSingleton<OperateSetting>
     public void StartProcess()
     {
         //加载考试时长及错误
-        if (m_CurrentOperationMode == OperationMode.Exam)
+        if (m_CurrentOperationMode == OperationMode.Exam|| m_CurrentOperationMode == OperationMode.FreeExam)
         {
             ExamManagerForPC tmpExamManagerForPC = this.gameObject.AddComponent<ExamManagerForPC>();
             tmpExamManagerForPC.examTime = this.examTime;
@@ -269,7 +269,7 @@ public class OperateSetting : MonoSingleton<OperateSetting>
 
     public void InitOperationMode()
     {
-        if (m_CurrentOperationMode != OperationMode.FreeParctice)
+        if (m_CurrentOperationMode != OperationMode.FreeParctice&&m_CurrentOperationMode!=OperationMode.FreeExam)
         {
             foreach (var item in ProcessManagement.Instance.processes)
             {

+ 2 - 2
Framework/SimulationToolDev/CVR_Interactable/Example/Scripts/OperationData-Example/OPTrigger_OpQuestionElement.cs

@@ -50,11 +50,11 @@ public class OPTrigger_OpQuestionElement : OperationData_TriggerMode
         }
     }
 
-    public void AnswerCallBack(bool result)
+    public void AnswerCallBack(int stepID, bool result)
     {
         if (!result && OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam)
         {
-            ExamManagerForPC.instance.RecordFault(ProcessManagement.Instance.currentStepID,ErrorReason.AnswerWrong);
+            ExamManagerForPC.instance.RecordFault(stepID, ErrorReason.AnswerWrong);
         }
         isAnswer = true;
     }

+ 2 - 1
Framework/SimulationToolDev/CVR_Interactable/Example/Scripts/OperationData-Example/OPTrigger_SelectToolElemet.cs

@@ -85,7 +85,8 @@ public class OPTrigger_SelectToolElemet : OperationData_TriggerMode
             return true;
         }
 
-        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice
+            || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
         {
             return true;
         }

+ 5 - 0
Framework/SimulationToolDev/CVR_Interactable/Example/Scripts/OperationData-Example/OpTrigger_PlaySoundElement.cs

@@ -21,6 +21,11 @@ public class OpTrigger_PlaySoundElement : OperationData_TriggerMode
 
     public override bool TriggerCondition()
     {
+        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice
+      || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
+        {
+            return false;
+        }
         return isTrigger;
     }
 

+ 2 - 1
Framework/SimulationToolDev/OperationDriver/OperationData-Example/TriggerMode/OpTrigger_GoNext.cs

@@ -15,7 +15,8 @@ public class OpTrigger_GoNext : OperationData_TriggerMode
 
     public override bool TriggerCondition()
     {
-        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice
+            || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
         {
             return false;
         }

+ 8 - 4
Framework/SimulationToolDev/OperationDriver/OperationData-Example/TriggerMode/OpTrigger_Toolbackpack/OpTrigger_ToolPack.cs

@@ -251,7 +251,8 @@ public class OpTrigger_ToolPack : OperationData_TriggerMode
 
                 SetHighlighterState(false);
 
-                if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+                if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice 
+                    || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
                 {
                     toolPackInteractive_IndependentAni = this.GetComponent<ToolPackInteractive_IndependentAni>();
                     if (toolPackInteractive_IndependentAni != null)
@@ -262,7 +263,8 @@ public class OpTrigger_ToolPack : OperationData_TriggerMode
                 break;
             case OperationDataStatus.Listening:
 
-                if (OperateSetting.Instance.m_CurrentOperationMode != OperationMode.FreeParctice)
+                if (OperateSetting.Instance.m_CurrentOperationMode != OperationMode.FreeParctice
+                    || OperateSetting.Instance.m_CurrentOperationMode != OperationMode.FreeExam)
                 {
                     //设置当前检测物体为活跃监听状态
                     foreach (var item in targetObjs)
@@ -275,7 +277,8 @@ public class OpTrigger_ToolPack : OperationData_TriggerMode
                 timer = 0;
                 OperateSetting.Instance.m_CurrentStepRightToolNames = choseToolNames;
 
-                if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+                if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice
+                    || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
                 {
                     toolPackInteractive_IndependentAni = this.GetComponent<ToolPackInteractive_IndependentAni>();
                     if (toolPackInteractive_IndependentAni != null)
@@ -322,7 +325,8 @@ public class OpTrigger_ToolPack : OperationData_TriggerMode
         }
 
         SetHighlighterState(false);
-        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+        if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice 
+            || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
         {
             #region FreePartice
             if (toolPackInteractive_IndependentAni != null)

+ 54 - 1
Framework/SimulationToolDev/Process/Scripts/Manager/FreeProcessManagement.cs

@@ -6,6 +6,7 @@ using System.Collections;
 using System.Collections.Generic;
 using System.Diagnostics;
 using System.Linq;
+using System.Runtime.Remoting.Metadata.W3cXsd2001;
 using UnityEngine;
 
 /// <summary>
@@ -98,6 +99,29 @@ public class FreeProcessManagement : MonoSingleton<FreeProcessManagement>
             }
         }
     }
+    public void LoadAudio(ProcessElement element)
+    {
+        StepListProxy m_StepListProxy = DAL.Instance.Get<StepListProxy>();
+        if (String.IsNullOrEmpty(m_StepListProxy.GetOperationStepDataInfoById(element.stepID).audioClipName))
+        {
+            return;
+        }
+        StartCoroutine(AudioHelper.LoadAudioClip(OperateSetting.Instance.m_CourseName, m_StepListProxy.GetOperationStepDataInfoById(element.stepID).audioClipName, AudioType.MPEG, LoadAudioCallBack));
+    }
+
+    /// <summary>
+    /// 加载音频回调
+    /// </summary>
+    /// <param name="clip"></param>
+    private void LoadAudioCallBack(AudioClip clip)
+    {
+        SoundManager.Instance.PlayBg(clip);
+    }
+
+    public void StopAudio()
+    {
+        SoundManager.Instance.StopBg();
+    }
 }
 
 public class FreeProcessElement
@@ -156,8 +180,37 @@ public class FreeProcessElement
         if (freeProcessElement == element)
         {
             FreeProcessManagement.Instance.RemoveProcessElementActiveState(freeProcessElement);
-
             ToolLibraryForm.RefrushAllChoseTool();
+            UIKit.GetPanel<PC_OperatePanel>().OperateStep.ShowFreeSecondStepItemByStepId(freeProcessElement.stepID);
+            UIKit.GetPanel<LogSystemForm>().AddOpStepLog("操作步骤", freeProcessElement.stepID);
+
+            if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+            {
+                FreeProcessManagement.Instance.LoadAudio(element);
+            }
+
+            if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
+            {
+                ExamManagerForPC.instance.FreeProcessElementFinished(freeProcessElement);
+            }
+
+
+            CheckFreeProcessMark(element);
+        }
+    }
+
+    private static void CheckFreeProcessMark(ProcessElement element)
+    {
+        PB_OpData pbOpData = element.GetComponent<PB_OpData>();
+        OperationDataBase operationDataBase = OperationManager.Instance.GetOpData(pbOpData.opData.operationDataName);
+
+        if (operationDataBase != null)
+        {
+            FreeProcessMark freeProcessMark = operationDataBase.GetComponent<FreeProcessMark>();
+            if (freeProcessMark != null)
+            {
+                freeProcessMark.Exit();
+            }
         }
     }
 }

+ 103 - 0
Framework/SimulationToolDev/Process/Scripts/Manager/FreeProcessMark.cs

@@ -0,0 +1,103 @@
+using System.Collections;
+using System.Collections.Generic;
+using System.Linq;
+using UnityEngine;
+
+public enum FreeProcessType
+{
+    常规触发,
+    检查,
+    拆解,
+    安装
+}
+public class FreeProcessMark : MonoBehaviour
+{
+    public static int AssembleID = 1000;
+    public FreeProcessType freeProcessType = FreeProcessType.常规触发;
+    public string markName;
+
+    public List<AssembleObjInfo> assembleObjInfos = new List<AssembleObjInfo>();
+
+    public void Enter()
+    {
+
+    }
+
+    public bool CheckAssemble()
+    {
+        List<ToolConfig> seletTools = DAL.Instance.Get<ToolConfigProxy>().GetCurrentSelectDisassembleObjs();
+
+        Debug.Log(seletTools.Count);
+        foreach (var assembleItem in assembleObjInfos)
+        {
+            if (assembleItem.isAssembleMust)
+            {
+                if(seletTools.Where(s=>s.toolName==assembleItem.name).Count() == 0)
+                {
+                    return false;
+                }
+            }
+        }
+        return true;
+    }
+
+    public void Exit()
+    {
+        switch (freeProcessType)
+        {
+            case FreeProcessType.常规触发:
+                break;
+            case FreeProcessType.检查:
+                break;
+            case FreeProcessType.拆解:
+                DisAssembleToToolLibrary();
+                break;
+            case FreeProcessType.安装:
+                AssemebleToToolLibrary();
+                break;
+            default:
+                break;
+        }
+    }
+
+    public void AssemebleToToolLibrary()
+    {
+        List<ToolConfig> seletTools = DAL.Instance.Get<ToolConfigProxy>().GetCurrentSelectDisassembleObjs();
+
+        foreach (var assembleItem in assembleObjInfos)
+        {
+            foreach (var item in seletTools)
+            {
+                if (item.toolName == assembleItem.name)
+                {
+                    DAL.Instance.Get<ToolConfigProxy>().RemoveToolConfigInfoToAssembleObjs(item);
+                }
+            }
+        }
+    }
+
+    public void DisAssembleToToolLibrary()
+    {
+        foreach (var item in assembleObjInfos)
+        {
+            ToolConfigInfo toolConfigInfo = new ToolConfigInfo();
+            toolConfigInfo.id = FreeProcessMark.AssembleID.ToString();
+            FreeProcessMark.AssembleID++;
+            toolConfigInfo.toolName = item.name;
+            toolConfigInfo.toolDescription = item.description;
+            toolConfigInfo.toolType = item.toolType;
+
+            DAL.Instance.Get<ToolConfigProxy>().AddToolConfigInfoToAssembleObjs(toolConfigInfo);
+        }
+    }
+}
+
+[System.Serializable]
+public class AssembleObjInfo
+{
+    public string name;
+    public string description;
+    public string toolType = "电力设备";
+    //安装必须
+    public bool isAssembleMust = true;
+}

+ 11 - 0
Framework/SimulationToolDev/Process/Scripts/Manager/FreeProcessMark.cs.meta

@@ -0,0 +1,11 @@
+fileFormatVersion: 2
+guid: 98febcfcdd1b2954989010e8b02e54ff
+MonoImporter:
+  externalObjects: {}
+  serializedVersion: 2
+  defaultReferences: []
+  executionOrder: 0
+  icon: {instanceID: 0}
+  userData: 
+  assetBundleName: 
+  assetBundleVariant: 

+ 9 - 1
Framework/SimulationToolDev/Process/Scripts/Manager/ProcessElement.cs

@@ -52,7 +52,7 @@
         public ProcessBase processBase;
 
         public System.Action<ProcessElement> processElementEnterHandler;
-
+        public System.Action<ProcessElement> processElementTriggerHandler;
         public System.Action<ProcessElement> processElementExitHandle;
 
         /// <summary>
@@ -103,6 +103,14 @@
             processElementEnterHandler?.Invoke(this);
         }
 
+        /// <summary>
+        /// 触发完成
+        /// </summary>
+        public void TriggerFinished()
+        {
+            processElementTriggerHandler?.Invoke(this);
+        }
+
         /// <summary>
         /// 离开当前步骤
         /// </summary>

+ 21 - 5
OperationUIFrame/OperationUIFrameV2/Scripts/UI/ArrowTipsPanel.cs

@@ -71,7 +71,7 @@ namespace QFramework
             }
 
             if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice
-           || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeParctice)
+           || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
             {
                 CheckFreeOperationHint();
             }
@@ -154,12 +154,28 @@ namespace QFramework
                 if (item.Key.OperationStatus == OperationDataStatus.Listening && item.Key.IsGetRightTool())
                 {
                     item.Key.SetTargetObjsActive(true);
-                    if (!OperateSetting.Instance.isOpenCheck && item.Key.operationName.Contains("¼ì²é"))
+                    FreeProcessMark freeProcessMark = item.Key.GetComponent<FreeProcessMark>();
+
+                    if (freeProcessMark != null)
                     {
-                        item.Key.SetTargetObjsActive(false);
-                        item.Value.gameObject.SetActive(false);
-                        continue;
+                        if (!OperateSetting.Instance.isOpenCheck && freeProcessMark.freeProcessType == FreeProcessType.¼ì²é)
+                        {
+                            item.Key.SetTargetObjsActive(false);
+                            item.Value.gameObject.SetActive(false);
+                            continue;
+                        }
+
+                        if (freeProcessMark.freeProcessType == FreeProcessType.°²×°)
+                        {
+                            if(!freeProcessMark.CheckAssemble())
+                            {
+                                item.Key.SetTargetObjsActive(false);
+                                item.Value.gameObject.SetActive(false);
+                                continue;
+                            }
+                        }
                     }
+
                     item.Value.gameObject.SetActive(true);
                     Vector3 viewPos = ViewCamera.WorldToScreenPoint(item.Key.targetObjs[0].transform.position);
                     item.Value.GetRectTransform().anchoredPosition = new Vector3(GetFixed(viewPos.x), GetFixed(viewPos.y));

+ 3 - 3
OperationUIFrame/OperationUIFrameV2/Scripts/UI/ImageAndTextNamePanel.cs

@@ -11,7 +11,7 @@ namespace QFramework
 		//ÊÔÌâÐÅÏ¢
 		public QuestionInfo questionInfo;
 
-		public Action<bool> answerCallBack;
+		public Action<int,bool> answerCallBack;
 	}
 	public partial class ImageAndTextNamePanel : UIPanel
 	{
@@ -97,7 +97,7 @@ namespace QFramework
 			{
 				if (result)
 				{
-					mData.answerCallBack?.Invoke(result);
+					mData.answerCallBack?.Invoke(int.Parse(mData.questionInfo.StepId), result);
 
 					CloseSelf();
 				}
@@ -109,7 +109,7 @@ namespace QFramework
 			}
 			else if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam)
 			{
-				mData.answerCallBack?.Invoke(result);
+				mData.answerCallBack?.Invoke(int.Parse(mData.questionInfo.StepId), result);
 
 				CloseSelf();
 			}

+ 19 - 0
OperationUIFrame/OperationUIFrameV2/Scripts/UI/LogSystemForm.cs

@@ -18,6 +18,8 @@ namespace QFramework
             ScrollView.gameObject.SetActive(false);
 
             ProcessManagement.Instance.processElementDisActiveEvent += OnPrcessElementDisActive;
+
+
         }
 		
 		protected override void OnOpen(IUIData uiData = null)
@@ -65,6 +67,23 @@ namespace QFramework
 			}
         }
 
+		public void AddOpStepLog(string logType,int operationID)
+		{
+            StepListProxy tmpStepListProxy = DAL.Instance.Get<StepListProxy>();
+
+            OperationStepDataInfo tmpOperationStepDataInfo = tmpStepListProxy.GetOperationStepDataInfoById(operationID);
+
+            AddLogItem(tmpOperationStepDataInfo, logType);
+
+            if (ScrollView.gameObject.activeSelf)
+            {
+                SetTipPointState(false);
+            }
+            else
+            {
+                SetTipPointState(true);
+            }
+        }
 		/// <summary>
 		/// Ìí¼ÓÈÕÖ¾
 		/// </summary>

+ 1 - 1
OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel.cs

@@ -153,7 +153,7 @@ namespace QFramework
                     break;
                 case OperationMode.FreeParctice:
                     operateName = "操作步骤";
-                    OperateStep.HelpBtn.gameObject.SetActive(true);
+                    OperateStep.HelpBtn.gameObject.SetActive(false);
                     OperateStep.AutoPlayBtn.gameObject.SetActive(false);
                     OperateStep.ToolLibraryBtn.gameObject.SetActive(true);
                     OperateStep.EndExam.gameObject.SetActive(false);

+ 70 - 0
OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel/OperateStep.cs

@@ -12,6 +12,7 @@ using DG.Tweening;
 using System.Collections;
 using UnityEngine.Tilemaps;
 using I2.Loc;
+using System.Linq;
 
 namespace QFramework
 {
@@ -309,6 +310,56 @@ namespace QFramework
             }
         }
 
+        /// <summary>
+        /// 自由练习模式
+        /// </summary>
+        /// <param name="stepID"></param>
+        public void ShowFreeSecondStepItemByStepId(int stepID)
+        {
+            FistStepItem tempItem = null;
+            int firstIndex = 1;
+
+            foreach (var item in firstStepItems)
+            {
+                //item.gameObject.SetActive(true);
+                bool tmpResul = item.FinishedSecondStepItem(stepID);
+
+                if (tmpResul)
+                {
+                    tempItem = item;
+                }
+                if (item.gameObject.activeSelf)
+                {
+                    firstIndex++;
+                }
+                //else item.Select.gameObject.SetActive(false);
+            }
+            if (tempItem != null)
+            {
+                if (!tempItem.gameObject.activeSelf)
+                {
+                    tempItem.RefrushNumIndex(firstIndex);
+                }
+                tempItem.Select.gameObject.SetActive(true);
+                tempItem.gameObject.SetActive(true);
+                tempItem.SetState(true);
+
+                RefreshFreeList();
+            }
+
+            Canvas.ForceUpdateCanvases();
+            ScrollView.verticalNormalizedPosition = 0;
+
+            if (Content.transform.GetComponent<RectTransform>().sizeDelta.y >= 929f)
+            {
+                BottomImage.gameObject.SetActive(false);
+            }
+            else
+            {
+                BottomImage.gameObject.SetActive(true);
+            }
+        }
+
         /// <summary>
         /// 学习模式
         /// </summary>
@@ -345,6 +396,25 @@ namespace QFramework
             ScrollView.verticalNormalizedPosition = 0;
         }
 
+        public void RefreshFreeList()
+        {
+            foreach (var item in firstStepItems.OrderBy(s => int.Parse(s.Num.text)))
+            {
+                if (item.gameObject.activeSelf)
+                {
+                    item.transform.SetSiblingIndex(int.Parse(item.Num.text)-1);
+                }
+            }
+
+            foreach (var item in firstStepItems.OrderBy(s => int.Parse(s.Num.text)))
+            {
+                if (item.gameObject.activeSelf)
+                {
+                    item.RefrushFreeSecondSiblingIndex();
+                }
+            }
+        }
+
         bool expande = false;
 
         /// <summary>

+ 77 - 6
OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel/OperateStep/FistStepItem.cs

@@ -11,6 +11,7 @@ using Google.Protobuf.WellKnownTypes;
 using Sirenix.OdinInspector;
 using I2.Loc;
 using ChivaXR;
+using System.Linq;
 
 namespace QFramework
 {
@@ -68,6 +69,51 @@ namespace QFramework
             return tmpResult;
         }
 
+        /// <summary>
+        /// 自由练习模式完成第二步
+        /// </summary>
+        /// <param name="id"></param>
+        /// <returns></returns>
+        public bool FinishedSecondStepItem(int id)
+        {
+            bool tmpResult = false;
+            int tmpId = 0;
+            SecondStepItem tmpSecondStepItem = null;
+            foreach (var item in m_SecondStepItems)
+            {
+                if (item.m_Finished)
+                {
+                    tmpId++;
+                }
+                if (int.Parse(item.m_StepMsgInfo.id) == id)
+                {
+                    tmpSecondStepItem = item;
+                }
+                else
+                {
+                }
+            }
+
+            if (tmpSecondStepItem != null)
+            {
+                tmpSecondStepItem.gameObject.SetActive(true);     
+                tmpSecondStepItem.RefrushedData(tmpId);
+                tmpResult = true;
+            }
+            return tmpResult;
+        }
+
+        public void RefrushFreeSecondSiblingIndex()
+        {
+            foreach (var item in m_SecondStepItems.OrderBy(s => s.m_Index))
+            {
+                if (item.m_Finished)
+                {
+                    item.transform.SetSiblingIndex(this.transform.GetSiblingIndex() + item.m_Index);
+                }
+            }
+        }
+
         public void SetSecondStepItemSelectState(int id)
         {
             bool result = false;
@@ -106,13 +152,29 @@ namespace QFramework
             UnExpand.gameObject.SetActive(!state);
             Expand.gameObject.SetActive(state);
 
-            if (OperateSetting.Instance.m_CurrentOperationMode != OperationMode.Learn && m_Expand == true)
-            {                //练考模式只展开到当前步骤
-                ShowCurrentSecondStepItem(ProcessManagement.Instance.currentStepID);
-            }
-            else
+            switch (OperateSetting.Instance.m_CurrentOperationMode)
             {
-                ShowAllSecondStepItems(m_Expand);
+                case OperationMode.Learn:
+                    ShowAllSecondStepItems(m_Expand);
+                    break;
+                case OperationMode.Practice:
+                case OperationMode.Exam:
+                    if (m_Expand)
+                    {
+                        //练考模式只展开到当前步骤               
+                        ShowCurrentSecondStepItem(ProcessManagement.Instance.currentStepID);
+                    }
+                    break;
+                case OperationMode.Challenge:
+                    break;
+                case OperationMode.FreeParctice:
+                    break;
+                case OperationMode.FreeExam:
+                    break;
+                case OperationMode.None:
+                    break;
+                default:
+                    break;
             }
         }
 
@@ -138,6 +200,15 @@ namespace QFramework
             Message.text = realText;
         }
 
+        /// <summary>
+        /// 刷新列表序号
+        /// </summary>
+        /// <param name="index"></param>
+        public void RefrushNumIndex(int index)
+        {
+            Num.text = index.ToString();
+        }
+
         public void ShowAllSecondStepItems(bool state)
         {
             foreach (var item in m_SecondStepItems)

+ 12 - 1
OperationUIFrame/OperationUIFrameV2/Scripts/UI/PC_OperatePanel/OperateStep/SecondStepItem.cs

@@ -31,7 +31,9 @@ namespace QFramework
 
         private int m_ParentIndex;
 
-        private int m_Index;
+        public int m_Index;
+
+        public bool m_Finished = false;
 
         private void Start()
         {
@@ -59,6 +61,15 @@ namespace QFramework
             }
         }
 
+        public void RefrushedData(int index)
+        {
+            m_Index = index;
+            m_Finished = true;
+
+            LocalizedString message = m_StepMsgInfo.id + "stepName";
+            Message.text = m_Index.ToString("00") + "." + message;
+        }
+
         private void OnClickBtnClick()
         {
             ProcessManagement.Instance.JumpProcessState(int.Parse(m_StepMsgInfo.id));

+ 39 - 38
OperationUIFrame/OperationUIFrameV2/Scripts/UI/QuestionPanel.cs

@@ -6,16 +6,16 @@ using System;
 
 namespace QFramework
 {
-	public class QuestionPanelData : UIPanelData
-	{
-		//试题信息
-		public QuestionInfo questionInfo;
+    public class QuestionPanelData : UIPanelData
+    {
+        //试题信息
+        public QuestionInfo questionInfo;
 
-        public Action<bool> answerCallBack;
+        public Action<int,bool> answerCallBack;
 
-	}
-	public partial class QuestionPanel : UIPanel
-	{
+    }
+    public partial class QuestionPanel : UIPanel
+    {
         /// <summary>
         /// 目前正确的Toggle
         /// </summary>
@@ -31,36 +31,36 @@ namespace QFramework
         /// </summary>
         public string m_CurrentQuestionType;
 
-		protected override void OnInit(IUIData uiData = null)
-		{
-			mData = uiData as QuestionPanelData ?? new QuestionPanelData();	
-		}
-		
-		protected override void OnOpen(IUIData uiData = null)
-		{
-			mData = uiData as QuestionPanelData ?? new QuestionPanelData();
+        protected override void OnInit(IUIData uiData = null)
+        {
+            mData = uiData as QuestionPanelData ?? new QuestionPanelData();
+        }
+
+        protected override void OnOpen(IUIData uiData = null)
+        {
+            mData = uiData as QuestionPanelData ?? new QuestionPanelData();
 
             ClearAll();
 
             QuestionType.text = mData.questionInfo.QuestionType;
-			Topic.text = mData.questionInfo.Topic;
+            Topic.text = mData.questionInfo.Topic;
 
             ConfirmBtn.onClick.AddListener(OnConfirmBtnClick);
 
             InitilOptions(mData.questionInfo, mData.questionInfo.QuestionType);
         }
-		
-		protected override void OnShow()
-		{
-		}
-		
-		protected override void OnHide()
-		{
-		}
-		
-		protected override void OnClose()
-		{
-		}
+
+        protected override void OnShow()
+        {
+        }
+
+        protected override void OnHide()
+        {
+        }
+
+        protected override void OnClose()
+        {
+        }
 
         /// <summary>
         /// 初始化选项
@@ -97,7 +97,7 @@ namespace QFramework
                 for (int i = 0; i < 2; i++)
                 {
                     var tempItem = Instantiate(option.gameObject, OptionConent.transform);
-                    
+
                     tempItem.SetActive(true);
 
                     var toggle = tempItem.GetComponent<Toggle>();
@@ -117,15 +117,15 @@ namespace QFramework
 
                     m_CurrentAllToggle.Add(toggle);
 
-                    toggle.onValueChanged.AddListener( isOn => 
+                    toggle.onValueChanged.AddListener(isOn =>
                     {
                         ToggleValuedChanged(toggle, isOn);
-                    } );
+                    });
                 }
             }
         }
 
-        private void ToggleValuedChanged(Toggle toggle,bool isOn)
+        private void ToggleValuedChanged(Toggle toggle, bool isOn)
         {
             if (m_CurrentQuestionType == "判断题" || m_CurrentQuestionType == "单选题")
             {
@@ -153,7 +153,7 @@ namespace QFramework
             {
                 if (result)
                 {
-                    mData.answerCallBack?.Invoke(result);
+                    mData.answerCallBack?.Invoke(int.Parse( mData.questionInfo.StepId),result);
 
                     CloseSelf();
                 }
@@ -163,15 +163,16 @@ namespace QFramework
                 }
 
             }
-            else if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam)
+            else if (OperateSetting.Instance.m_CurrentOperationMode == OperationMode.Exam
+                || OperateSetting.Instance.m_CurrentOperationMode == OperationMode.FreeExam)
             {
-                mData.answerCallBack?.Invoke(result);
+                mData.answerCallBack?.Invoke(int.Parse(mData.questionInfo.StepId), result);
 
                 CloseSelf();
             }
         }
 
-        private void ShowHighter() 
+        private void ShowHighter()
         {
             foreach (var item in m_CurrentAllToggle)
             {
@@ -193,7 +194,7 @@ namespace QFramework
         {
             for (int i = 0; i < m_CurrentAllToggle.Count; i++)
             {
-                Destroy(m_CurrentAllToggle[i].gameObject); 
+                Destroy(m_CurrentAllToggle[i].gameObject);
             }
             m_CurrentAllToggle.Clear();
             m_CurrentRightToggle.Clear();

+ 38 - 5
OperationUIFrame/OperationUIFrameV2/Scripts/UI/ToolLibraryForm.cs

@@ -71,9 +71,7 @@ namespace QFramework
             switch (m_ToolConfigProxy.m_CurrentToolLibraryType)
             {
                 case ToolLibraryType.ToolRoom:
-
                     m_ToolConfigProxy.m_TmpToolRoomConfigInfos = m_ToolConfigProxy.GetAllToolConfigInfoFromCTRSTCIs();
-
                     ToolLibrarySelectElement.OpenToolRoomUI();
                     break;
                 case ToolLibraryType.ToolKit:
@@ -187,7 +185,7 @@ namespace QFramework
             }
 
             List<ToolConfig> tmpToolConfigs = new List<ToolConfig>();
-
+            List<ToolConfig> tmpAssembleToolConfigs = new List<ToolConfig>();
             foreach (var item in m_ToolConfigProxy.GetAllToolConfigInfoFromCTKSTCIs())
             {
                 if (m_ToolConfigProxy.GetToolConfigInfoFromCTRSTCIsById(int.Parse(item.id)) != null)
@@ -203,12 +201,47 @@ namespace QFramework
                     tmpToolConfig.en_toolDescription = toolConfigInfo.en_toolDescription;
                     tmpToolConfigs.Add(tmpToolConfig);
                 }
+                else
+                {
+                    ToolConfig tmpToolConfig = new ToolConfig();
+
+                    ToolConfigInfo toolConfigInfo = item;
+
+                    tmpToolConfig.toolName = toolConfigInfo.toolName;
+                    tmpToolConfig.toolImg = m_ToolConfigProxy.GetSpriteByToolName(tmpToolConfig.toolName);
+                    tmpToolConfig.en_toolName = toolConfigInfo.en_toolName;
+                    tmpToolConfig.en_toolType = toolConfigInfo.en_toolType;
+                    tmpToolConfig.en_toolDescription = toolConfigInfo.en_toolDescription;
+                    tmpAssembleToolConfigs.Add(tmpToolConfig);
+                }
             }
 
+            //拆解物体不计入选中工器具
             OperateSetting.Instance.m_ToolKitToolConfigs = tmpToolConfigs;
 
-            UIKit.OpenPanel<ToolDisplayForm>(new ToolDisplayFormData() { m_ToolConfigs = tmpToolConfigs });
-
+            switch (OperateSetting.Instance.m_CurrentOperationMode)
+            {
+                case OperationMode.Learn:
+                case OperationMode.Practice:
+                case OperationMode.Exam:
+                case OperationMode.Challenge:
+    
+                    UIKit.OpenPanel<ToolDisplayForm>(new ToolDisplayFormData() { m_ToolConfigs = tmpToolConfigs });
+                    break;
+                case OperationMode.FreeParctice:
+                case OperationMode.FreeExam:
+                    //自由模式,显示拆解物体
+                    List<ToolConfig> toolDisplayToolConfigs = new List<ToolConfig>();
+                    toolDisplayToolConfigs.AddRange(tmpToolConfigs);
+                    toolDisplayToolConfigs.AddRange(tmpAssembleToolConfigs);
+                    m_ToolConfigProxy.RefrushCurrentSelectDisassembleObjs(tmpAssembleToolConfigs);
+                    UIKit.OpenPanel<ToolDisplayForm>(new ToolDisplayFormData() { m_ToolConfigs = toolDisplayToolConfigs });
+                    break;
+                case OperationMode.None:
+                    break;
+                default:
+                    break;
+            }
             if (mData.selectAction != null)
             {
                 mData.selectAction?.Invoke();

+ 2 - 2
OperationUIFrame/OperationUIFrameV2/Scripts/UI/ToolLibraryForm/ToolLibrarySelectElement.cs

@@ -129,7 +129,7 @@ namespace QFramework
                     SetData(m_ToolConfigProxy.m_TmpToolRoomConfigInfos);
                     break;
                 case ToolLibraryType.ToolKit:
-                    SetData(m_ToolConfigProxy.GetAllToolConfigInfoFromCTRSTCIs());
+                    SetData(m_ToolConfigProxy.GetAllToolConfigInfoFromCTRSTCIs());                  
                     break;
                 default:
                     break;
@@ -176,6 +176,7 @@ namespace QFramework
 
             for (int i = 0; i < GetToolCountOfCureentPage(page); i++)
             {
+         
                 ToolConfigInfo tmpToolConfigInfo = m_ToolConfigInfos[(page - 1) * 18 + i];
 
                 toolItemPrefabs[i].gameObject.SetActive(true);
@@ -183,7 +184,6 @@ namespace QFramework
                 toolItemPrefabs[i].SetData(tmpToolConfigInfo);
 
                 ToolLibraryForm toolLibraryForm = UIKit.GetPanel<ToolLibraryForm>();
-
                 if (i == 0) toolItemPrefabs[i].SetShowToolInfo();
             }
 

+ 3 - 2
OperationUIFrame/OperationUIFrameV2/Scripts/UI/ToolLibraryForm/ToolLibrarySelectElement/ToolItemPrefab.cs

@@ -172,8 +172,9 @@ namespace QFramework
                     }
                     else
                     {
-                        ToolConfigInfo tmpToolConfigInfo = m_ToolConfigProxy.GetTooConfigInfoById(int.Parse(m_ToolConfigInfo.id));
-                        m_ToolConfigProxy.AddToolConfigInfoToCTKSTCIs(tmpToolConfigInfo);
+                        //ToolConfigInfo tmpToolConfigInfo = m_ToolConfigProxy.GetTooConfigInfoById(int.Parse(m_ToolConfigInfo.id));
+                        //m_ToolConfigProxy.AddToolConfigInfoToCTKSTCIs(tmpToolConfigInfo);
+                        m_ToolConfigProxy.AddToolConfigInfoToCTKSTCIs(m_ToolConfigInfo);
                         SetButtonState(BtnState.select);
                     }