From ef52fd6fd07508883dce4eb002acda59f0169e59 Mon Sep 17 00:00:00 2001
From: alielie <alielie@git.com>
Date: 星期四, 23 四月 2026 10:19:33 +0800
Subject: [PATCH] 优化;

---
 Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs |  105 +++++++++++++++++++++++++++++++++++++++++++++++++---
 1 files changed, 98 insertions(+), 7 deletions(-)

diff --git a/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs b/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs
index 69b5ee8..fe22156 100644
--- a/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs
+++ b/Plugin.SeqEditor/ViewModel/SeqEditorViewModel.cs
@@ -12,6 +12,7 @@
 using Plugin.SeqEditor.Util;
 using System.Collections.ObjectModel;
 using System.IO;
+using System.Runtime.InteropServices;
 using System.Windows;
 using System.Windows.Controls;
 using System.Windows.Data;
@@ -60,6 +61,9 @@
 
         private Engine engine;
         private SequenceFile sequenceFile;
+
+        public Dictionary<string, SequenceFile> cacheFiles = new Dictionary<string, SequenceFile>();
+
         private bool isLoaded;
         private ILog log;
         public SeqEditor control { get; private set; }
@@ -68,6 +72,15 @@
 
         private HashSet<string> edits = new HashSet<string>();
         public Dictionary<Sequence, ObservableCollection<StepUI>> sequenceCache { get; private set; } = new();
+
+        private HashSet<string> indexType = new HashSet<string> {
+            StepTypeStr.PassFailTest,
+            StepTypeStr.NumericLimitTest,
+            StepTypeStr.NI_MultipleNumericLimitTest,
+            StepTypeStr.StringValueTest,
+            StepTypeStr.NI_Wait,
+            StepTypeStr.Action
+    };
 
         public SeqEditorViewModel(SeqEditor control, ILog log)
         {
@@ -87,18 +100,23 @@
                 {
                     engine.ReleaseSequenceFileEx(sequenceFile);
                 }
+                foreach (var file in cacheFiles.Values)
+                {
+                    engine.ReleaseSequenceFileEx(file);
+                }
                 engine.ShutDown(true);
                 // 涓嶅姞寤舵椂浼氬脊绐梞d
-                System.Threading.Thread.Sleep(2500);
+                //System.Threading.Thread.Sleep(2500);
             }
         }
 
         private ObservableCollection<StepUI> LoadSteps(Sequence seq, string group = null)
         {
-            if (sequenceCache.ContainsKey(seq))
-            {
-                return sequenceCache[seq];
-            }
+            //if (sequenceCache.ContainsKey(seq))
+            //{
+            //    return sequenceCache[seq];
+            //}
+
             //setupSteps.Clear();
             //var steps = new ObservableCollection<StepUI>();
             //int num = seq.GetNumSteps(StepGroups.StepGroup_Setup);
@@ -231,10 +249,39 @@
                     }
                     ui.Children = LoadSteps(sunSequence, group);
                 }
+                else
+                {
+                    string seqName = po.GetValString("SeqName", 0);
+                    if (!Path.IsPathRooted(sfPath))
+                    {
+                        sfPath = Path.Combine(Path.GetDirectoryName(CurrentFilePath), sfPath);
+                    }
+                    SequenceFile diffSequence = null;
+                    try
+                    {
+                        if (cacheFiles.ContainsKey(sfPath))
+                        {
+                            diffSequence = cacheFiles[sfPath];
+                        }
+                        else if (File.Exists(sfPath))
+                        {
+                            diffSequence = engine.GetSequenceFileEx(sfPath);
+                            cacheFiles[sfPath] = diffSequence;
+                        }
+                    }
+                    catch (Exception ex)
+                    {
+                        log.Warn("Read Diff SubSequence Failed.", ex);
+                    }
+                    if (diffSequence != null)
+                    {
+                        Sequence sunSequence = diffSequence.GetSequenceByName(seqName);
+                        ui.Children = LoadSteps(sunSequence, group);
+                    }
+                }
             }
             else
             {
-                ui.CustomIndex = ++indexCache;
             }
             if (CurrentSeqUI != null)
             {
@@ -309,6 +356,10 @@
             {
                 sequenceFile?.Save(CurrentFilePath);
                 CurrentSeqUI.IsChanged = false;
+                foreach (var key in cacheFiles.Keys)
+                {
+                    cacheFiles[key]?.Save(key);
+                }
                 ToastHelper.Success(LangUtil.Get("App.SaveSuccess"));
             }
             catch (Exception ex)
@@ -332,6 +383,10 @@
                 {
                     sequenceFile.Save(sfd.FileName);
                     CurrentFilePath = sfd.FileName;
+                    foreach (var key in cacheFiles.Keys)
+                    {
+                        cacheFiles[key]?.Save(key);
+                    }
                     ToastHelper.Success(LangUtil.Get("App.SaveSuccess"));
                     CurrentSeqUI.IsChanged = false;
                 }
@@ -369,9 +424,14 @@
             if (engine != null && sequenceFile != null)
             {
                 engine.ReleaseSequenceFileEx(sequenceFile);
+                foreach (var file in cacheFiles.Values)
+                {
+                    engine.ReleaseSequenceFileEx(file);
+                }
                 sequenceFile = null;
             }
 
+            cacheFiles.Clear();
             setupSteps.Clear();
             mainSteps.Clear();
             cleanupSteps.Clear();
@@ -552,7 +612,38 @@
         {
             indexCache = 0;
             sequenceCache.Clear();
-            AllSteps = LoadSteps(CurrentSeqUI.sequence);
+            foreach (var file in cacheFiles.Values)
+            {
+                try
+                {
+                    engine.ReleaseSequenceFileEx(file);
+                    Marshal.ReleaseComObject(file);
+                }
+                catch (Exception ex)
+                {
+                    log.Error("RefreshData Release Last CacheFile Failed.", ex);
+                }
+            }
+            var converter = control.Resources["treeNumber"] as RowNumberConverter;
+            converter.Reset();
+            var temp = LoadSteps(CurrentSeqUI.sequence);
+            SetIndex(temp);
+            AllSteps = temp;
+        }
+
+        void SetIndex(IEnumerable<StepUI> datas)
+        {
+            foreach (var data in datas)
+            {
+                if (indexType.Contains(data.Type))
+                {
+                    data.CustomIndex = ++indexCache;
+                }
+                if (data.Children != null && data.Children.Count > 0)
+                {
+                    SetIndex(data.Children);
+                }
+            }
         }
 
         partial void OnAllStepsChanged(ObservableCollection<StepUI> data)

--
Gitblit v1.9.1